diff options
Diffstat (limited to '')
-rw-r--r-- | include/ui/VerifyKeyDetailBox.h | 2 | ||||
-rw-r--r-- | include/ui/VerifyNotification.h | 4 | ||||
-rw-r--r-- | src/MainWindow.cpp | 16 | ||||
-rw-r--r-- | src/gpg/GpgContext.cpp | 8 | ||||
-rw-r--r-- | src/ui/TextEdit.cpp | 3 | ||||
-rw-r--r-- | src/ui/VerifyKeyDetailBox.cpp | 129 | ||||
-rw-r--r-- | src/ui/VerifyNotification.cpp | 136 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairSubkeyTab.cpp | 10 |
8 files changed, 226 insertions, 82 deletions
diff --git a/include/ui/VerifyKeyDetailBox.h b/include/ui/VerifyKeyDetailBox.h index b0452e43..66f01a8e 100644 --- a/include/ui/VerifyKeyDetailBox.h +++ b/include/ui/VerifyKeyDetailBox.h @@ -44,6 +44,8 @@ private: static QString beautifyFingerprint(QString fingerprint); + QGridLayout *createKeyInfoGrid(gpgme_signature_t &signature); + QString fpr; }; diff --git a/include/ui/VerifyNotification.h b/include/ui/VerifyNotification.h index 044e68d4..bf700c1a 100644 --- a/include/ui/VerifyNotification.h +++ b/include/ui/VerifyNotification.h @@ -46,7 +46,7 @@ typedef enum { VERIFY_ERROR_OK = 0, VERIFY_ERROR_WARN = 1, VERIFY_ERROR_CRITICAL = 2, - VERIFY_ERROR_NEUTRAL [[maybe_unused]] = 3, + VERIFY_ERROR_NEUTRAL = 3, } verify_label_status; /** @@ -110,6 +110,8 @@ private: [[maybe_unused]] QVector<QString> verifyDetailStringVector; /** Vector containing the text for labels in verifydetaildialog */ [[maybe_unused]] QVector<verify_label_status> verifyDetailStatusVector; /** Vector containing the status for labels in verifydetaildialog */ + bool printSigner(QTextStream &stream, gpgme_signature_t sign); + }; #endif // __VERIFYNOTIFICATION_H__ diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index f4d2badb..7cb08835 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -35,7 +35,15 @@ MainWindow::MainWindow() { setCentralWidget(edit); /* the list of Keys available*/ - mKeyList = new KeyList(mCtx); + mKeyList = new KeyList(mCtx, + KeyListRow::SECRET_OR_PUBLIC_KEY, + KeyListColumn::TYPE | KeyListColumn::NAME | KeyListColumn::EmailAddress | KeyListColumn::Usage | KeyListColumn::Validity, + this); + mKeyList->setFilter([](const GpgKey &key) -> bool { + if(key.revoked || key.disabled || key.expired) return false; + else return true; + }); + mKeyList->slotRefresh(); /* List of binary Attachments */ attachmentDockCreated = false; @@ -75,6 +83,7 @@ MainWindow::MainWindow() { } } edit->curTextPage()->setFocus(); + this->setMinimumSize(1200, 700); this->setWindowTitle(qApp->applicationName()); this->show(); @@ -581,9 +590,10 @@ void MainWindow::createStatusBar() { void MainWindow::createDockWindows() { /* KeyList-Dockwindow */ - keylistDock = new QDockWidget(tr("Encrypt for:"), this); + keylistDock = new QDockWidget(tr("Key ToolBox"), this); keylistDock->setObjectName("EncryptDock"); keylistDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + keylistDock->setMinimumWidth(460); addDockWidget(Qt::RightDockWidgetArea, keylistDock); keylistDock->setWidget(mKeyList); viewMenu->addAction(keylistDock->toggleViewAction()); @@ -820,7 +830,7 @@ void MainWindow::slotFind() { } void MainWindow::slotVerify() { - if (edit->tabCount() == 0 || edit->slotCurPage() == 0) { + if (edit->tabCount() == 0 || edit->slotCurPage() == nullptr) { return; } diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp index 07e0c8fa..9d1bc083 100644 --- a/src/gpg/GpgContext.cpp +++ b/src/gpg/GpgContext.cpp @@ -717,7 +717,7 @@ namespace GpgME { gpgme_sign_result_t result; gpgme_sig_mode_t mode; - if (uidList->count() == 0) { + if (uidList->isEmpty()) { QMessageBox::critical(nullptr, tr("Key Selection"), tr("No Private Key Selected")); return false; } @@ -847,6 +847,12 @@ namespace GpgME { for (const auto &key : mKeyList) { if (key.fpr == fpr) { return key; + } else { + for(auto &subkey : key.subKeys) { + if(subkey.fpr == fpr) { + return key; + } + } } } return GpgKey(nullptr); diff --git a/src/ui/TextEdit.cpp b/src/ui/TextEdit.cpp index db1f5ee5..5a9206ca 100644 --- a/src/ui/TextEdit.cpp +++ b/src/ui/TextEdit.cpp @@ -37,6 +37,9 @@ TextEdit::TextEdit() { layout->setSpacing(0); setLayout(layout); + // Front in same width + this->setFont({"Courier"}); + connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(removeTab(int))); slotNewTab(); setAcceptDrops(false); diff --git a/src/ui/VerifyKeyDetailBox.cpp b/src/ui/VerifyKeyDetailBox.cpp index 4252e10f..c393f468 100644 --- a/src/ui/VerifyKeyDetailBox.cpp +++ b/src/ui/VerifyKeyDetailBox.cpp @@ -31,7 +31,7 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(QWidget *parent, GpgME::GpgContext *ctx, this->mKeyList = keyList; this->fpr = signature->fpr; - auto *grid = new QGridLayout(); + auto *vbox = new QVBoxLayout(); switch (gpg_err_code(signature->status)) { case GPG_ERR_NO_PUBKEY: { @@ -40,51 +40,66 @@ VerifyKeyDetailBox::VerifyKeyDetailBox(QWidget *parent, GpgME::GpgContext *ctx, this->setTitle(tr("Key not present with id 0x") + signature->fpr); + auto grid = new QGridLayout(); + grid->addWidget(new QLabel(tr("Status:")), 0, 0); //grid->addWidget(new QLabel(tr("Fingerprint:")), 1, 0); grid->addWidget(new QLabel(tr("Key not present in keylist")), 0, 1); //grid->addWidget(new QLabel(signature->fpr), 1, 1); grid->addWidget(importButton, 2, 0, 2, 1); + + vbox->addLayout(grid); break; } case GPG_ERR_NO_ERROR: { - GpgKey key = mCtx->getKeyByFpr(signature->fpr); - - if(!key.good) break; - - this->setTitle(key.name); - grid->addWidget(new QLabel(tr("Name:")), 0, 0); - grid->addWidget(new QLabel(tr("EMail:")), 1, 0); - grid->addWidget(new QLabel(tr("Fingerprint:")), 2, 0); - grid->addWidget(new QLabel(tr("Status:")), 3, 0); - - grid->addWidget(new QLabel(key.name), 0, 1); - grid->addWidget(new QLabel(key.email), 1, 1); - grid->addWidget(new QLabel(beautifyFingerprint(signature->fpr)), 2, 1); - grid->addWidget(new QLabel(tr("OK")), 3, 1); - + auto gird = createKeyInfoGrid(signature); + if(gird != nullptr) { + vbox->addLayout(gird); + } + break; + } + case GPG_ERR_CERT_REVOKED: { + vbox->addWidget(new QLabel(tr("Cert Revoked"))); + auto gird = createKeyInfoGrid(signature); + if (gird != nullptr) { + vbox->addLayout(gird); + } + break; + } + case GPG_ERR_SIG_EXPIRED: { + vbox->addWidget(new QLabel(tr("Signature Expired"))); + auto gird = createKeyInfoGrid(signature); + if (gird != nullptr) { + vbox->addLayout(gird); + } + break; + } + case GPG_ERR_KEY_EXPIRED: { + vbox->addWidget(new QLabel(tr("Key Expired"))); + auto gird = createKeyInfoGrid(signature); + if (gird != nullptr) { + vbox->addLayout(gird); + } + break; + } + case GPG_ERR_GENERAL: { + vbox->addWidget(new QLabel(tr("General Error"))); + auto gird = createKeyInfoGrid(signature); + if (gird != nullptr) { + vbox->addLayout(gird); + } break; } default: { - GpgKey key = mCtx->getKeyByFpr(signature->fpr); - - if(!key.good) break; - this->setTitle(tr("Error for key with id 0x") + fpr); - grid->addWidget(new QLabel(tr("Name:")), 0, 0); - grid->addWidget(new QLabel(tr("EMail:")), 1, 0); - grid->addWidget(new QLabel(tr("Status:")), 2, 0); - grid->addWidget(new QLabel(tr("Fingerprint:")), 3, 0); - - grid->addWidget(new QLabel(key.name), 0, 1); - grid->addWidget(new QLabel(key.email), 1, 1); - grid->addWidget(new QLabel(gpg_strerror(signature->status)), 2, 1); - grid->addWidget(new QLabel(beautifyFingerprint(key.fpr)), 3, 1); - + auto gird = createKeyInfoGrid(signature); + if (gird != nullptr) { + vbox->addLayout(gird); + } break; } } - this->setLayout(grid); + this->setLayout(vbox); } void VerifyKeyDetailBox::slotImportFormKeyserver() { @@ -99,3 +114,55 @@ QString VerifyKeyDetailBox::beautifyFingerprint(QString fingerprint) { fingerprint.insert(static_cast<int>(5u * n + 4u), ' '); return fingerprint; } + +QGridLayout *VerifyKeyDetailBox::createKeyInfoGrid(gpgme_signature_t &signature) { + + auto grid = new QGridLayout(); + GpgKey key = mCtx->getKeyByFpr(signature->fpr); + + if(!key.good) return nullptr; + grid->addWidget(new QLabel(tr("Name:")), 0, 0); + grid->addWidget(new QLabel(tr("Email:")), 1, 0); + grid->addWidget(new QLabel(tr("Fingerprint:")), 2, 0); + grid->addWidget(new QLabel(tr("Valid:")), 3, 0); + grid->addWidget(new QLabel(tr("Flags:")), 4, 0); + + grid->addWidget(new QLabel(key.name), 0, 1); + grid->addWidget(new QLabel(key.email), 1, 1); + grid->addWidget(new QLabel(beautifyFingerprint(signature->fpr)), 2, 1); + + + if(signature->summary & GPGME_SIGSUM_VALID) { + grid->addWidget(new QLabel(tr("Fully Valid")), 3, 1); + } else { + grid->addWidget(new QLabel(tr("NOT Fully Valid")), 3, 1); + } + + QString flags; + QTextStream textStream(&flags); + + if(signature->summary & GPGME_SIGSUM_GREEN) { + textStream << tr("Good "); + } + if(signature->summary & GPGME_SIGSUM_RED) { + textStream << tr("Bad "); + } + if(signature->summary & GPGME_SIGSUM_SIG_EXPIRED) { + textStream << tr("Expired "); + } + if(signature->summary & GPGME_SIGSUM_KEY_MISSING) { + textStream << tr("Missing Key "); + } + if(signature->summary & GPGME_SIGSUM_KEY_REVOKED) { + textStream << tr("Revoked Key "); + } + if(signature->summary & GPGME_SIGSUM_KEY_EXPIRED) { + textStream << tr("Expired Key "); + } + if(signature->summary & GPGME_SIGSUM_CRL_MISSING) { + textStream << tr("Missing CRL "); + } + + grid->addWidget(new QLabel(tr(flags.toUtf8().constData())), 4, 1); + return grid; +} diff --git a/src/ui/VerifyNotification.cpp b/src/ui/VerifyNotification.cpp index 9283120f..cd8c705f 100644 --- a/src/ui/VerifyNotification.cpp +++ b/src/ui/VerifyNotification.cpp @@ -107,66 +107,95 @@ bool VerifyNotification::slotRefresh() { } QString verifyLabelText; + QTextStream textSteam(&verifyLabelText); bool unknownKeyFound = false; + bool canContinue = true; - while (sign) { + + textSteam << "Signed At " << QDateTime::fromTime_t(sign->timestamp).toString() << endl; + + textSteam << endl << "It Contains:" << endl; + + while (sign && canContinue) { switch (gpg_err_code(sign->status)) { - case GPG_ERR_NO_PUBKEY: { - verifyStatus = VERIFY_ERROR_WARN; - verifyLabelText.append(tr("Key not present with id 0x") + QString(sign->fpr)); - this->keysNotInList->append(sign->fpr); - unknownKeyFound = true; - break; - } - case GPG_ERR_NO_ERROR: { - GpgKey key = mCtx->getKeyByFpr(sign->fpr); - verifyLabelText.append(key.name); - if (!key.email.isEmpty()) { - verifyLabelText.append("<" + key.email + ">"); - } - break; - } - case GPG_ERR_BAD_SIGNATURE: { + case GPG_ERR_BAD_SIGNATURE: textIsSigned = 3; verifyStatus = VERIFY_ERROR_CRITICAL; - GpgKey key = mCtx->getKeyByFpr(sign->fpr); + textSteam << tr("One or More Bad Signatures.") << endl; + canContinue = false; + break; + case GPG_ERR_NO_ERROR: + textSteam << tr("A "); + if(sign->summary & GPGME_SIGSUM_GREEN) { + textSteam << tr("Good "); + } + if(sign->summary & GPGME_SIGSUM_RED) { + textSteam << tr("Bad "); + } + if(sign->summary & GPGME_SIGSUM_SIG_EXPIRED) { + textSteam << tr("Expired "); + } + if(sign->summary & GPGME_SIGSUM_KEY_MISSING) { + textSteam << tr("Missing Key's "); + } + if(sign->summary & GPGME_SIGSUM_KEY_REVOKED) { + textSteam << tr("Revoked Key's "); + } + if(sign->summary & GPGME_SIGSUM_KEY_EXPIRED) { + textSteam << tr("Expired Key's "); + } + if(sign->summary & GPGME_SIGSUM_CRL_MISSING) { + textSteam << tr("Missing CRL's "); + } - if(!key.good) break; + if(sign->summary & GPGME_SIGSUM_VALID) { + textSteam << tr("Signature Fully Valid.") << endl; + } else { + textSteam << tr("Signature NOT Fully Valid.") << endl; + } - verifyLabelText.append(key.name); - if (!key.email.isEmpty()) { - verifyLabelText.append("<" + key.email + ">"); + if(!(sign->status & GPGME_SIGSUM_KEY_MISSING)) { + unknownKeyFound = printSigner(textSteam, sign); + } else { + textSteam << tr("Key is NOT present with ID 0x") << QString(sign->fpr) << endl; } + + break; + case GPG_ERR_NO_PUBKEY: + verifyStatus = VERIFY_ERROR_WARN; + textSteam << tr("A signature could NOT be verified due to a Missing Key\n"); + unknownKeyFound = true; break; - } - default: { - //textIsSigned = 3; + case GPG_ERR_CERT_REVOKED: verifyStatus = VERIFY_ERROR_WARN; - //GpgKey key = mKeyList->getKeyByFpr(sign->fpr); - verifyLabelText.append(tr("Error for key with fingerprint ") + - GpgME::GpgContext::beautifyFingerprint(QString(sign->fpr))); + textSteam << tr("A signature is valid but the key used to verify the signature has been revoked\n"); + unknownKeyFound = printSigner(textSteam, sign); break; - } + case GPG_ERR_SIG_EXPIRED: + verifyStatus = VERIFY_ERROR_WARN; + textSteam << tr("A signature is valid but expired\n"); + unknownKeyFound = printSigner(textSteam, sign); + break; + case GPG_ERR_KEY_EXPIRED: + verifyStatus = VERIFY_ERROR_WARN; + textSteam << tr("A signature is valid but the key used to verify the signature has expired.\n"); + unknownKeyFound = printSigner(textSteam, sign); + break; + case GPG_ERR_GENERAL: + verifyStatus = VERIFY_ERROR_CRITICAL; + textSteam << tr("There was some other error which prevented the signature verification.\n"); + canContinue = false; + break; + default: + verifyStatus = VERIFY_ERROR_WARN; + textSteam << tr("Error for key with fingerprint ") << + GpgME::GpgContext::beautifyFingerprint(QString(sign->fpr)); } - verifyLabelText.append("\n"); + textSteam << endl; sign = sign->next; } - switch (textIsSigned) { - case 3: - verifyLabelText.prepend(tr("Error validating signature by: ")); - break; - - case 2: - verifyLabelText.prepend(tr("Text was completely signed by: ")); - break; - - case 1: - verifyLabelText.prepend(tr("Text was partially signed by: ")); - break; - - } // If an unknown key is found, enable the importfromkeyserveraction this->showImportAction(unknownKeyFound); @@ -178,3 +207,22 @@ bool VerifyNotification::slotRefresh() { return true; } + +bool VerifyNotification::printSigner(QTextStream &stream, gpgme_signature_t sign) { + bool keyFound = true; + stream << tr("Signed By: "); + auto key = mCtx->getKeyByFpr(sign->fpr); + if(!key.good) { + stream << "<Unknown>"; + keyFound = false; + } + stream << key.name; + if (!key.email.isEmpty()) { + stream << "<" << key.email << ">"; + } + + stream << endl; + + return keyFound; + +}
\ No newline at end of file diff --git a/src/ui/keypair_details/KeyPairSubkeyTab.cpp b/src/ui/keypair_details/KeyPairSubkeyTab.cpp index b47013ed..84042323 100644 --- a/src/ui/keypair_details/KeyPairSubkeyTab.cpp +++ b/src/ui/keypair_details/KeyPairSubkeyTab.cpp @@ -52,11 +52,13 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW subkeyDetailLayout->addWidget(new QLabel(tr("Key ID: ")), 0, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Algorithm: ")), 1, 0); - subkeyDetailLayout->addWidget(new QLabel(tr("Key size:")), 2, 0); + subkeyDetailLayout->addWidget(new QLabel(tr("Key Size:")), 2, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Usage: ")), 3, 0); - subkeyDetailLayout->addWidget(new QLabel(tr("Expires on: ")), 4, 0); + subkeyDetailLayout->addWidget(new QLabel(tr("Expires On ")), 4, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Last Update: ")), 5, 0); subkeyDetailLayout->addWidget(new QLabel(tr("Existence: ")), 6, 0); + subkeyDetailLayout->addWidget(new QLabel(tr("Fingerprint: ")), 7, 0); + keyidVarLabel = new QLabel(); keySizeVarLabel = new QLabel(); @@ -65,6 +67,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW createdVarLabel = new QLabel(); usageVarLabel = new QLabel(); masterKeyExistVarLabel = new QLabel(); + fingerPrintVarLabel = new QLabel(); subkeyDetailLayout->addWidget(keyidVarLabel, 0, 1); subkeyDetailLayout->addWidget(keySizeVarLabel, 2, 1); @@ -73,6 +76,7 @@ KeyPairSubkeyTab::KeyPairSubkeyTab(GpgME::GpgContext *ctx, const GpgKey &key, QW subkeyDetailLayout->addWidget(createdVarLabel, 5, 1); subkeyDetailLayout->addWidget(usageVarLabel, 3, 1); subkeyDetailLayout->addWidget(masterKeyExistVarLabel, 6, 1); + subkeyDetailLayout->addWidget(fingerPrintVarLabel, 7, 1); listBox->setLayout(subkeyListLayout); detailBox->setLayout(subkeyDetailLayout); @@ -213,6 +217,8 @@ void KeyPairSubkeyTab::slotRefreshSubkeyDetail() { paletteValid.setColor(masterKeyExistVarLabel->foregroundRole(), Qt::darkGreen); masterKeyExistVarLabel->setPalette(paletteValid); } + + fingerPrintVarLabel->setText(key->fpr); } void KeyPairSubkeyTab::createSubkeyOperaMenu() { |