diff options
author | Saturneric <[email protected]> | 2021-06-23 08:14:31 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2021-06-23 08:14:31 +0000 |
commit | f96179e926ee8733ed3bd8c8b950cb24f57e46d5 (patch) | |
tree | aae77ffa5d4a1636d0778c67c9d573a74bde220f /src | |
parent | Fix Problem in Project Configuration. (diff) | |
download | GpgFrontend-f96179e926ee8733ed3bd8c8b950cb24f57e46d5.tar.gz GpgFrontend-f96179e926ee8733ed3bd8c8b950cb24f57e46d5.zip |
UI Improved.
Bugs Fixed.
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/MainWindow.cpp | 43 | ||||
-rw-r--r-- | src/gpg/GpgContext.cpp | 26 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/ui/AboutDialog.cpp | 30 | ||||
-rw-r--r-- | src/ui/KeyServerImportDialog.cpp | 88 | ||||
-rw-r--r-- | src/ui/KeyUploadDialog.cpp | 125 | ||||
-rw-r--r-- | src/ui/keypair_details/KeyPairDetailTab.cpp | 63 | ||||
-rw-r--r-- | src/ui/keypair_details/KeySetExpireDateDialog.cpp | 6 | ||||
-rw-r--r-- | src/ui/widgets/KeyList.cpp | 103 |
10 files changed, 328 insertions, 159 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1cf4c5c5..1cc424ca 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,7 +35,6 @@ configure_file(${CMAKE_SOURCE_DIR}/include/GpgFrontend.h.in ${CMAKE_SOURCE_DIR}/ # Copy Resource Files file(COPY ${CMAKE_SOURCE_DIR}/resource/css DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) file(COPY ${CMAKE_SOURCE_DIR}/resource/icons DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) -file(COPY ${CMAKE_SOURCE_DIR}/resource/help DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) file(COPY ${CMAKE_SOURCE_DIR}/resource/conf DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ FOLLOW_SYMLINK_CHAIN) # Copy Utils Files diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 42b04c76..4473b8a2 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -261,11 +261,11 @@ void MainWindow::createActions() { quoteAct->setToolTip(tr("Quote whole text")); connect(quoteAct, SIGNAL(triggered()), edit, SLOT(slotQuote())); - selectallAct = new QAction(tr("Select &All"), this); - selectallAct->setIcon(QIcon(":edit.png")); - selectallAct->setShortcut(QKeySequence::SelectAll); - selectallAct->setToolTip(tr("Select the whole text")); - connect(selectallAct, SIGNAL(triggered()), edit, SLOT(slotSelectAll())); + selectAllAct = new QAction(tr("Select &All"), this); + selectAllAct->setIcon(QIcon(":edit.png")); + selectAllAct->setShortcut(QKeySequence::SelectAll); + selectAllAct->setToolTip(tr("Select the whole text")); + connect(selectAllAct, SIGNAL(triggered()), edit, SLOT(slotSelectAll())); findAct = new QAction(tr("&Find"), this); findAct->setShortcut(QKeySequence::Find); @@ -422,7 +422,7 @@ void MainWindow::slotDisableTabActions(int number) { copyAct->setDisabled(disable); pasteAct->setDisabled(disable); closeTabAct->setDisabled(disable); - selectallAct->setDisabled(disable); + selectAllAct->setDisabled(disable); findAct->setDisabled(disable); verifyAct->setDisabled(disable); signAct->setDisabled(disable); @@ -465,7 +465,7 @@ void MainWindow::createMenus() { editMenu->addAction(copyAct); editMenu->addAction(cutAct); editMenu->addAction(pasteAct); - editMenu->addAction(selectallAct); + editMenu->addAction(selectAllAct); editMenu->addAction(findAct); editMenu->addSeparator(); editMenu->addAction(quoteAct); @@ -546,7 +546,7 @@ void MainWindow::createToolBars() { editToolBar->setObjectName("editToolBar"); editToolBar->addAction(copyAct); editToolBar->addAction(pasteAct); - editToolBar->addAction(selectallAct); + editToolBar->addAction(selectAllAct); viewMenu->addAction(editToolBar->toggleViewAction()); specialEditToolBar = addToolBar(tr("Special Edit")); @@ -598,13 +598,13 @@ void MainWindow::createStatusBar() { void MainWindow::createDockWindows() { /* KeyList-Dockwindow */ - 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()); + 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()); infoBoardDock = new QDockWidget(tr("Information Board"), this); infoBoardDock->setObjectName("Information Board"); @@ -922,17 +922,16 @@ void MainWindow::refreshKeysFromKeyserver() { return; } - auto *ksid = new KeyServerImportDialog(mCtx, mKeyList, true, this); - ksid->show(); - ksid->slotImport(*mKeyList->getSelected()); + auto *dialog = new KeyServerImportDialog(mCtx, mKeyList, true, this); + dialog->show(); + dialog->slotImport(*mKeyList->getSelected()); } void MainWindow::uploadKeyToServer() { - auto *keyArray = new QByteArray(); - mCtx->exportKeys(mKeyList->getSelected(), keyArray); - - mKeyList->uploadKeyToServer(keyArray); + QVector<GpgKey> keys; + keys.append(mKeyList->getSelectedKey()); + auto *dialog = new KeyUploadDialog(mCtx, keys); } void MainWindow::slotFileEncrypt() { diff --git a/src/gpg/GpgContext.cpp b/src/gpg/GpgContext.cpp index 62d7a246..603ad90b 100644 --- a/src/gpg/GpgContext.cpp +++ b/src/gpg/GpgContext.cpp @@ -1215,4 +1215,30 @@ namespace GpgME { return err; } + + bool GpgContext::exportKeys(const QVector<GpgKey> &keys, QByteArray &outBuffer) { + size_t read_bytes; + gpgme_data_t dataOut = nullptr; + outBuffer.resize(0); + + if (keys.count() == 0) { + QMessageBox::critical(nullptr, "Export Keys Error", "No Keys Selected"); + return false; + } + + for (const auto& key : keys) { + err = gpgme_data_new(&dataOut); + checkErr(err); + + err = gpgme_op_export(mCtx,key.id.toUtf8().constData(), 0, dataOut); + checkErr(err); + + read_bytes = gpgme_data_seek(dataOut, 0, SEEK_END); + + err = readToBuffer(dataOut, &outBuffer); + checkErr(err); + gpgme_data_release(dataOut); + } + return true; + } }
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 7d6a71a3..db11ee6f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -81,6 +81,8 @@ int main(int argc, char *argv[]) { qDebug() << "Translator2" << translator2.filePath(); QApplication::installTranslator(&translator2); + QApplication::setQuitOnLastWindowClosed(true); + MainWindow window; return_from_event_loop_code = QApplication::exec(); diff --git a/src/ui/AboutDialog.cpp b/src/ui/AboutDialog.cpp index 652bb956..e51f225d 100644 --- a/src/ui/AboutDialog.cpp +++ b/src/ui/AboutDialog.cpp @@ -50,21 +50,19 @@ InfoTab::InfoTab(QWidget *parent) : QWidget(parent) { auto *pixmap = new QPixmap(":gpgfrontend-logo.png"); auto *text = new QString("<center><h2>" + qApp->applicationName() + "</h2></center>" - + "<center><b>" + qApp->applicationVersion() + "</b></center>" - + "<center>" + GIT_VERSION + "</center>" - + tr("<br><center>GPGFrontend is a modern, easy-to-use, compact, <br>" - "cross-platform, and installation-free gpg front-end tool.<br>" - "It visualizes most of the common operations of gpg commands.<br>" - "It's licensed under the GPL v3<br><br>" - "<b>Developer:</b><br>" - "Saturneric<br><br>" - "If you have any questions or suggestions have a look<br/>" - "at my <a href=\"https://bktus.com/%e8%81%94%e7%b3%bb%e4%b8%8e%e9%aa%8c%e8%af%81\">" - "contact page</a> or send a mail to my<br/> mailing list at" - " <a href=\"mailto:[email protected]\">[email protected]</a>.") + - tr("<br><br> Built with Qt ") + qVersion() - + tr(" and GPGME ") + GpgME::GpgContext::getGpgmeVersion() + - tr("<br>Built at ") + BUILD_TIMESTAMP + "</center>"); + + "<center><b>" + qApp->applicationVersion() + "</b></center>" + + "<center>" + GIT_VERSION + "</center>" + + tr("<br><center>GPGFrontend is an easy-to-use, compact, <br>" + "cross-platform, and installation-free gpg front-end tool.<br>" + "It visualizes most of the common operations of gpg commands.<br>" + "It's licensed under the GPL v3<br><br>" + "<b>Developer:</b><br>" + "Saturneric<br><br>" + "If you have any questions or suggestions, raise an issue<br/>" + "at <a href=\"https://github.com/saturneric/GpgFrontend\">GitHub</a> or send a mail to my mailing list at <a href=\"mailto:[email protected]\">[email protected]</a>.") + + tr("<br><br> Built with Qt ") + qVersion() + + tr(" and GPGME ") + GpgME::GpgContext::getGpgmeVersion() + + tr("<br>Built at ") + BUILD_TIMESTAMP + "</center>"); auto *layout = new QGridLayout(); auto *pixmapLabel = new QLabel(); @@ -83,7 +81,7 @@ InfoTab::InfoTab(QWidget *parent) TranslatorsTab::TranslatorsTab(QWidget *parent) : QWidget(parent) { QFile translatorsFile; - translatorsFile.setFileName(qApp->applicationDirPath() + "/TRANSLATORS"); + translatorsFile.setFileName(qApp->applicationDirPath() + "/About"); translatorsFile.open(QIODevice::ReadOnly); QByteArray inBuffer = translatorsFile.readAll(); diff --git a/src/ui/KeyServerImportDialog.cpp b/src/ui/KeyServerImportDialog.cpp index 00ff4165..bfa53cce 100644 --- a/src/ui/KeyServerImportDialog.cpp +++ b/src/ui/KeyServerImportDialog.cpp @@ -61,7 +61,7 @@ KeyServerImportDialog::KeyServerImportDialog(GpgME::GpgContext *ctx, KeyList *ke waitingBar->setVisible(false); waitingBar->setRange(0, 0); waitingBar->setFixedHeight(24); - waitingBar->setFixedWidth(260); + waitingBar->setFixedWidth(200); // Layout for messagebox auto *messageLayout = new QHBoxLayout; @@ -82,7 +82,6 @@ KeyServerImportDialog::KeyServerImportDialog(GpgME::GpgContext *ctx, KeyList *ke // 自动化调用界面布局 if(automatic) { mainLayout->addLayout(messageLayout, 0, 0, 1, 3); - mainLayout->addLayout(buttonsLayout, 1, 0, 1, 3); } else { mainLayout->addWidget(searchLabel, 1, 0); mainLayout->addWidget(searchLineEdit, 1, 1); @@ -95,10 +94,13 @@ KeyServerImportDialog::KeyServerImportDialog(GpgME::GpgContext *ctx, KeyList *ke } this->setLayout(mainLayout); - this->setWindowTitle(tr("Import Keys from Keyserver")); + if(automatic) + this->setWindowTitle(tr("Update Keys from Keyserver")); + else + this->setWindowTitle(tr("Import Keys from Keyserver")); if(automatic) { - this->setMinimumHeight(80); + this->setFixedSize(200, 42); } else { // Restore window size & location if (this->settings.value("ImportKeyFromServer/setWindowSize").toBool()) { @@ -206,12 +208,25 @@ void KeyServerImportDialog::slotSearchFinished() { keysTable->setRowCount(0); QString firstLine = QString(reply->readLine(1024)); - QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - if (reply->error()) { - setMessage(tr("<h4>Couldn't contact keyserver!</h4>"), true); - qDebug() << reply->error(); + auto error = reply->error(); + if (error != QNetworkReply::NoError) { + qDebug() << "Error From Reply" << reply->errorString(); + switch (error) { + case QNetworkReply::ContentNotFoundError : + setMessage(tr("Not Key Found"), true); + break; + case QNetworkReply::TimeoutError : + setMessage(tr("Timeout"), true); + break; + case QNetworkReply::HostNotFoundError : + setMessage(tr("Key Server Not Found"), true); + break; + default: + setMessage(tr("Connection Error"), true); + } return; } + if (firstLine.contains("Error")) { QString text = QString(reply->readLine(1024)); if (text.contains("Too many responses")) { @@ -322,6 +337,16 @@ void KeyServerImportDialog::slotImport(const QStringList& keyIds) { slotImport(keyIds, QUrl(keyserver)); } +void KeyServerImportDialog::slotImportKey(const QVector<GpgKey>& keys) { + QString keyserver = settings.value("keyserver/defaultKeyServer").toString(); + qDebug() << "Select Key Server" << keyserver; + auto keyIds = QStringList(); + for(const auto &key : keys) { + keyIds.append(key.id); + } + slotImport(keyIds, QUrl(keyserver)); +} + void KeyServerImportDialog::slotImport(const QStringList& keyIds, const QUrl &keyServerUrl) { for (const auto &keyId : keyIds) { @@ -329,9 +354,9 @@ void KeyServerImportDialog::slotImport(const QStringList& keyIds, const QUrl &ke keyServerUrl.scheme() + "://" + keyServerUrl.host() + "/pks/lookup?op=get&search=0x" + keyId + "&options=mr"); qDebug() << "slotImport reqUrl" << reqUrl; - qnam = new QNetworkAccessManager(this); + auto pManager = new QNetworkAccessManager(this); - QNetworkReply *reply = qnam->get(QNetworkRequest(reqUrl)); + QNetworkReply *reply = pManager->get(QNetworkRequest(reqUrl)); connect(reply, SIGNAL(finished()), this, SLOT(slotImportFinished())); @@ -369,6 +394,9 @@ void KeyServerImportDialog::slotImportFinished() { default: setMessage(tr("Connection Error"), true); } + if(mAutomatic) { + setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint); + } return; } @@ -393,7 +421,7 @@ void KeyServerImportDialog::slotImportFinished() { void KeyServerImportDialog::importKeys(QByteArray inBuffer) { GpgImportInformation result = mCtx->importKey(std::move(inBuffer)); if(mAutomatic) { - new KeyImportDetailDialog(mCtx, result, false, nullptr); + new KeyImportDetailDialog(mCtx, result, false, this); this->accept(); } else { new KeyImportDetailDialog(mCtx, result, false, this); @@ -411,3 +439,41 @@ void KeyServerImportDialog::setLoading(bool status) { message->setVisible(true); } } + +KeyServerImportDialog::KeyServerImportDialog(GpgME::GpgContext *ctx, QWidget *parent) + : QDialog(parent), appPath(qApp->applicationDirPath()), + settings(appPath + "/conf/gpgfrontend.ini", QSettings::IniFormat), + mCtx(ctx), mAutomatic(true) { + + setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint); + + message = new QLabel; + message->setFixedHeight(24); + icon = new QLabel; + icon->setFixedHeight(24); + + // Network Waiting + waitingBar = new QProgressBar(); + waitingBar->setVisible(false); + waitingBar->setRange(0, 0); + waitingBar->setFixedHeight(24); + waitingBar->setFixedWidth(200); + + // Layout for messagebox + auto *messageLayout = new QHBoxLayout; + messageLayout->addWidget(icon); + messageLayout->addWidget(message); + messageLayout->addWidget(waitingBar); + messageLayout->addStretch(); + + keyServerComboBox = createComboBox(); + + auto *mainLayout = new QGridLayout; + + mainLayout->addLayout(messageLayout, 0, 0, 1, 3); + + this->setLayout(mainLayout); + this->setWindowTitle(tr("Upload Keys from Keyserver")); + this->setFixedSize(200, 42); + this->setModal(true); +} diff --git a/src/ui/KeyUploadDialog.cpp b/src/ui/KeyUploadDialog.cpp new file mode 100644 index 00000000..a81ed7a4 --- /dev/null +++ b/src/ui/KeyUploadDialog.cpp @@ -0,0 +1,125 @@ +/** + * 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/KeyUploadDialog.h" + +#include <utility> + +KeyUploadDialog::KeyUploadDialog(GpgME::GpgContext *ctx, const QVector<GpgKey> &keys, QWidget *parent) +: appPath(qApp->applicationDirPath()), +settings(appPath + "/conf/gpgfrontend.ini", QSettings::IniFormat), +QDialog(parent) { + ctx->exportKeys(keys, mKeyData); + uploadKeyToServer(mKeyData); +} + +void KeyUploadDialog::uploadKeyToServer(QByteArray &keys) { + + // set default keyserver + QString keyserver = settings.value("keyserver/defaultKeyServer").toString(); + + QUrl reqUrl(keyserver + "/pks/add"); + auto qnam = new QNetworkAccessManager(this); + + // Building Post Data + QByteArray postData; + + keys.replace("\n", "%0A") + .replace("\r", "%0D") + .replace("(", "%28") + .replace(")", "%29") + .replace("/", "%2F") + .replace(":", "%3A") + .replace("+", "%2B") + .replace('=', "%3D") + .replace(' ', '+'); + + QNetworkRequest request(reqUrl); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + + postData.append("keytext").append("=").append(keys); + + // Send Post Data + QNetworkReply *reply = qnam->post(request, postData); + connect(reply, SIGNAL(finished()), + this, SLOT(slotUploadFinished())); + + + // A Waiting Dialog + auto *dialog = new QDialog(this, Qt::CustomizeWindowHint | Qt::WindowTitleHint); + dialog->setModal(true); + dialog->setWindowTitle(tr("Uploading Public Key")); + dialog->setFixedSize(200, 42); + + auto *pb = new QProgressBar(); + pb->setRange(0, 0); + pb->setFixedSize(200, 24); + + auto *layout = new QVBoxLayout(dialog); + layout->addWidget(pb); + dialog->setLayout(layout); + + dialog->show(); + + // Keep Waiting + while(reply->isRunning()) { + QApplication::processEvents(); + } + + // Done + dialog->hide(); + dialog->close(); +} + +void KeyUploadDialog::slotUploadFinished() { + auto *reply = qobject_cast<QNetworkReply *>(sender()); + + QByteArray response = reply->readAll(); + qDebug() << "Response: " << response.data(); + + auto error = reply->error(); + if (error != QNetworkReply::NoError) { + qDebug() << "Error From Reply" << reply->errorString(); + QString message; + switch (error) { + case QNetworkReply::ContentNotFoundError : + message = tr("Key Not Found"); + break; + case QNetworkReply::TimeoutError : + message = tr("Timeout"); + break; + case QNetworkReply::HostNotFoundError : + message = tr("Key Server Not Found"); + break; + default: + message = tr("Connection Error"); + } + QMessageBox::critical(this, "Upload Failed", message); + return; + } else { + QMessageBox::information(this, "Upload Success", "Upload Public Key Successfully"); + qDebug() << "Success while contacting keyserver!"; + } + reply->deleteLater(); +} diff --git a/src/ui/keypair_details/KeyPairDetailTab.cpp b/src/ui/keypair_details/KeyPairDetailTab.cpp index 97b9cf87..c72a7685 100644 --- a/src/ui/keypair_details/KeyPairDetailTab.cpp +++ b/src/ui/keypair_details/KeyPairDetailTab.cpp @@ -135,9 +135,19 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q vboxPK->addWidget(exportButton); connect(exportButton, SIGNAL(clicked()), this, SLOT(slotExportPrivateKey())); - auto *editExpiresButton = new QPushButton(tr("Modify Expiration Datetime")); - vboxPK->addWidget(editExpiresButton); - connect(editExpiresButton, SIGNAL(clicked()), this, SLOT(slotModifyEditDatetime())); + if(mKey.has_master_key) { + auto *editExpiresButton = new QPushButton(tr("Modify Expiration Datetime")); + vboxPK->addWidget(editExpiresButton); + connect(editExpiresButton, SIGNAL(clicked()), this, SLOT(slotModifyEditDatetime())); + + auto *keyServerOperaButton = new QPushButton(tr("Key Server Operation")); + vboxPK->addWidget(keyServerOperaButton); + connect(keyServerOperaButton, SIGNAL(clicked()), this, SLOT(slotModifyEditDatetime())); + + // Set Menu + createKeyServerOperaMenu(); + keyServerOperaButton->setMenu(keyServerOperaMenu); + } privKeyBox->setLayout(vboxPK); mvbox->addWidget(privKeyBox); @@ -147,19 +157,18 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q if ((mKey.expired) || (mKey.revoked)) { auto *expBox = new QHBoxLayout(); - QIcon icon = QIcon::fromTheme("dialog-warning"); - QPixmap pixmap = icon.pixmap(QSize(32, 32), QIcon::Normal, QIcon::On); + QPixmap pixmap(":warning.png"); auto *expLabel = new QLabel(); auto *iconLabel = new QLabel(); if (mKey.expired) { - expLabel->setText(tr("Warning: The master key of the key pair has expired.")); + expLabel->setText(tr("Warning: The Master Key has expired.")); } if (mKey.revoked) { - expLabel->setText(tr("Warning: The master key of the key pair has been revoked")); + expLabel->setText(tr("Warning: The Master Key has been revoked")); } - iconLabel->setPixmap(pixmap); + iconLabel->setPixmap(pixmap.scaled(24,24,Qt::KeepAspectRatio)); QFont font = expLabel->font(); font.setBold(true); expLabel->setFont(font); @@ -180,10 +189,9 @@ KeyPairDetailTab::KeyPairDetailTab(GpgME::GpgContext *ctx, const GpgKey &mKey, Q void KeyPairDetailTab::slotExportPrivateKey() { // Show a information box with explanation about private key int ret = QMessageBox::information(this, tr("Exporting private Key"), - tr("You are about to export your private key.\n" - "This is NOT your public key, so don't give it away.\n" - "Make sure you keep it save." - "Do you really want to export your private key?"), + tr("<h3>You are about to export your <font color=\"red\">PRIVATE KEY</font>!</h3>\n" + "This is NOT your Public Key, so DON'T give it away.<br />" + "Do you REALLY want to export your PRIVATE KEY?"), QMessageBox::Cancel | QMessageBox::Ok); // export key, if ok was clicked @@ -192,12 +200,12 @@ void KeyPairDetailTab::slotExportPrivateKey() { mCtx->exportSecretKey(*keyid, keyArray); auto &key = mCtx->getKeyById(*keyid); QString fileString = key.name + " " +key.email + "(" + - key.id + ")_pub_sec.asc"; + key.id + ")_secret.asc"; QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QMessageBox::critical(nullptr, tr("Export error"), tr("Couldn't open %1 for writing").arg(fileName)); + QMessageBox::critical(nullptr, tr("Export Error"), tr("Couldn't open %1 for writing").arg(fileName)); return; } QTextStream stream(&file); @@ -284,3 +292,30 @@ void KeyPairDetailTab::slotRefreshKeyInfo() { } +void KeyPairDetailTab::createKeyServerOperaMenu() { + keyServerOperaMenu = new QMenu(this); + + auto *uploadKeyPair = new QAction(tr("Upload Key Pair"), this); + connect(uploadKeyPair, SIGNAL(triggered()), this, SLOT(slotUploadKeyToServer())); + auto *updateKeyPair = new QAction(tr("Update Key Pair"), this); + connect(updateKeyPair, SIGNAL(triggered()), this, SLOT(slotUpdateKeyToServer())); + + keyServerOperaMenu->addAction(uploadKeyPair); + // TODO Solve Refresh Problem +// keyServerOperaMenu->addAction(updateKeyPair); +} + +void KeyPairDetailTab::slotUploadKeyToServer() { + QVector<GpgKey> keys; + keys.append(mKey); + auto *dialog = new KeyUploadDialog(mCtx, keys); +} + +void KeyPairDetailTab::slotUpdateKeyToServer() { + QVector<GpgKey> keys; + keys.append(mKey); + auto *dialog = new KeyServerImportDialog(mCtx, this); + dialog->show(); + dialog->slotImportKey(keys); +} + diff --git a/src/ui/keypair_details/KeySetExpireDateDialog.cpp b/src/ui/keypair_details/KeySetExpireDateDialog.cpp index 67238685..f76fa3ab 100644 --- a/src/ui/keypair_details/KeySetExpireDateDialog.cpp +++ b/src/ui/keypair_details/KeySetExpireDateDialog.cpp @@ -37,9 +37,9 @@ QDialog(parent), mKey(key), mSubkey(subkey), mCtx(ctx) { auto *gridLayout = new QGridLayout(); gridLayout->addWidget(dateTimeEdit, 0, 0, 1, 2); - gridLayout->addWidget(nonExpiredCheck, 1, 0, 1, 1, Qt::AlignRight); - gridLayout->addWidget(new QLabel(tr("Never Expire"))); - gridLayout->addWidget(confirmButton, 2, 0); + gridLayout->addWidget(nonExpiredCheck, 0, 2, 1, 1, Qt::AlignRight); + gridLayout->addWidget(new QLabel(tr("Never Expire")), 0, 3); + gridLayout->addWidget(confirmButton, 1, 3); connect(nonExpiredCheck, SIGNAL(stateChanged(int)), this, SLOT(slotNonExpiredChecked(int))); connect(confirmButton, SIGNAL(clicked(bool)), this, SLOT(slotConfirm())); diff --git a/src/ui/widgets/KeyList.cpp b/src/ui/widgets/KeyList.cpp index 4f0fe1c3..6982c3a2 100644 --- a/src/ui/widgets/KeyList.cpp +++ b/src/ui/widgets/KeyList.cpp @@ -305,14 +305,12 @@ void KeyList::addMenuAction(QAction *act) void KeyList::dropEvent(QDropEvent* event) { -// importKeyDialog(); - QSettings settings; auto *dialog = new QDialog(); dialog->setWindowTitle(tr("Import Keys")); QLabel *label; - label = new QLabel(tr("You've dropped something on the keylist.\n gpg4usb will now try to import key(s).")+"\n"); + label = new QLabel(tr("You've dropped something on the table.\n GpgFrontend will now try to import key(s).")+"\n"); // "always import keys"-CheckBox auto *checkBox = new QCheckBox(tr("Always import without bothering.")); @@ -346,7 +344,7 @@ void KeyList::dropEvent(QDropEvent* event) if (event->mimeData()->hasUrls()) { - foreach (QUrl tmp, event->mimeData()->urls()) + for (const QUrl& tmp : event->mimeData()->urls()) { QFile file; file.setFileName(tmp.toLocalFile()); @@ -384,94 +382,6 @@ void KeyList::importKeys(QByteArray inBuffer) new KeyImportDetailDialog(mCtx, result, false, this); } -void KeyList::uploadKeyToServer(QByteArray *keys) { - - // set default keyserver - QString keyserver = settings.value("keyserver/defaultKeyServer").toString(); - - QUrl reqUrl(keyserver + "/pks/add"); - qnam = new QNetworkAccessManager(this); - - // Building Post Data - QByteArray postData; - - keys->replace("\n", "%0A") - .replace("\r", "%0D") - .replace("(", "%28") - .replace(")", "%29") - .replace("/", "%2F") - .replace(":", "%3A") - .replace("+", "%2B") - .replace('=', "%3D") - .replace(' ', '+'); - - QNetworkRequest request(reqUrl); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - - postData.append("keytext").append("=").append(*keys); - - // Send Post Data - QNetworkReply *reply = qnam->post(request, postData); - connect(reply, SIGNAL(finished()), - this, SLOT(uploadFinished())); - - - // A Waiting Dialog - auto *dialog = new QDialog(this, Qt::CustomizeWindowHint | Qt::WindowTitleHint); - dialog->setModal(true); - dialog->setWindowTitle(tr("Uploading Public Key...")); - - auto *pb = new QProgressBar(); - pb->setRange(0, 0); - pb->setFixedSize(260, 24); - - auto *layout = new QVBoxLayout(dialog); - layout->addWidget(pb); - dialog->setLayout(layout); - - dialog->show(); - - // Keep Waiting - while(reply->isRunning()) { - QApplication::processEvents(); - } - - // Done - dialog->hide(); - dialog->close(); -} -void KeyList::uploadFinished() { - auto *reply = qobject_cast<QNetworkReply *>(sender()); - - QByteArray response = reply->readAll(); - qDebug() << "Response: " << response.data(); - - auto error = reply->error(); - if (error != QNetworkReply::NoError) { - qDebug() << "Error From Reply" << reply->errorString(); - QString message; - switch (error) { - case QNetworkReply::ContentNotFoundError : - message = tr("Key Not Found"); - break; - case QNetworkReply::TimeoutError : - message = tr("Timeout"); - break; - case QNetworkReply::HostNotFoundError : - message = tr("Key Server Not Found"); - break; - default: - message = tr("Connection Error"); - } - QMessageBox::critical(nullptr, "Upload Failed", message); - return; - } else { - QMessageBox::information(nullptr, "Upload Success", "Upload Public Key Successfully"); - qDebug() << "Success while contacting keyserver!"; - } - reply->deleteLater(); -} - void KeyList::getCheckedKeys(QVector<GpgKey> &keys) { keys.clear(); for (int i = 0; i < mKeyList->rowCount(); i++) { @@ -512,3 +422,12 @@ void KeyList::getPrivateCheckedKeys(QVector<GpgKey> &keys) { } } } + +GpgKey KeyList::getSelectedKey() { + for (int i = 0; i < mKeyList->rowCount(); i++) { + if (mKeyList->item(i, 0)->isSelected() == 1) { + return buffered_keys[i]; + } + } + return GpgKey(); +} |