aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/KeyUploadDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/KeyUploadDialog.cpp')
-rw-r--r--src/ui/KeyUploadDialog.cpp125
1 files changed, 125 insertions, 0 deletions
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();
+}