diff options
author | Saturneric <[email protected]> | 2022-07-22 17:46:34 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2022-07-22 17:46:34 +0000 |
commit | a6d22ea199b62d433c595ed5b9f51398fc8b7f5a (patch) | |
tree | a09fb7383a655a18a79c72f54c57352ddba7a4b3 /src/ui/dialog/import_export/KeyUploadDialog.cpp | |
parent | style(src): reformat code (diff) | |
download | GpgFrontend-a6d22ea199b62d433c595ed5b9f51398fc8b7f5a.tar.gz GpgFrontend-a6d22ea199b62d433c595ed5b9f51398fc8b7f5a.zip |
refactor(ui): adjust file structure
Diffstat (limited to 'src/ui/dialog/import_export/KeyUploadDialog.cpp')
-rw-r--r-- | src/ui/dialog/import_export/KeyUploadDialog.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/ui/dialog/import_export/KeyUploadDialog.cpp b/src/ui/dialog/import_export/KeyUploadDialog.cpp new file mode 100644 index 00000000..055f2e1f --- /dev/null +++ b/src/ui/dialog/import_export/KeyUploadDialog.cpp @@ -0,0 +1,159 @@ +/** + * Copyright (C) 2021 Saturneric + * + * 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. + * + * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * the gpg4usb project, which is under GPL-3.0-or-later. + * + * All the source code of GpgFrontend was modified and released by + * Saturneric<[email protected]> starting on May 12, 2021. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "KeyUploadDialog.h" + +#include <algorithm> + +#include "core/function/GlobalSettingStation.h" +#include "core/function/gpg/GpgKeyGetter.h" +#include "core/function/gpg/GpgKeyImportExporter.h" + +namespace GpgFrontend::UI { + +KeyUploadDialog::KeyUploadDialog(const KeyIdArgsListPtr& keys_ids, + QWidget* parent) + : GeneralDialog(typeid(KeyUploadDialog).name(), parent), + m_keys_(GpgKeyGetter::GetInstance().GetKeys(keys_ids)) { + auto* pb = new QProgressBar(); + pb->setRange(0, 0); + pb->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + pb->setTextVisible(false); + + auto* layout = new QVBoxLayout(); + layout->addWidget(pb); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + this->setLayout(layout); + + this->setModal(true); + this->setWindowTitle(_("Uploading Public Key")); + this->setFixedSize(240, 42); +} + +void KeyUploadDialog::SlotUpload() { + auto out_data = std::make_unique<ByteArray>(); + GpgKeyImportExporter::GetInstance().ExportKeys(*m_keys_, out_data); + slot_upload_key_to_server(*out_data); +} + +void KeyUploadDialog::slot_upload_key_to_server( + const GpgFrontend::ByteArray& keys_data) { + std::string target_keyserver; + if (target_keyserver.empty()) { + try { + auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); + + target_keyserver = settings.lookup("keyserver.default_server").c_str(); + + LOG(INFO) << _("Set target Key Server to default Key Server") + << target_keyserver; + } catch (...) { + LOG(ERROR) << _("Cannot read default_keyserver From Settings"); + QMessageBox::critical( + nullptr, _("Default Keyserver Not Found"), + _("Cannot read default keyserver from your settings, " + "please set a default keyserver first")); + return; + } + } + + QUrl req_url(QString::fromStdString(target_keyserver + "/pks/add")); + auto qnam = new QNetworkAccessManager(this); + + // Building Post Data + QByteArray postData; + + auto data = std::string(keys_data); + + boost::algorithm::replace_all(data, "\n", "%0A"); + boost::algorithm::replace_all(data, "\r", "%0D"); + boost::algorithm::replace_all(data, "(", "%28"); + boost::algorithm::replace_all(data, ")", "%29"); + boost::algorithm::replace_all(data, "/", "%2F"); + boost::algorithm::replace_all(data, ":", "%3A"); + boost::algorithm::replace_all(data, "+", "%2B"); + boost::algorithm::replace_all(data, "=", "%3D"); + boost::algorithm::replace_all(data, " ", "+"); + + QNetworkRequest request(req_url); + request.setHeader(QNetworkRequest::ContentTypeHeader, + "application/x-www-form-urlencoded"); + + postData.append("keytext").append("=").append( + QString::fromStdString(data).toUtf8()); + + // Send Post Data + QNetworkReply* reply = qnam->post(request, postData); + connect(reply, &QNetworkReply::finished, this, + &KeyUploadDialog::slot_upload_finished); + + // Keep Waiting + while (reply->isRunning()) { + QApplication::processEvents(); + } + + // Done + this->hide(); + this->close(); +} + +void KeyUploadDialog::slot_upload_finished() { + auto* reply = qobject_cast<QNetworkReply*>(sender()); + + QByteArray response = reply->readAll(); + LOG(INFO) << "Response: " << response.toStdString(); + + auto error = reply->error(); + if (error != QNetworkReply::NoError) { + LOG(INFO) << "Error From Reply" << reply->errorString().toStdString(); + QString message; + switch (error) { + case QNetworkReply::ContentNotFoundError: + message = _("Key Not Found"); + break; + case QNetworkReply::TimeoutError: + message = _("Timeout"); + break; + case QNetworkReply::HostNotFoundError: + message = _("Key Server Not Found"); + break; + default: + message = _("Connection Error"); + } + QMessageBox::critical(this, "Upload Failed", message); + return; + } else { + QMessageBox::information(this, _("Upload Success"), + _("Upload Public Key Successfully")); + LOG(INFO) << "Success while contacting keyserver!"; + } + reply->deleteLater(); +} + +} // namespace GpgFrontend::UI |