diff options
author | Saturneric <[email protected]> | 2021-06-04 20:37:57 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2021-06-04 20:37:57 +0000 |
commit | 9581b6799502f88acaccb14407bb1b7143c0ef71 (patch) | |
tree | 26b1a7bceeac20abbd47543291c6400bcc2890bc | |
parent | Add an operation to change the expiration date of the subkey. (diff) | |
download | GpgFrontend-9581b6799502f88acaccb14407bb1b7143c0ef71.tar.gz GpgFrontend-9581b6799502f88acaccb14407bb1b7143c0ef71.zip |
Update the verification function.
Make the format of the generated ciphertext more beautiful.
Adjust the width of the key list on the homepage.
Add fingerprint display of subkey.
Fix the compatibility issue of getKeyByFpr interface subkey.
Improve the comprehensiveness of information processing for verification results.
Signed-off-by: Saturneric <[email protected]>
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() { |