aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/ui/VerifyKeyDetailBox.h2
-rw-r--r--include/ui/VerifyNotification.h4
-rw-r--r--src/MainWindow.cpp16
-rw-r--r--src/gpg/GpgContext.cpp8
-rw-r--r--src/ui/TextEdit.cpp3
-rw-r--r--src/ui/VerifyKeyDetailBox.cpp129
-rw-r--r--src/ui/VerifyNotification.cpp136
-rw-r--r--src/ui/keypair_details/KeyPairSubkeyTab.cpp10
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() {