• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • ui
signaturedlg.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 * Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
18 ***************************************************************************/
19 
20 #include "signaturedlg.h"
21 
22 #include "core/kget.h"
23 #include "core/filemodel.h"
24 #include "core/transferhandler.h"
25 #include "core/signature.h"
26 
27 #ifdef HAVE_QGPGME
28 #include <gpgme++/context.h>
29 #include <gpgme++/key.h>
30 #endif
31 
32 #include <QtGui/QLayoutItem>
33 
34 #include <KFileDialog>
35 #include <KLocale>
36 
37 const QStringList SignatureDlg::OWNERTRUST = QStringList() << i18nc("trust level", "Unknown") << i18nc("trust level", "Undefined") << i18nc("trust level", "Never") << i18nc("trust level", "Marginal") << i18nc("trust level", "Full") << i18nc("trust level", "Ultimate");
38 
39 SignatureDlg::SignatureDlg(TransferHandler *transfer, const KUrl &dest, QWidget *parent, Qt::WFlags flags)
40  : KGetSaveSizeDialog("SignatureDlg", parent, flags),
41  m_signature(transfer->signature(dest)),
42  m_fileModel(transfer->fileModel())
43 {
44  setCaption(i18nc("Signature here is meant in cryptographic terms, so the signature of a file.", "Signature of %1.", dest.fileName()));
45  QWidget *widget = new QWidget(this);
46  ui.setupUi(widget);
47  ui.loadSignature->setIcon(KIcon("document-open"));
48  ui.verify->setIcon(KIcon("document-encrypt"));
49  setMainWidget(widget);
50 
51  ui.information->setCloseButtonVisible(false);
52  ui.information->setWordWrap(true);
53  if (m_signature) {
54  connect(ui.loadSignature, SIGNAL(clicked(bool)), this, SLOT(loadSignatureClicked()));
55  connect(ui.verify, SIGNAL(clicked()), this, SLOT(verifyClicked()));
56  connect(ui.signature, SIGNAL(textChanged()), this, SLOT(textChanged()));
57  connect(m_signature, SIGNAL(verified(int)), this, SLOT(updateData()));
58 
59  if (m_fileModel) {
60  m_file = m_fileModel->index(dest, FileItem::File);
61  connect(m_fileModel, SIGNAL(fileFinished(KUrl)), this, SLOT(fileFinished(KUrl)));
62  }
63 
64  updateData();
65  updateButtons();
66  } else {
67  ui.information->setMessageType(KMessageWidget::Warning);
68  ui.information->setText(i18n("This option is not supported for the current transfer."));
69  ui.sigGroup->hide();
70  ui.keyGroup->hide();
71  }
72 }
73 
74 void SignatureDlg::fileFinished(const KUrl &file)
75 {
76  if (m_fileModel && (m_fileModel->getUrl(m_file) == file)) {
77  updateButtons();
78  }
79 }
80 
81 void SignatureDlg::textChanged()
82 {
83  if (m_signature) {
84  m_signature->setAsciiDetatchedSignature(ui.signature->toPlainText());
85 
86  clearData();
87  updateButtons();
88  }
89 }
90 
91 void SignatureDlg::loadSignatureClicked()
92 {
93  const KUrl url = KFileDialog::getOpenUrl(KGet::generalDestDir(), "*.asc|" + i18n("Detached OpenPGP ASCII signature (*.asc)") + '\n' +
94  "*.sig|" + i18n("Detached OpenPGP binary signature (*.sig)"), this, i18n("Load Signature File"));
95  if (url.isEmpty()) {
96  return;
97  }
98 
99  const bool isAsciiSig = url.fileName().endsWith("asc");
100  clearData();
101  handleWidgets(isAsciiSig);
102  ui.signature->clear();
103 
104  QFile file(url.path());
105  if (!file.open(QIODevice::ReadOnly)) {
106  kWarning(5001) << "Could not open file" << url;
107  return;
108  }
109  if (file.size() > 1 * 1024) {
110  kWarning(5001) << "File is larger than 1 KiB, which is not supported.";
111  return;
112  }
113 
114  const QByteArray data = file.readAll();
115  if (isAsciiSig) {
116  ui.signature->setText(data);
117  } else if (m_signature) {
118  m_signature->setSignature(data, Signature::BinaryDetached);
119  clearData();
120  updateButtons();
121  }
122 }
123 
124 void SignatureDlg::updateButtons()
125 {
126  bool enableVerify = m_signature && m_signature->isVerifyable();
127  if (!m_fileModel || !m_fileModel->downloadFinished(m_fileModel->getUrl(m_file))) {
128  enableVerify = false;
129  }
130  ui.verify->setEnabled(enableVerify);
131 }
132 
133 void SignatureDlg::updateData()
134 {
135  if (!m_signature) {
136  return;
137  }
138 
139  const QString fingerprintString = m_signature->fingerprint();
140  const QByteArray signature = m_signature->signature();
141 
142  QStringList information;
143 
144  bool problem = false;
145  bool error = false;
146  if (signature.isEmpty()) {
147  information << i18n("You need to define a signature.");
148  problem = true;
149  }
150  if (fingerprintString.isEmpty()) {
151  information << i18n("No fingerprint could be found, check if the signature is correct or verify the download.");//TODO get fingerprint from signature!
152  problem = true;
153  }
154 
155  ui.fingerprint->setText(fingerprintString);
156 
157  const bool isAsciiSig = (m_signature->type() != Signature::BinaryDetached);
158  handleWidgets(isAsciiSig);
159  if (isAsciiSig) {
160  ui.signature->blockSignals(true);
161  ui.signature->setText(signature);
162  ui.signature->blockSignals(false);
163  }
164 
165  ui.keyGroup->setVisible(!signature.isEmpty());
166 
167  const int iconSize = KIconLoader::global()->currentSize(KIconLoader::Small);
168 
169 #ifdef HAVE_QGPGME
170  if (!fingerprintString.isEmpty()) {
171  GpgME::initializeLibrary();
172  GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP);
173  QScopedPointer<GpgME::Context> context(GpgME::Context::createForProtocol(GpgME::OpenPGP));
174  if (err) {
175  kDebug(5001) << "OpenPGP not supported!";
176  } else if (!context.data()) {
177  kDebug(5001) << "Could not create context.";
178  } else {
179  QByteArray fingerprint = fingerprintString.toAscii();
180  const GpgME::Key key = context->key(fingerprint.constData(), err);
181  if (err || key.isNull() || !key.numUserIDs() || !key.numSubkeys()) {
182  kDebug(5001) << "There was an error while loading the key:" << err;
183  } else {
184  if (key.isRevoked()) {
185  information << i18n("The key has been revoked.");
186  problem = true;
187  }
188  if (key.isDisabled()) {
189  information << i18n("The key is disabled.");
190  problem = true;
191  }
192  if (key.isInvalid()) {
193  information << i18n("The key is invalid.");
194  error = true;
195  }
196  ui.expirationIcon->clear();
197  if (key.isExpired()) {
198  information << i18n("The key is expired.");
199  ui.expirationIcon->setPixmap(KIcon("dialog-warning").pixmap(iconSize));
200  ui.expirationIcon->show();
201  problem = true;
202  } else {
203  ui.expirationIcon->hide();
204  }
205 
206 
207  //handle the trust of the key
208  const GpgME::Key::OwnerTrust ownerTrust = key.ownerTrust();
209  ui.trust->setText(OWNERTRUST.value(ownerTrust));
210 
211  switch (ownerTrust) {
212  case GpgME::Key::Never:
213  information.prepend(i18n("The key is not to be trusted."));
214  ui.trustIcon->setPixmap(KIcon("dialog-error").pixmap(iconSize));
215  error = true;
216  break;
217  case GpgME::Key::Marginal:
218  information.prepend(i18n("The key is to be trusted marginally."));
219  ui.trustIcon->setPixmap(KIcon("dialog-warning").pixmap(iconSize));
220  problem = true;
221  break;
222  case GpgME::Key::Full:
223  ui.trustIcon->setPixmap(KIcon("dialog-ok").pixmap(iconSize));
224  break;
225  case GpgME::Key::Ultimate:
226  ui.trustIcon->setPixmap(KIcon("dialog-ok").pixmap(iconSize));
227  break;
228  case GpgME::Key::Unknown:
229  case GpgME::Key::Undefined:
230  default:
231  information.prepend(i18n("Trust level of the key is unclear."));
232  ui.trustIcon->setPixmap(KIcon("dialog-warning").pixmap(iconSize));
233  problem = true;
234  break;
235  }
236 
237  //issuer, issuer mail and comment
238  if (key.numUserIDs()) {
239  const GpgME::UserID userID = key.userID(0);
240  ui.issuer->setText(userID.name());
241  ui.comment->setText(userID.comment());
242  ui.email->setText(userID.email());
243  }
244 
245  //key creation/expiration-time
246  if (key.numSubkeys()) {
247  const GpgME::Subkey subKey = key.subkey(0);
248 
249  time_t creation = subKey.creationTime();
250  QDateTime creationTime;
251  creationTime.setTime_t(creation);
252  ui.creation->setText(creationTime.toString());
253 
254  time_t expiration = subKey.expirationTime();
255  if (expiration) {
256  QDateTime expirationTime;
257  expirationTime.setTime_t(expiration);
258  ui.expiration->setText(expirationTime.toString());
259  } else {
260  ui.expiration->setText(i18n("Unlimited"));
261  }
262  }
263  }
264  }
265  }
266 #endif //HAVE_QGPGME
267 
268  const Signature::VerificationStatus verificationStatus = m_signature->status();
269 
270  //display the verification status
271  ui.verificationIcon->hide();
272  switch (verificationStatus) {
273  case Signature::Verified:
274  case Signature::VerifiedInformation:
275  case Signature::VerifiedWarning:
276  ui.verificationIcon->setPixmap(KIcon("dialog-ok").pixmap(iconSize));
277  ui.verificationIcon->show();
278  ui.verified->setText(i18nc("pgp signature is verified", "Verified"));
279  break;
280  case Signature::NotVerified:
281  ui.verified->setText(i18nc("pgp signature is not verified", "Failed"));
282  ui.verificationIcon->setPixmap(KIcon("dialog-error").pixmap(iconSize));
283  ui.verificationIcon->show();
284  information.prepend(i18n("Caution: Verification failed. Either you entered the wrong signature, or the data has been modified."));
285  error = true;
286  break;
287  case Signature::NotWorked://TODO downloading state? --> currently downloading
288  ui.verified->clear();//TODO
289  information.prepend(i18n("Verification not possible. Check the entered data, whether gpg-agent is running, or whether you have an Internet connection (for retrieving keys.)"));
290  problem = true;
291  break;
292  case Signature::NoResult:
293  ui.verified->clear();//TODO
294  break;
295  }
296 
297  if (verificationStatus == Signature::VerifiedWarning) {
298  problem = true;
299  }
300 
301 #ifndef HAVE_QGPGME
302  ui.sigGroup->hide();
303  ui.keyGroup->hide();
304  ui.verify->hide();
305  information.clear();
306  information << i18n("Feature is not supported, as KGet is not compiled with QPGME support.");
307  resize(350, 200);
308 #endif //HAVE_QPGME
309 
310  //TODO more messages, e.g. from result etc.
311  //TODO enter more error cases
312 
313  //change the icon of the titlewidget
314  if (error) {
315  ui.information->setMessageType(KMessageWidget::Error);
316  } else if (problem) {
317  ui.information->setMessageType(KMessageWidget::Warning);
318  } else {
319  if (verificationStatus != Signature::Verified) {
320  ui.information->setMessageType(KMessageWidget::Information);
321  }
322  }
323 
324  const QString text = information.join(" ");
325  ui.information->setVisible(!text.isEmpty());
326  ui.information->setText(text);
327 }
328 
329 void SignatureDlg::verifyClicked()
330 {
331  clearData();
332 
333  m_signature->verify();
334 }
335 
336 void SignatureDlg::clearData()
337 {
338  ui.verified->clear();
339  ui.verificationIcon->clear();
340  ui.issuer->clear();
341  ui.email->clear();
342  ui.comment->clear();
343  ui.creation->clear();
344  ui.expiration->clear();
345  ui.expirationIcon->hide();
346  ui.trust->clear();
347  ui.trustIcon->clear();
348  ui.fingerprint->clear();
349 }
350 
351 void SignatureDlg::handleWidgets(bool isAsciiSig)
352 {
353  ui.asciiLabel->setVisible(isAsciiSig);
354  ui.signature->setVisible(isAsciiSig);
355  ui.binaryLabel->setVisible(!isAsciiSig);
356  QLayoutItem *item = ui.verticalLayout_2->itemAt(ui.verticalLayout_2->count() - 1);
357  QSpacerItem *spacer = item->spacerItem();
358  if (isAsciiSig) {
359  if (spacer) {
360  ui.verticalLayout_2->removeItem(item);
361  delete item;
362  }
363  } else if (!spacer) {
364  ui.verticalLayout_2->addStretch(1);
365  }
366 }
367 
368 #include "signaturedlg.moc"
KGet::generalDestDir
static QString generalDestDir(bool preferXDGDownloadDir=false)
Returns a download directory.
Definition: kget.cpp:945
FileItem::File
Definition: filemodel.h:45
Signature::isVerifyable
bool isVerifyable()
Definition: signature.cpp:187
TransferHandler
Class TransferHandler:
Definition: transferhandler.h:48
Signature::verify
void verify()
Definition: signature.cpp:196
QWidget
Signature::BinaryDetached
Definition: signature.h:54
Signature::VerifiedInformation
Definition: signature.h:63
Signature::Verified
Definition: signature.h:62
Signature::NotWorked
Definition: signature.h:60
SignatureDlg::SignatureDlg
SignatureDlg(TransferHandler *transfer, const KUrl &dest, QWidget *parent=0, Qt::WFlags flags=0)
Definition: signaturedlg.cpp:39
Signature::NoResult
Definition: signature.h:59
Signature::NotVerified
Definition: signature.h:61
signature.h
Signature::VerifiedWarning
Definition: signature.h:64
KGetSaveSizeDialog
Subclass to make sure that the size of the dialog is automatically stored and restored.
Definition: basedialog.h:32
transferhandler.h
Signature::type
SignatureType type() const
Definition: signature.cpp:167
kget.h
Signature::status
VerificationStatus status() const
Definition: signature.cpp:124
Signature::setAsciiDetatchedSignature
void setAsciiDetatchedSignature(const QString &signature)
Definition: signature.cpp:141
signaturedlg.h
Signature::setSignature
void setSignature(const QByteArray &signature, SignatureType type)
Definition: signature.cpp:146
Signature::fingerprint
QString fingerprint()
The fingerprint of the signature//TODO get even without verification??
Definition: signature.cpp:172
FileModel::downloadFinished
bool downloadFinished(const KUrl &file)
Checks if the download for file has been finished.
Definition: filemodel.cpp:622
Signature::signature
QByteArray signature()
Definition: signature.cpp:136
FileModel::getUrl
KUrl getUrl(const QModelIndex &index)
The url on the filesystem (no check if the file exists yet!) of index, it can be a folder or file...
Definition: filemodel.cpp:544
Signature::VerificationStatus
VerificationStatus
Definition: signature.h:57
FileModel::index
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: filemodel.cpp:436
filemodel.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal