aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2021-06-06 19:41:06 +0000
committerSaturneric <[email protected]>2021-06-06 19:41:06 +0000
commit7191b3bb0caf9d74648820b094a8af63f618e8a8 (patch)
treea94bac8131da0128b562f0d874bfbdfa271214c8 /src
parentAdjust and improve the detailed interface of the verification information res... (diff)
downloadGpgFrontend-7191b3bb0caf9d74648820b094a8af63f618e8a8.tar.gz
GpgFrontend-7191b3bb0caf9d74648820b094a8af63f618e8a8.zip
Add encryption and signature function.
Adjust and improve the dashboard control. Modify and adjust GpgSignature. Separate Verify result processing code in code structure. Add additional operation toolbar function. Adjust and optimize code structure. Signed-off-by: Saturneric <[email protected]>
Diffstat (limited to '')
-rw-r--r--src/MainWindow.cpp47
-rw-r--r--src/gpg/CMakeLists.txt1
-rw-r--r--src/gpg/GpgContext.cpp8
-rw-r--r--src/gpg/GpgKey.cpp2
-rw-r--r--src/gpg/GpgKeySignature.cpp (renamed from src/gpg/Signature.cpp)4
-rw-r--r--src/gpg/GpgUID.cpp (renamed from src/gpg/UID.cpp)6
-rw-r--r--src/gpg/result_analyse/VerifyResultAnalyse.cpp142
-rwxr-xr-xsrc/ui/FileEncryptionDialog.cpp5
-rw-r--r--src/ui/VerifyDetailsDialog.cpp24
-rw-r--r--src/ui/VerifyNotification.cpp231
-rw-r--r--src/ui/keypair_details/KeyNewUIDDialog.cpp2
-rw-r--r--src/ui/keypair_details/KeyPairUIDTab.cpp26
-rw-r--r--src/ui/keypair_details/KeyUIDSignDialog.cpp2
-rw-r--r--src/ui/widgets/InfoBoardWidget.cpp126
14 files changed, 337 insertions, 289 deletions
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index cd65c18f..f173fa81 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -45,6 +45,8 @@ MainWindow::MainWindow() {
});
mKeyList->slotRefresh();
+ infoBoard = new InfoBoardWidget(this, mCtx, mKeyList);
+
/* List of binary Attachments */
attachmentDockCreated = false;
@@ -606,6 +608,14 @@ void MainWindow::createDockWindows() {
keylistDock->setWidget(mKeyList);
viewMenu->addAction(keylistDock->toggleViewAction());
+ infoBoardDock = new QDockWidget(tr("Information Board"), this);
+ infoBoardDock->setObjectName("Information Board");
+ infoBoardDock->setAllowedAreas(Qt::BottomDockWidgetArea);
+ addDockWidget(Qt::BottomDockWidgetArea, infoBoardDock);
+ infoBoardDock->setWidget(infoBoard);
+ infoBoardDock->widget()->layout()->setContentsMargins(0,0,0,0);
+ viewMenu->addAction(infoBoardDock->toggleViewAction());
+
/* Attachments-Dockwindow
*/
if (settings.value("mime/parseMime").toBool()) {
@@ -621,7 +631,7 @@ void MainWindow::createAttachmentDock() {
attachmentDock = new QDockWidget(tr("Attached files:"), this);
attachmentDock->setObjectName("AttachmentDock");
attachmentDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
- addDockWidget(Qt::BottomDockWidgetArea, attachmentDock);
+ addDockWidget(Qt::LeftDockWidgetArea, attachmentDock);
attachmentDock->setWidget(mAttachments);
// hide till attachment is decrypted
viewMenu->addAction(attachmentDock->toggleViewAction());
@@ -857,25 +867,40 @@ void MainWindow::slotVerify() {
}
// At first close verifynotification, if existing
- edit->slotCurPage()->closeNoteByClass("verifyNotification");
+ // edit->slotCurPage()->closeNoteByClass("infoBoard");
- // create new verfiy notification
- auto *vn = new VerifyNotification(this, mCtx, mKeyList, edit->curTextPage());
+ // If an unknown key is found, enable the importfromkeyserveraction
- // if signing information is found, show the notification, otherwise close it
- if (vn->slotRefresh()) {
- edit->slotCurPage()->showNotificationWidget(vn, "verifyNotification");
- } else {
- QMessageBox::warning(nullptr, "Signature NOT Found", "The signature was not found in the target text");
- vn->close();
+ QByteArray text = edit->curTextPage()->toPlainText().toUtf8();
+ GpgME::GpgContext::preventNoDataErr(&text);
+
+ gpgme_signature_t sign = mCtx->verify(&text);
+
+ auto verify = new VerifyResultAnalyse(mCtx, sign);
+ infoBoard->associateTextEdit(edit->curTextPage());
+
+ auto &reportText = verify->getResultReport();
+ if(verify->getStatus() < 0)
+ infoBoard->slotRefresh(reportText, INFO_ERROR_CRITICAL);
+ else if(verify->getStatus() > 0)
+ infoBoard->slotRefresh(reportText, INFO_ERROR_OK);
+ else
+ infoBoard->slotRefresh(reportText, INFO_ERROR_WARN);
+
+ if(verify->getStatus() >= 0) {
+ infoBoard->resetOptionActionsMenu();
+ infoBoard->addOptionalAction("Show Verify Details", [this, sign]() {
+ VerifyDetailsDialog(this, mCtx, mKeyList, sign);
+ });
}
+
}
/*
* Append the selected (not checked!) Key(s) To Textedit
*/
void MainWindow::slotAppendSelectedKeys() {
- if (edit->tabCount() == 0 || edit->slotCurPage() == 0) {
+ if (edit->tabCount() == 0 || edit->slotCurPage() == nullptr) {
return;
}
diff --git a/src/gpg/CMakeLists.txt b/src/gpg/CMakeLists.txt
index 0c164844..3359f662 100644
--- a/src/gpg/CMakeLists.txt
+++ b/src/gpg/CMakeLists.txt
@@ -1,3 +1,4 @@
+aux_source_directory(./result_analyse GPG_SOURCE)
aux_source_directory(. GPG_SOURCE)
add_library(gpg STATIC ${GPG_SOURCE})
diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp
index 492aef83..be6e19d4 100644
--- a/src/gpg/GpgContext.cpp
+++ b/src/gpg/GpgContext.cpp
@@ -938,7 +938,7 @@ namespace GpgME {
}
}
- bool GpgContext::addUID(const GpgKey &key, const UID &uid) {
+ bool GpgContext::addUID(const GpgKey &key, const GpgUID &uid) {
QString userid = QString("%1 (%3) <%2>").arg(uid.name, uid.email, uid.comment);
auto gpgmeError = gpgme_op_adduid(mCtx, key.key_refer, userid.toUtf8().constData(), 0);
if(gpgmeError == GPG_ERR_NO_ERROR) {
@@ -952,7 +952,7 @@ namespace GpgME {
}
- bool GpgContext::revUID(const GpgKey &key, const UID &uid) {
+ bool GpgContext::revUID(const GpgKey &key, const GpgUID &uid) {
auto gpgmeError = gpgme_op_revuid(mCtx, key.key_refer, uid.uid.toUtf8().constData(), 0);
if(gpgmeError == GPG_ERR_NO_ERROR) {
emit signalKeyUpdated(key.id);
@@ -964,7 +964,7 @@ namespace GpgME {
}
}
- bool GpgContext::setPrimaryUID(const GpgKey &key, const UID &uid) {
+ bool GpgContext::setPrimaryUID(const GpgKey &key, const GpgUID &uid) {
auto gpgmeError = gpgme_op_set_uid_flag(mCtx, key.key_refer,
uid.uid.toUtf8().constData(), "primary", nullptr);
if(gpgmeError == GPG_ERR_NO_ERROR) {
@@ -977,7 +977,7 @@ namespace GpgME {
}
}
- bool GpgContext::revSign(const GpgKey &key, const Signature &signature) {
+ bool GpgContext::revSign(const GpgKey &key, const GpgKeySignature &signature) {
auto signing_key = getKeyById(signature.keyid);
diff --git a/src/gpg/GpgKey.cpp b/src/gpg/GpgKey.cpp
index df4b05ca..cd62fc5d 100644
--- a/src/gpg/GpgKey.cpp
+++ b/src/gpg/GpgKey.cpp
@@ -72,7 +72,7 @@ void GpgKey::parse(gpgme_key_t key) {
auto uid = key->uids;
while (uid != nullptr) {
- uids.push_back(UID(uid));
+ uids.push_back(GpgUID(uid));
uid = uid->next;
}
diff --git a/src/gpg/Signature.cpp b/src/gpg/GpgKeySignature.cpp
index 079f8a05..142d1550 100644
--- a/src/gpg/Signature.cpp
+++ b/src/gpg/GpgKeySignature.cpp
@@ -22,9 +22,9 @@
*
*/
-#include "gpg/Signature.h"
+#include "gpg/GpgKeySignature.h"
-Signature::Signature(gpgme_key_sig_t key_sig) :
+GpgKeySignature::GpgKeySignature(gpgme_key_sig_t key_sig) :
revoked(key_sig->revoked), expired(key_sig->expired), invalid(key_sig->invalid),
exportable(key_sig->exportable), status(key_sig->status),
keyid(key_sig->keyid), pubkey_algo(gpgme_pubkey_algo_name(key_sig->pubkey_algo)),
diff --git a/src/gpg/UID.cpp b/src/gpg/GpgUID.cpp
index a4e6f342..f8f7e8fa 100644
--- a/src/gpg/UID.cpp
+++ b/src/gpg/GpgUID.cpp
@@ -2,16 +2,16 @@
// Created by eric on 2021/5/22.
//
-#include "gpg/UID.h"
+#include "gpg/GpgUID.h"
-UID::UID(gpgme_user_id_t user_id) :
+GpgUID::GpgUID(gpgme_user_id_t user_id) :
uid(user_id->uid), name(user_id->name), email(user_id->email), comment(user_id->comment),
revoked(user_id->revoked), invalid(user_id->invalid) {
auto sig = user_id->signatures;
while (sig != nullptr) {
- signatures.push_back(Signature(sig));
+ signatures.push_back(GpgKeySignature(sig));
sig = sig->next;
}
diff --git a/src/gpg/result_analyse/VerifyResultAnalyse.cpp b/src/gpg/result_analyse/VerifyResultAnalyse.cpp
new file mode 100644
index 00000000..44f4a3af
--- /dev/null
+++ b/src/gpg/result_analyse/VerifyResultAnalyse.cpp
@@ -0,0 +1,142 @@
+//
+// Created by eric on 2021/6/7.
+//
+
+#include "GpgFrontend.h"
+#include "gpg/result_analyse/VerifyResultAnalyse.h"
+
+VerifyResultAnalyse::VerifyResultAnalyse(GpgME::GpgContext *ctx, gpgme_signature_t sign) : mCtx(ctx) {
+
+ textSteam << "Verify Report: " << endl;
+
+ if (sign == nullptr){
+ textSteam << "> Not Signature Found" << endl;
+ status = -1;
+ return;
+ }
+
+
+ textSteam << "> It was Signed ON " << QDateTime::fromTime_t(sign->timestamp).toString() << endl;
+
+ textSteam << endl << "> It Contains:" << endl;
+
+ bool canContinue = true;
+
+ while (sign && canContinue) {
+
+ switch (gpg_err_code(sign->status)) {
+ case GPG_ERR_BAD_SIGNATURE:
+ textSteam << QApplication::tr("One or More Bad Signatures.") << endl;
+ canContinue = false;
+ setStatus(-1);
+ break;
+ case GPG_ERR_NO_ERROR:
+ textSteam << QApplication::tr("A ");
+ if(sign->summary & GPGME_SIGSUM_GREEN) {
+ textSteam << QApplication::tr("Good ");
+ }
+ if(sign->summary & GPGME_SIGSUM_RED) {
+ textSteam << QApplication::tr("Bad ");
+ }
+ if(sign->summary & GPGME_SIGSUM_SIG_EXPIRED) {
+ textSteam << QApplication::tr("Expired ");
+ }
+ if(sign->summary & GPGME_SIGSUM_KEY_MISSING) {
+ textSteam << QApplication::tr("Missing Key's ");
+ }
+ if(sign->summary & GPGME_SIGSUM_KEY_REVOKED) {
+ textSteam << QApplication::tr("Revoked Key's ");
+ }
+ if(sign->summary & GPGME_SIGSUM_KEY_EXPIRED) {
+ textSteam << QApplication::tr("Expired Key's ");
+ }
+ if(sign->summary & GPGME_SIGSUM_CRL_MISSING) {
+ textSteam << QApplication::tr("Missing CRL's ");
+ }
+
+ if(sign->summary & GPGME_SIGSUM_VALID) {
+ textSteam << QApplication::tr("Signature Fully Valid.") << endl;
+ } else {
+ textSteam << QApplication::tr("Signature NOT Fully Valid.") << endl;
+ }
+
+ if(!(sign->status & GPGME_SIGSUM_KEY_MISSING)) {
+ if(!printSigner(textSteam, sign)) {
+ setStatus(0);
+ }
+ } else {
+ textSteam << QApplication::tr("Key is NOT present with ID 0x") << QString(sign->fpr) << endl;
+ }
+
+ setStatus(1);
+
+ break;
+ case GPG_ERR_NO_PUBKEY:
+ textSteam << QApplication::tr("A signature could NOT be verified due to a Missing Key\n");
+ setStatus(-1);
+ break;
+ case GPG_ERR_CERT_REVOKED:
+ textSteam << QApplication::tr("A signature is valid but the key used to verify the signature has been revoked\n");
+ if(!printSigner(textSteam, sign)) {
+ setStatus(0);
+ }
+ setStatus(-1);
+ break;
+ case GPG_ERR_SIG_EXPIRED:
+ textSteam << QApplication::tr("A signature is valid but expired\n");
+ if(!printSigner(textSteam, sign)) {
+ setStatus(0);
+ }
+ setStatus(-1);
+ break;
+ case GPG_ERR_KEY_EXPIRED:
+ textSteam << QApplication::tr("A signature is valid but the key used to verify the signature has expired.\n");
+ if(!printSigner(textSteam, sign)) {
+ setStatus(0);
+ }
+ break;
+ case GPG_ERR_GENERAL:
+ textSteam << QApplication::tr("There was some other error which prevented the signature verification.\n");
+ status = -1;
+ canContinue = false;
+ break;
+ default:
+ textSteam << QApplication::tr("Error for key with fingerprint ") <<
+ GpgME::GpgContext::beautifyFingerprint(QString(sign->fpr));
+ setStatus(-1);
+ }
+ textSteam << endl;
+ sign = sign->next;
+ }
+}
+
+bool VerifyResultAnalyse::printSigner(QTextStream &stream, gpgme_signature_t sign) {
+ bool keyFound = true;
+ stream << QApplication::tr("Signed By: ");
+ auto key = mCtx->getKeyByFpr(sign->fpr);
+ if(!key.good) {
+ stream << "<Unknown>";
+ setStatus(0);
+ keyFound = false;
+ }
+ stream << key.name;
+ if (!key.email.isEmpty()) {
+ stream << "<" << key.email << ">";
+ }
+ stream << endl;
+ return keyFound;
+
+}
+
+const QString &VerifyResultAnalyse::getResultReport() const{
+ return verifyLabelText;
+}
+
+int VerifyResultAnalyse::getStatus() const {
+ return status;
+}
+
+void VerifyResultAnalyse::setStatus(int mStatus) {
+ if(mStatus < status)
+ status = mStatus;
+}
diff --git a/src/ui/FileEncryptionDialog.cpp b/src/ui/FileEncryptionDialog.cpp
index d4c0d6d1..813b9278 100755
--- a/src/ui/FileEncryptionDialog.cpp
+++ b/src/ui/FileEncryptionDialog.cpp
@@ -222,8 +222,9 @@ void FileEncryptionDialog::slotExecuteAction() {
signFileEdit->setStyleSheet("QLineEdit { background: yellow }");
return;
}
- QByteArray signBuffer = signfile.readAll();
- new VerifyDetailsDialog(this, mCtx, mKeyList, &inBuffer, &signBuffer);
+ auto signBuffer = signfile.readAll();
+ gpgme_signature_t sign = mCtx->verify(&inBuffer, &signBuffer);
+ new VerifyDetailsDialog(this, mCtx, mKeyList, sign);
return;
}
diff --git a/src/ui/VerifyDetailsDialog.cpp b/src/ui/VerifyDetailsDialog.cpp
index 27306280..fe193aa0 100644
--- a/src/ui/VerifyDetailsDialog.cpp
+++ b/src/ui/VerifyDetailsDialog.cpp
@@ -25,28 +25,22 @@
#include "ui/VerifyDetailsDialog.h"
VerifyDetailsDialog::VerifyDetailsDialog(QWidget *parent, GpgME::GpgContext *ctx, KeyList *keyList,
- QByteArray *inputData, QByteArray *inputSignature) :
- QDialog(parent) {
- mCtx = ctx;
- mKeyList = keyList;
- //mTextpage = edit;
- mInputData = inputData;
- mInputSignature = inputSignature;
+ gpgme_signature_t signature) :
+ QDialog(parent), mCtx(ctx), mKeyList(keyList), sign(signature) {
+
this->setWindowTitle(tr("Signature Details"));
- connect(mCtx, SIGNAL(keyDBChanged()), this, SLOT(slotRefresh()));
+ connect(mCtx, SIGNAL(signalKeyInfoChanged()), this, SLOT(slotRefresh()));
mainLayout = new QHBoxLayout();
this->setLayout(mainLayout);
- mVbox = new QWidget();
slotRefresh();
this->exec();
}
void VerifyDetailsDialog::slotRefresh() {
- mVbox->close();
mVbox = new QWidget();
auto *mVboxLayout = new QVBoxLayout(mVbox);
@@ -56,16 +50,6 @@ void VerifyDetailsDialog::slotRefresh() {
buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
- // Get signature information of current text
- //QByteArray text = mTextpage->toPlainText().toUtf8();
- //mCtx->preventNoDataErr(&text);
- gpgme_signature_t sign;
- if (mInputSignature != nullptr) {
- sign = mCtx->verify(mInputData, mInputSignature);
- } else {
- sign = mCtx->verify(mInputData);
- }
-
if (sign == nullptr) {
mVboxLayout->addWidget(new QLabel(tr("No valid input found")));
mVboxLayout->addWidget(buttonBox);
diff --git a/src/ui/VerifyNotification.cpp b/src/ui/VerifyNotification.cpp
deleted file mode 100644
index 8b79f16b..00000000
--- a/src/ui/VerifyNotification.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * This file is part of GPGFrontend.
- *
- * GPGFrontend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Foobar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar. If not, see <https://www.gnu.org/licenses/>.
- *
- * The initial version of the source code is inherited from gpg4usb-team.
- * Their source code version also complies with GNU General Public License.
- *
- * The source code version of this software was modified and released
- * by Saturneric<[email protected]> starting on May 12, 2021.
- *
- */
-
-#include "ui/VerifyNotification.h"
-
-VerifyNotification::VerifyNotification(QWidget *parent, GpgME::GpgContext *ctx, KeyList *keyList, QTextEdit *edit) :
- QWidget(parent), mCtx(ctx), mKeyList(keyList), mTextpage(edit) {
-
- verifyLabel = new QLabel(this);
- infoBoard = new QTextEdit(this);
- infoBoard->setReadOnly(true);
- infoBoard->setFixedHeight(160);
-
- this->setFixedHeight(170);
-
- connect(mCtx, SIGNAL(signalKeyInfoChanged()), this, SLOT(slotRefresh()));
- connect(edit, SIGNAL(textChanged()), this, SLOT(close()));
-
- importFromKeyserverAct = new QAction(tr("Import missing key from Keyserver"), this);
- connect(importFromKeyserverAct, SIGNAL(triggered()), this, SLOT(slotImportFromKeyserver()));
-
- showVerifyDetailsAct = new QAction(tr("Show detailed verify information"), this);
- connect(showVerifyDetailsAct, SIGNAL(triggered()), this, SLOT(slotShowVerifyDetails()));
-
- detailMenu = new QMenu(this);
- detailMenu->addAction(showVerifyDetailsAct);
- detailMenu->addAction(importFromKeyserverAct);
- importFromKeyserverAct->setVisible(false);
-
- keysNotInList = new QStringList();
- detailsButton = new QPushButton(tr("Details"), this);
- detailsButton->setMenu(detailMenu);
- auto *notificationWidgetLayout = new QHBoxLayout(this);
- notificationWidgetLayout->addWidget(infoBoard);
- notificationWidgetLayout->addWidget(detailsButton);
- this->setLayout(notificationWidgetLayout);
-}
-
-void VerifyNotification::slotImportFromKeyserver() {
- auto *importDialog = new KeyServerImportDialog(mCtx, mKeyList, this);
- importDialog->slotImport(*keysNotInList);
-}
-
-void VerifyNotification::setInfoBoard(const QString &text, verify_label_status verifyLabelStatus) {
- QString color;
- infoBoard->setText(text);
- switch (verifyLabelStatus) {
- case VERIFY_ERROR_OK:
- color = "#ccffcc";
- break;
- case VERIFY_ERROR_WARN:
- color = "#ececba";
- break;
- case VERIFY_ERROR_CRITICAL:
- color = "#ff8080";
- break;
- default:
- break;
- }
-
- infoBoard->setAutoFillBackground(true);
- QPalette status = infoBoard->palette();
- status.setColor(QPalette::Text, color);
- infoBoard->setPalette(status);
- infoBoard->setFont(QFont("Times", 10, QFont::Bold));
-}
-
-void VerifyNotification::showImportAction(bool visible) {
- importFromKeyserverAct->setVisible(visible);
-}
-
-void VerifyNotification::slotShowVerifyDetails() {
- QByteArray text = mTextpage->toPlainText().toUtf8();
- GpgME::GpgContext::preventNoDataErr(&text);
- new VerifyDetailsDialog(this, mCtx, mKeyList, &text);
-}
-
-bool VerifyNotification::slotRefresh() {
- verify_label_status verifyStatus = VERIFY_ERROR_OK;
-
- QByteArray text = mTextpage->toPlainText().toUtf8();
- GpgME::GpgContext::preventNoDataErr(&text);
- int textIsSigned = GpgME::GpgContext::textIsSigned(text);
-
- gpgme_signature_t sign = mCtx->verify(&text);
-
- if (sign == nullptr) {
- return false;
- }
-
- QString verifyLabelText;
- QTextStream textSteam(&verifyLabelText);
- bool unknownKeyFound = false;
- bool canContinue = true;
-
-
- 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_BAD_SIGNATURE:
- textIsSigned = 3;
- verifyStatus = VERIFY_ERROR_CRITICAL;
- 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(sign->summary & GPGME_SIGSUM_VALID) {
- textSteam << tr("Signature Fully Valid.") << endl;
- } else {
- textSteam << tr("Signature NOT Fully Valid.") << endl;
- }
-
- 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;
- case GPG_ERR_CERT_REVOKED:
- verifyStatus = VERIFY_ERROR_WARN;
- 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));
- }
- textSteam << endl;
- sign = sign->next;
- }
-
-
- // If an unknown key is found, enable the importfromkeyserveraction
- this->showImportAction(unknownKeyFound);
-
- // Remove the last linebreak
- verifyLabelText.remove(verifyLabelText.length() - 1, 1);
-
- setInfoBoard(verifyLabelText, verifyStatus);
-
- 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/KeyNewUIDDialog.cpp b/src/ui/keypair_details/KeyNewUIDDialog.cpp
index 1e6df250..7605bfae 100644
--- a/src/ui/keypair_details/KeyNewUIDDialog.cpp
+++ b/src/ui/keypair_details/KeyNewUIDDialog.cpp
@@ -71,7 +71,7 @@ void KeyNewUIDDialog::slotCreateNewUID() {
}
if (errorString.isEmpty()) {
- UID uid;
+ GpgUID uid;
uid.name = name->text();
uid.email = email->text();
uid.comment = comment->text();
diff --git a/src/ui/keypair_details/KeyPairUIDTab.cpp b/src/ui/keypair_details/KeyPairUIDTab.cpp
index 729fb1d2..1a6c769d 100644
--- a/src/ui/keypair_details/KeyPairUIDTab.cpp
+++ b/src/ui/keypair_details/KeyPairUIDTab.cpp
@@ -222,7 +222,7 @@ void KeyPairUIDTab::slotRefreshSigList() {
void KeyPairUIDTab::slotAddSign() {
- QVector<UID> selected_uids;
+ QVector<GpgUID> selected_uids;
getUIDChecked(selected_uids);
if(selected_uids.isEmpty()) {
@@ -238,7 +238,7 @@ void KeyPairUIDTab::slotAddSign() {
-void KeyPairUIDTab::getUIDChecked(QVector<UID> &selected_uids) {
+void KeyPairUIDTab::getUIDChecked(QVector<GpgUID> &selected_uids) {
auto &uids = buffered_uids;
@@ -283,7 +283,7 @@ void KeyPairUIDTab::slotAddUIDResult(int result) {
void KeyPairUIDTab::slotDelUID() {
- QVector<UID> selected_uids;
+ QVector<GpgUID> selected_uids;
getUIDChecked(selected_uids);
if(selected_uids.isEmpty()) {
@@ -327,7 +327,7 @@ void KeyPairUIDTab::slotDelUID() {
void KeyPairUIDTab::slotSetPrimaryUID() {
- UID selected_uid;
+ GpgUID selected_uid;
if(!getUIDSelected(selected_uid)) {
auto emptyUIDMsg = new QMessageBox();
@@ -357,7 +357,7 @@ void KeyPairUIDTab::slotSetPrimaryUID() {
}
}
-bool KeyPairUIDTab::getUIDSelected(UID &uid) {
+bool KeyPairUIDTab::getUIDSelected(GpgUID &uid) {
auto &uids = buffered_uids;
for (int i = 0; i < uidList->rowCount(); i++) {
if (uidList->item(i, 0)->isSelected()) {
@@ -368,7 +368,7 @@ bool KeyPairUIDTab::getUIDSelected(UID &uid) {
return false;
}
-bool KeyPairUIDTab::getSignSelected(Signature &signature) {
+bool KeyPairUIDTab::getSignSelected(GpgKeySignature &signature) {
auto &signatures = buffered_signatures;
for (int i = 0; i < sigList->rowCount(); i++) {
if (sigList->item(i, 0)->isSelected()) {
@@ -407,7 +407,7 @@ void KeyPairUIDTab::contextMenuEvent(QContextMenuEvent *event) {
void KeyPairUIDTab::slotAddSignSingle() {
- UID selected_uid;
+ GpgUID selected_uid;
if(!getUIDSelected(selected_uid)) {
QMessageBox::information(nullptr,
@@ -416,13 +416,13 @@ void KeyPairUIDTab::slotAddSignSingle() {
return;
}
- auto selected_uids = QVector<UID>({ selected_uid });
+ auto selected_uids = QVector<GpgUID>({selected_uid });
auto keySignDialog = new KeyUIDSignDialog(mCtx, mKey, selected_uids, this);
keySignDialog->show();
}
void KeyPairUIDTab::slotDelUIDSingle() {
- UID selected_uid;
+ GpgUID selected_uid;
if(!getUIDSelected(selected_uid)) {
QMessageBox::information(nullptr,
@@ -455,19 +455,19 @@ void KeyPairUIDTab::slotDelUIDSingle() {
void KeyPairUIDTab::createSignPopupMenu() {
signPopupMenu = new QMenu(this);
- auto *delSignAct = new QAction(tr("Delete(Revoke) Signature"), this);
+ auto *delSignAct = new QAction(tr("Delete(Revoke) Key Signature"), this);
connect(delSignAct, SIGNAL(triggered()), this, SLOT(slotDelSign()));
signPopupMenu->addAction(delSignAct);
}
void KeyPairUIDTab::slotDelSign() {
- Signature selected_sign;
+ GpgKeySignature selected_sign;
if(!getSignSelected(selected_sign)) {
QMessageBox::information(nullptr,
tr("Invalid Operation"),
- tr("Please select one Signature before doing this operation."));
+ tr("Please select one Key Signature before doing this operation."));
return;
}
@@ -485,7 +485,7 @@ void KeyPairUIDTab::slotDelSign() {
keynames.append(selected_sign.email);
keynames.append("&gt; </i><br/>");
- int ret = QMessageBox::warning(this, tr("Deleting Signature"),
+ int ret = QMessageBox::warning(this, tr("Deleting Key Signature"),
"<b>"+tr("Are you sure that you want to delete the following signature?")+"</b><br/><br/>"+keynames+
+"<br/>"+tr("The action can not be undone."),
QMessageBox::No | QMessageBox::Yes);
diff --git a/src/ui/keypair_details/KeyUIDSignDialog.cpp b/src/ui/keypair_details/KeyUIDSignDialog.cpp
index 4ccf51a1..f112ea25 100644
--- a/src/ui/keypair_details/KeyUIDSignDialog.cpp
+++ b/src/ui/keypair_details/KeyUIDSignDialog.cpp
@@ -24,7 +24,7 @@
#include "ui/keypair_details/KeyUIDSignDialog.h"
-KeyUIDSignDialog::KeyUIDSignDialog(GpgME::GpgContext *ctx, const GpgKey &key, const QVector<UID> &uid, QWidget *parent) :
+KeyUIDSignDialog::KeyUIDSignDialog(GpgME::GpgContext *ctx, const GpgKey &key, const QVector<GpgUID> &uid, QWidget *parent) :
mKey(key), mCtx(ctx), mUids(uid), QDialog(parent) {
mKeyList = new KeyList(ctx,
diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp
new file mode 100644
index 00000000..daa52d85
--- /dev/null
+++ b/src/ui/widgets/InfoBoardWidget.cpp
@@ -0,0 +1,126 @@
+/**
+ * This file is part of GPGFrontend.
+ *
+ * GPGFrontend is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Foobar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * The initial version of the source code is inherited from gpg4usb-team.
+ * Their source code version also complies with GNU General Public License.
+ *
+ * The source code version of this software was modified and released
+ * by Saturneric<[email protected]> starting on May 12, 2021.
+ *
+ */
+
+#include "ui/widgets/InfoBoardWidget.h"
+
+InfoBoardWidget::InfoBoardWidget(QWidget *parent, GpgME::GpgContext *ctx, KeyList *keyList) :
+ QWidget(parent), mCtx(ctx), mKeyList(keyList){
+
+ infoBoard = new QTextEdit(this);
+ infoBoard->setReadOnly(true);
+ infoBoard->setMinimumHeight(140);
+ infoBoard->setMinimumWidth(480);
+
+ connect(mCtx, SIGNAL(signalKeyInfoChanged()), this, SLOT(slotReset()));
+
+ importFromKeyserverAct = new QAction(tr("Import missing key from Keyserver"), this);
+ connect(importFromKeyserverAct, SIGNAL(triggered()), this, SLOT(slotImportFromKeyserver()));
+
+ detailMenu = new QMenu(this);
+ detailMenu->addAction(importFromKeyserverAct);
+ importFromKeyserverAct->setVisible(false);
+
+ actionButtonLayout = new QHBoxLayout();
+ auto label = new QLabel("Optional Actions Menu");
+ label->setMinimumHeight(25);
+ actionButtonLayout->addWidget(label);
+ actionButtonLayout->addStretch();
+
+ QFrame *line;
+ line = new QFrame(this);
+ line->setFrameShape(QFrame::HLine);
+ line->setFrameShadow(QFrame::Sunken);
+
+ auto *notificationWidgetLayout = new QVBoxLayout(this);
+ notificationWidgetLayout->addWidget(infoBoard);
+ notificationWidgetLayout->addLayout(actionButtonLayout);
+ notificationWidgetLayout->addWidget(line);
+ this->setLayout(notificationWidgetLayout);
+}
+
+void InfoBoardWidget::slotImportFromKeyserver() {
+ auto *importDialog = new KeyServerImportDialog(mCtx, mKeyList, this);
+ importDialog->slotImport(*keysNotInList);
+}
+
+void InfoBoardWidget::setInfoBoard(const QString &text, InfoBoardStatus verifyLabelStatus) {
+ QString color;
+ infoBoard->clear();
+ switch (verifyLabelStatus) {
+ case INFO_ERROR_OK:
+ color = "#008000";
+ break;
+ case INFO_ERROR_WARN:
+ color = "#FF8C00";
+ break;
+ case INFO_ERROR_CRITICAL:
+ color = "#DC143C";
+ break;
+ default:
+ break;
+ }
+ infoBoard->append(text);
+
+ infoBoard->setAutoFillBackground(true);
+ QPalette status = infoBoard->palette();
+ status.setColor(QPalette::Text, color);
+ infoBoard->setPalette(status);
+ infoBoard->setFont(QFont("Times", 10, QFont::Bold));
+}
+
+void InfoBoardWidget::slotRefresh(const QString &text, InfoBoardStatus status) {
+ infoBoard->clear();
+ setInfoBoard(text, status);
+ infoBoard->verticalScrollBar()->setValue(0);
+}
+
+void InfoBoardWidget::associateTextEdit(QTextEdit *edit) {
+ this->mTextPage = edit;
+ if(mTextPage != nullptr) {
+ disconnect(mTextPage, SIGNAL(textChanged()), this, SLOT(slotReset()));
+ }
+ connect(edit, SIGNAL(textChanged()), this, SLOT(slotReset()));
+}
+
+void InfoBoardWidget::addOptionalAction(const QString& name, const std::function<void()>& action) {
+ auto actionButton = new QPushButton(name);
+ actionButtonLayout->addWidget(actionButton);
+ connect(actionButton, &QPushButton::clicked, this, [=]() {
+ action();
+ });
+}
+
+void InfoBoardWidget::resetOptionActionsMenu() {
+ QLayoutItem *item;
+ while ((item = actionButtonLayout->layout()->takeAt( 2)) != nullptr ) {
+ actionButtonLayout->removeItem(item);
+ delete item->widget();
+ delete item;
+ }
+}
+
+void InfoBoardWidget::slotReset() {
+ this->infoBoard->clear();
+ resetOptionActionsMenu();
+}