28 #include <gpgme++/context.h>
29 #include <gpgme++/key.h>
32 #include <QtGui/QLayoutItem>
34 #include <KFileDialog>
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");
41 m_signature(transfer->signature(dest)),
42 m_fileModel(transfer->fileModel())
44 setCaption(i18nc(
"Signature here is meant in cryptographic terms, so the signature of a file.",
"Signature of %1.", dest.fileName()));
47 ui.loadSignature->setIcon(KIcon(
"document-open"));
48 ui.verify->setIcon(KIcon(
"document-encrypt"));
49 setMainWidget(widget);
51 ui.information->setCloseButtonVisible(
false);
52 ui.information->setWordWrap(
true);
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()));
61 connect(m_fileModel, SIGNAL(fileFinished(KUrl)),
this, SLOT(fileFinished(KUrl)));
67 ui.information->setMessageType(KMessageWidget::Warning);
68 ui.information->setText(i18n(
"This option is not supported for the current transfer."));
74 void SignatureDlg::fileFinished(
const KUrl &file)
76 if (m_fileModel && (m_fileModel->
getUrl(m_file) == file)) {
81 void SignatureDlg::textChanged()
91 void SignatureDlg::loadSignatureClicked()
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"));
99 const bool isAsciiSig = url.fileName().endsWith(
"asc");
101 handleWidgets(isAsciiSig);
102 ui.signature->clear();
104 QFile file(url.path());
105 if (!file.open(QIODevice::ReadOnly)) {
106 kWarning(5001) <<
"Could not open file" << url;
109 if (file.size() > 1 * 1024) {
110 kWarning(5001) <<
"File is larger than 1 KiB, which is not supported.";
116 ui.signature->setText(data);
117 }
else if (m_signature) {
124 void SignatureDlg::updateButtons()
126 bool enableVerify = m_signature && m_signature->
isVerifyable();
128 enableVerify =
false;
130 ui.verify->setEnabled(enableVerify);
133 void SignatureDlg::updateData()
144 bool problem =
false;
147 information << i18n(
"You need to define a signature.");
150 if (fingerprintString.
isEmpty()) {
151 information << i18n(
"No fingerprint could be found, check if the signature is correct or verify the download.");
155 ui.fingerprint->setText(fingerprintString);
158 handleWidgets(isAsciiSig);
160 ui.signature->blockSignals(
true);
161 ui.signature->setText(signature);
162 ui.signature->blockSignals(
false);
165 ui.keyGroup->setVisible(!signature.
isEmpty());
167 const int iconSize = KIconLoader::global()->currentSize(KIconLoader::Small);
170 if (!fingerprintString.
isEmpty()) {
171 GpgME::initializeLibrary();
172 GpgME::Error err = GpgME::checkEngine(GpgME::OpenPGP);
175 kDebug(5001) <<
"OpenPGP not supported!";
176 }
else if (!context.data()) {
177 kDebug(5001) <<
"Could not create context.";
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;
184 if (key.isRevoked()) {
185 information << i18n(
"The key has been revoked.");
188 if (key.isDisabled()) {
189 information << i18n(
"The key is disabled.");
192 if (key.isInvalid()) {
193 information << i18n(
"The key is invalid.");
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();
203 ui.expirationIcon->hide();
208 const GpgME::Key::OwnerTrust ownerTrust = key.ownerTrust();
209 ui.trust->setText(OWNERTRUST.
value(ownerTrust));
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));
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));
222 case GpgME::Key::Full:
223 ui.trustIcon->setPixmap(KIcon(
"dialog-ok").pixmap(iconSize));
225 case GpgME::Key::Ultimate:
226 ui.trustIcon->setPixmap(KIcon(
"dialog-ok").pixmap(iconSize));
228 case GpgME::Key::Unknown:
229 case GpgME::Key::Undefined:
231 information.
prepend(i18n(
"Trust level of the key is unclear."));
232 ui.trustIcon->setPixmap(KIcon(
"dialog-warning").pixmap(iconSize));
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());
246 if (key.numSubkeys()) {
247 const GpgME::Subkey subKey = key.subkey(0);
249 time_t creation = subKey.creationTime();
252 ui.creation->setText(creationTime.
toString());
254 time_t expiration = subKey.expirationTime();
258 ui.expiration->setText(expirationTime.
toString());
260 ui.expiration->setText(i18n(
"Unlimited"));
271 ui.verificationIcon->hide();
272 switch (verificationStatus) {
276 ui.verificationIcon->setPixmap(KIcon(
"dialog-ok").pixmap(iconSize));
277 ui.verificationIcon->show();
278 ui.verified->setText(i18nc(
"pgp signature is verified",
"Verified"));
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."));
288 ui.verified->clear();
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.)"));
293 ui.verified->clear();
306 information << i18n(
"Feature is not supported, as KGet is not compiled with QPGME support.");
315 ui.information->setMessageType(KMessageWidget::Error);
316 }
else if (problem) {
317 ui.information->setMessageType(KMessageWidget::Warning);
320 ui.information->setMessageType(KMessageWidget::Information);
325 ui.information->setVisible(!text.
isEmpty());
326 ui.information->setText(text);
329 void SignatureDlg::verifyClicked()
336 void SignatureDlg::clearData()
338 ui.verified->clear();
339 ui.verificationIcon->clear();
343 ui.creation->clear();
344 ui.expiration->clear();
345 ui.expirationIcon->hide();
347 ui.trustIcon->clear();
348 ui.fingerprint->clear();
351 void SignatureDlg::handleWidgets(
bool isAsciiSig)
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);
360 ui.verticalLayout_2->removeItem(item);
363 }
else if (!spacer) {
364 ui.verticalLayout_2->addStretch(1);
368 #include "signaturedlg.moc"
static QString generalDestDir(bool preferXDGDownloadDir=false)
Returns a download directory.
QString toString(Qt::DateFormat format) const
QString join(const QString &separator) const
SignatureDlg(TransferHandler *transfer, const KUrl &dest, QWidget *parent=0, Qt::WFlags flags=0)
const char * constData() const
Subclass to make sure that the size of the dialog is automatically stored and restored.
SignatureType type() const
VerificationStatus status() const
void prepend(const T &value)
void setAsciiDetatchedSignature(const QString &signature)
void setSignature(const QByteArray &signature, SignatureType type)
QString fingerprint()
The fingerprint of the signature//TODO get even without verification??
bool downloadFinished(const KUrl &file)
Checks if the download for file has been finished.
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...
virtual QSpacerItem * spacerItem()
QByteArray toAscii() const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
void setTime_t(uint seconds)