aboutsummaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/BaseAPI.cpp55
-rw-r--r--src/server/BaseAPI.h66
-rw-r--r--src/server/ComUtils.cpp286
-rw-r--r--src/server/ComUtils.h88
-rw-r--r--src/server/api/PubkeyGetter.cpp117
-rw-r--r--src/server/api/PubkeyGetter.h52
-rw-r--r--src/server/api/PubkeyUploader.cpp148
-rw-r--r--src/server/api/PubkeyUploader.h51
8 files changed, 567 insertions, 296 deletions
diff --git a/src/server/BaseAPI.cpp b/src/server/BaseAPI.cpp
index be388df9..aa4c3f98 100644
--- a/src/server/BaseAPI.cpp
+++ b/src/server/BaseAPI.cpp
@@ -1,7 +1,7 @@
/**
- * This file is part of GPGFrontend.
+ * This file is part of GpgFrontend.
*
- * GPGFrontend is free software: you can redistribute it and/or modify
+ * 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.
@@ -23,48 +23,47 @@
*/
#include "server/BaseAPI.h"
+
#include "rapidjson/writer.h"
-BaseAPI::BaseAPI(ComUtils::ServiceType serviceType) : utils(new ComUtils(nullptr)),
- reqUrl(utils->getUrl(serviceType)), request(reqUrl) {
- request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
+BaseAPI::BaseAPI(ComUtils::ServiceType serviceType)
+ : utils(new ComUtils(nullptr)),
+ reqUrl(utils->getUrl(serviceType)),
+ request(reqUrl) {
+ request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
}
-BaseAPI::~BaseAPI() {
- utils->deleteLater();
-}
+BaseAPI::~BaseAPI() { utils->deleteLater(); }
QNetworkReply *BaseAPI::send_json_data() {
- rapidjson::StringBuffer sb;
- rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
- document.Accept(writer);
+ rapidjson::StringBuffer sb;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
+ document.Accept(writer);
- QByteArray postData(sb.GetString());
- qDebug() << "postData" << QString::fromUtf8(postData);
+ QByteArray postData(sb.GetString());
+ qDebug() << "postData" << QString::fromUtf8(postData);
- auto reply = utils->getNetworkManager().post(request, postData);
+ auto reply = utils->getNetworkManager().post(request, postData);
- while (reply->isRunning()) QApplication::processEvents();
+ while (reply->isRunning()) QApplication::processEvents();
- QByteArray replyData = reply->readAll().constData();
- if (utils->checkServerReply(replyData)) {
- good = true, deal_reply();
- }
+ QByteArray replyData = reply->readAll().constData();
+ if (utils->checkServerReply(replyData)) {
+ good = true, deal_reply();
+ }
- return reply;
+ return reply;
}
void BaseAPI::start() {
- construct_json();
- send_json_data()->deleteLater();
+ construct_json();
+ send_json_data()->deleteLater();
}
void BaseAPI::refresh() {
- document.Clear();
- utils->clear();
- good = false;
+ document.Clear();
+ utils->clear();
+ good = false;
}
-bool BaseAPI::result() const {
- return good;
-}
+bool BaseAPI::result() const { return good; }
diff --git a/src/server/BaseAPI.h b/src/server/BaseAPI.h
new file mode 100644
index 00000000..46766fed
--- /dev/null
+++ b/src/server/BaseAPI.h
@@ -0,0 +1,66 @@
+/**
+ * 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.
+ *
+ */
+
+#ifndef GPGFRONTEND_ZH_CN_TS_BASEAPI_H
+#define GPGFRONTEND_ZH_CN_TS_BASEAPI_H
+
+#include "ComUtils.h"
+#include "GpgFrontend.h"
+#include "rapidjson/document.h"
+
+class BaseAPI : public QObject {
+ Q_OBJECT
+ public:
+ explicit BaseAPI(ComUtils::ServiceType serviceType);
+
+ ~BaseAPI() override;
+
+ void start();
+
+ void refresh();
+
+ [[nodiscard]] bool result() const;
+
+ private:
+ ComUtils *utils;
+
+ QUrl reqUrl;
+
+ QNetworkRequest request;
+
+ QNetworkReply *send_json_data();
+
+ protected:
+ bool good = false;
+
+ rapidjson::Document document;
+
+ const ComUtils &getUtils() { return *utils; };
+
+ virtual void construct_json() = 0;
+
+ virtual void deal_reply() = 0;
+};
+
+#endif // GPGFRONTEND_ZH_CN_TS_BASEAPI_H
diff --git a/src/server/ComUtils.cpp b/src/server/ComUtils.cpp
index 01be4ea7..6a5ce7b0 100644
--- a/src/server/ComUtils.cpp
+++ b/src/server/ComUtils.cpp
@@ -1,7 +1,7 @@
/**
- * This file is part of GPGFrontend.
+ * This file is part of GpgFrontend.
*
- * GPGFrontend is free software: you can redistribute it and/or modify
+ * 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.
@@ -29,67 +29,71 @@
* @param reply reply data in byte array
* @return if successful
*/
-bool ComUtils::checkServerReply(const QByteArray &reply) {
-
- if(reply.isEmpty()) {
- QMessageBox::critical(this, tr("Error"), tr("Nothing Reply. Please check the Internet connection."));
- return false;
+bool GpgFrontend::ComUtils::checkServerReply(const QByteArray &reply) {
+ if (reply.isEmpty()) {
+ QMessageBox::critical(
+ this, _("Error"),
+ _("Nothing Reply. Please check the Internet connection."));
+ return false;
+ }
+
+ qDebug() << "Reply" << reply;
+
+ /**
+ * Server Reply Format(Except Timeout)
+ * {
+ * "status": 200,
+ * "msg": "OK",
+ * "timestamp": 1628652783895
+ * "data" : {
+ * ...
+ * }
+ * }
+ */
+
+ // check if reply is a json object
+ if (replyDoc.Parse(reply).HasParseError() || !replyDoc.IsObject()) {
+ QMessageBox::critical(this, _("Error"), _("Unknown Error"));
+ return false;
+ }
+
+ // check status(int) and message(string)
+ if (replyDoc.HasMember("status") && replyDoc.HasMember("msg") &&
+ replyDoc.HasMember("timestamp") && replyDoc.HasMember("data") &&
+ replyDoc["status"].IsNumber() && replyDoc["msg"].IsString() &&
+ replyDoc["timestamp"].IsNumber() && replyDoc["data"].IsObject()) {
+ int status = replyDoc["status"].GetInt();
+ QDateTime time;
+ time.setMSecsSinceEpoch(replyDoc["timestamp"].GetInt64());
+ auto message = replyDoc["msg"].GetString();
+ dataVal = replyDoc["data"].GetObject();
+
+ qDebug() << "Reply Date & Time" << time;
+
+ // check reply timestamp
+ if (time < QDateTime::currentDateTime().addSecs(-10)) {
+ QMessageBox::critical(this, _("Network Error"), _("Outdated Reply"));
+ return false;
}
- qDebug() << "Reply" << reply;
-
- /**
- * Server Reply Format(Except Timeout)
- * {
- * "status": 200,
- * "msg": "OK",
- * "timestamp": 1628652783895
- * "data" : {
- * ...
- * }
- * }
- */
-
- // check if reply is a json object
- if (replyDoc.Parse(reply).HasParseError() || !replyDoc.IsObject()) {
- QMessageBox::critical(this, tr("Error"), tr("Unknown Error"));
- return false;
+ // check status code if successful (200-299)
+ // check data object
+ if (status / 100 == 2) {
+ is_good = true;
+ return true;
+ } else {
+ if (dataVal.HasMember("exceptionMessage") &&
+ dataVal["exceptionMessage"].IsString())
+ QMessageBox::critical(this, message,
+ dataVal["exceptionMessage"].GetString());
+ else
+ QMessageBox::critical(this, message, _("Unknown Reason"));
}
- // check status(int) and message(string)
- if (replyDoc.HasMember("status") && replyDoc.HasMember("msg") && replyDoc.HasMember("timestamp") &&
- replyDoc.HasMember("data")
- && replyDoc["status"].IsNumber() && replyDoc["msg"].IsString() && replyDoc["timestamp"].IsNumber() &&
- replyDoc["data"].IsObject()) {
-
- int status = replyDoc["status"].GetInt();
- QDateTime time;
- time.setMSecsSinceEpoch(replyDoc["timestamp"].GetInt64());
- auto message = replyDoc["msg"].GetString();
- dataVal = replyDoc["data"].GetObject();
-
- qDebug() << "Reply Date & Time" << time;
-
- // check reply timestamp
- if (time < QDateTime::currentDateTime().addSecs(-10)) {
- QMessageBox::critical(this, tr("Network Error"), tr("Outdated Reply"));
- return false;
- }
-
- // check status code if successful (200-299)
- // check data object
- if (status / 100 == 2) {
- is_good = true;
- return true;
- } else {
- if (dataVal.HasMember("exceptionMessage") && dataVal["exceptionMessage"].IsString())
- QMessageBox::critical(this, message, dataVal["exceptionMessage"].GetString());
- else QMessageBox::critical(this, message, tr("Unknown Reason"));
- }
-
- } else QMessageBox::critical(this, tr("Network Error"), tr("Unknown Reply Format"));
+ } else
+ QMessageBox::critical(this, _("Network Error"), _("Unknown Reply Format"));
- return false;
+ return false;
}
/**
@@ -97,13 +101,15 @@ bool ComUtils::checkServerReply(const QByteArray &reply) {
* @param key key of value
* @return value in string format
*/
-QString ComUtils::getDataValueStr(const QString &key) const {
- if (is_good) {
- auto k_byte_array = key.toUtf8();
- if (dataVal.HasMember(k_byte_array.data())) {
- return dataVal[k_byte_array.data()].GetString();
- } else return {};
- } else return {};
+QString GpgFrontend::ComUtils::getDataValueStr(const QString &key) const {
+ if (is_good) {
+ auto k_byte_array = key.toUtf8();
+ if (dataVal.HasMember(k_byte_array.data())) {
+ return dataVal[k_byte_array.data()].GetString();
+ } else
+ return {};
+ } else
+ return {};
}
/**
@@ -111,87 +117,97 @@ QString ComUtils::getDataValueStr(const QString &key) const {
* @param type service which server provides
* @return url
*/
-QString ComUtils::getUrl(ComUtils::ServiceType type) const {
- auto host = settings.value("general/currentGpgfrontendServer",
- "service.gpgfrontend.pub").toString();
-
- auto protocol = QString();
- // Localhost Debug Server
- if (host == "localhost") protocol = "http://";
- else protocol = "https://";
-
- auto url = protocol + host + ":9049/";
-
- switch (type) {
- case GetServiceToken:
- url += "/user";
- break;
- case ShortenCryptText:
- url += "/text/new";
- break;
- case GetFullCryptText:
- url += "/text/get";
- break;
- case UploadPubkey:
- url += "/key/upload";
- break;
- case GetPubkey:
- url += "/key/get";
- break;
- }
-
- qDebug() << "ComUtils getUrl" << url;
-
- return url;
+QString GpgFrontend::ComUtils::getUrl(ComUtils::ServiceType type) const {
+ auto host =
+ settings
+ .value("general/currentGpgfrontendServer", "service.gpgfrontend.pub")
+ .toString();
+
+ auto protocol = QString();
+ // Localhost Debug Server
+ if (host == "localhost")
+ protocol = "http://";
+ else
+ protocol = "https://";
+
+ auto url = protocol + host + ":9049/";
+
+ switch (type) {
+ case GetServiceToken:
+ url += "/user";
+ break;
+ case ShortenCryptText:
+ url += "/text/new";
+ break;
+ case GetFullCryptText:
+ url += "/text/get";
+ break;
+ case UploadPubkey:
+ url += "/key/upload";
+ break;
+ case GetPubkey:
+ url += "/key/get";
+ break;
+ }
+
+ qDebug() << "ComUtils getUrl" << url;
+
+ return url;
}
-bool ComUtils::checkDataValueStr(const QString &key) const {
- auto key_byte_array_data = key.toUtf8().constData();
- if (is_good) {
- return dataVal.HasMember(key_byte_array_data) && dataVal[key_byte_array_data].IsString();
- } else return false;
+bool GpgFrontend::ComUtils::checkDataValueStr(const QString &key) const {
+ auto key_byte_array_data = key.toUtf8().constData();
+ if (is_good) {
+ return dataVal.HasMember(key_byte_array_data) &&
+ dataVal[key_byte_array_data].IsString();
+ } else
+ return false;
}
-bool ComUtils::checkServiceTokenFormat(const QString &uuid) const {
- return re_uuid.match(uuid).hasMatch();
+bool GpgFrontend::ComUtils::checkServiceTokenFormat(const QString &uuid) const {
+ return re_uuid.match(uuid).hasMatch();
}
-QByteArray ComUtils::getSignStringBase64(GpgME::GpgContext *ctx, const QString &str, const GpgKey &key) {
- QVector<GpgKey> keys{key};
- QByteArray outSignText;
- auto signData = str.toUtf8();
-
- // The use of multi-threading brings an improvement in UI smoothness
- gpgme_error_t error;
- auto thread = QThread::create([&]() {
- error = ctx->sign(keys, signData, &outSignText, GPGME_SIG_MODE_NORMAL, nullptr, false);
- });
- thread->start();
- while (thread->isRunning()) QApplication::processEvents();
- thread->deleteLater();
-
- return outSignText.toBase64();
+QByteArray GpgFrontend::ComUtils::getSignStringBase64(
+ GpgFrontend::GpgContext *ctx, const QString &str, const GpgKey &key) {
+ std::vector<GpgKey> keys{key};
+ QByteArray outSignText;
+ auto signData = str.toUtf8();
+
+ // The use of multi-threading brings an improvement in UI smoothness
+ gpgme_error_t error;
+ auto thread = QThread::create([&]() {
+ error = ctx->sign(keys, signData, &outSignText, GPGME_SIG_MODE_NORMAL,
+ nullptr, false);
+ });
+ thread->start();
+ while (thread->isRunning()) QApplication::processEvents();
+ thread->deleteLater();
+
+ return outSignText.toBase64();
}
-const rapidjson::Value &ComUtils::getDataValue(const QString &key) const {
- if (is_good) {
- auto k_byte_array = key.toUtf8();
- if (dataVal.HasMember(k_byte_array.data())) {
- return dataVal[k_byte_array.data()];
- }
+const rapidjson::Value &GpgFrontend::ComUtils::getDataValue(
+ const QString &key) const {
+ if (is_good) {
+ auto k_byte_array = key.toUtf8();
+ if (dataVal.HasMember(k_byte_array.data())) {
+ return dataVal[k_byte_array.data()];
}
- throw std::runtime_error("Inner Error");
+ }
+ throw std::runtime_error("Inner Error");
}
-bool ComUtils::checkDataValue(const QString &key) const{
- auto key_byte_array_data = key.toUtf8().constData();
- if (is_good) {
- return dataVal.HasMember(key_byte_array_data);
- } else return false;
+bool GpgFrontend::ComUtils::checkDataValue(const QString &key) const {
+ auto key_byte_array_data = key.toUtf8().constData();
+ if (is_good) {
+ return dataVal.HasMember(key_byte_array_data);
+ } else
+ return false;
}
-void ComUtils::clear() {
- this->dataVal.Clear();
- this->replyDoc.Clear();
- is_good = false;
+void GpgFrontend::ComUtils::clear() {
+ this->dataVal.Clear();
+ this->replyDoc.Clear();
+ is_good = false;
} \ No newline at end of file
diff --git a/src/server/ComUtils.h b/src/server/ComUtils.h
new file mode 100644
index 00000000..f281f256
--- /dev/null
+++ b/src/server/ComUtils.h
@@ -0,0 +1,88 @@
+/**
+ * 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.
+ *
+ */
+
+#ifndef GPGFRONTEND_ZH_CN_TS_COMUTILS_H
+#define GPGFRONTEND_ZH_CN_TS_COMUTILS_H
+
+#include "GpgFrontend.h"
+#include "gpg/GpgContext.h"
+#include "rapidjson/document.h"
+
+namespace GpgFrontend {
+
+class ComUtils : public QWidget {
+ Q_OBJECT
+ public:
+ enum ServiceType {
+ GetServiceToken,
+ ShortenCryptText,
+ GetFullCryptText,
+ UploadPubkey,
+ GetPubkey
+ };
+
+ explicit ComUtils(QWidget *parent)
+ : QWidget(parent),
+ appPath(qApp->applicationDirPath()),
+ settings(RESOURCE_DIR(appPath) + "/conf/gpgfrontend.ini",
+ QSettings::IniFormat) {}
+
+ [[nodiscard]] QString getUrl(ServiceType type) const;
+
+ bool checkServerReply(const QByteArray &reply);
+
+ [[nodiscard]] QString getDataValueStr(const QString &key) const;
+
+ [[nodiscard]] bool checkDataValueStr(const QString &key) const;
+
+ [[nodiscard]] const rapidjson::Value &getDataValue(const QString &key) const;
+
+ [[nodiscard]] bool checkDataValue(const QString &key) const;
+
+ [[nodiscard]] bool checkServiceTokenFormat(const QString &serviceToken) const;
+
+ static QByteArray getSignStringBase64(GpgFrontend::GpgContext *ctx,
+ const QString &str, const GpgKey &key);
+
+ [[nodiscard]] bool good() const { return is_good; }
+
+ QNetworkAccessManager &getNetworkManager() { return networkMgr; }
+
+ void clear();
+
+ private:
+ QString appPath;
+ QSettings settings;
+ rapidjson::Document replyDoc;
+ rapidjson::Value dataVal;
+ QNetworkAccessManager networkMgr;
+ QRegularExpression re_uuid{
+ R"(\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b)"};
+
+ bool is_good = false;
+};
+
+} // namespace GpgFrontend
+
+#endif // GPGFRONTEND_ZH_CN_TS_COMUTILS_H
diff --git a/src/server/api/PubkeyGetter.cpp b/src/server/api/PubkeyGetter.cpp
index 2ba55d11..e2cb8708 100644
--- a/src/server/api/PubkeyGetter.cpp
+++ b/src/server/api/PubkeyGetter.cpp
@@ -1,7 +1,7 @@
/**
- * This file is part of GPGFrontend.
+ * This file is part of GpgFrontend.
*
- * GPGFrontend is free software: you can redistribute it and/or modify
+ * 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.
@@ -24,73 +24,72 @@
#include "server/api/PubkeyGetter.h"
-PubkeyGetter::PubkeyGetter(GpgME::GpgContext *ctx, const QVector<QString> &fprs) : BaseAPI(ComUtils::GetPubkey),
- mCtx(ctx), mFprs(fprs) {
-}
+PubkeyGetter::PubkeyGetter(GpgFrontend::GpgContext *ctx,
+ const QVector<QString> &fprs)
+ : BaseAPI(ComUtils::GetPubkey), mCtx(ctx), mFprs(fprs) {}
void PubkeyGetter::construct_json() {
- document.SetArray();
- QStringList keyIds;
+ document.SetArray();
+ QStringList keyIds;
- rapidjson::Document::AllocatorType &allocator = document.GetAllocator();
+ rapidjson::Document::AllocatorType &allocator = document.GetAllocator();
- for (const auto &fprStr : mFprs) {
- rapidjson::Value fpr;
+ for (const auto &fprStr : mFprs) {
+ rapidjson::Value fpr;
- auto fprByteArray = fprStr.toUtf8();
- fpr.SetString(fprByteArray.constData(), fprByteArray.count());
+ auto fprByteArray = fprStr.toUtf8();
+ fpr.SetString(fprByteArray.constData(), fprByteArray.count());
- document.PushBack(fpr, allocator);
- keyIds.clear();
- }
+ document.PushBack(fpr, allocator);
+ keyIds.clear();
+ }
}
void PubkeyGetter::deal_reply() {
+ const auto &utils = getUtils();
+
+ /**
+ * {
+ * "pubkeys" : [
+ * {
+ * "publicKey" : ...,
+ * "fpr" : ...,
+ * "sha" : ...
+ * },
+ * ...
+ * ]
+ * }
+ */
+
+ if (!utils.checkDataValue("pubkeys")) {
+ QMessageBox::critical(nullptr, _("Error"),
+ _("The communication content with the server does "
+ "not meet the requirements"));
+ } else {
+ auto &pubkeys = utils.getDataValue("pubkeys");
+ qDebug() << "Pubkey Getter" << pubkeys.IsArray()
+ << pubkeys.GetArray().Size();
+ if (pubkeys.IsArray()) {
+ for (const auto &pubkey : pubkeys.GetArray()) {
+ if (pubkey.IsObject() && pubkey.HasMember("publicKey") &&
+ pubkey.HasMember("fpr") && pubkey.HasMember("sha") &&
+ pubkey["publicKey"].IsString() && pubkey["fpr"].IsString() &&
+ pubkey["sha"].IsString()) {
+ auto pubkeyData = QString(pubkey["publicKey"].GetString());
+
+ QCryptographicHash shaGen(QCryptographicHash::Sha256);
+ shaGen.addData(pubkeyData.toUtf8());
+
+ if (shaGen.result().toHex() == pubkey["sha"].GetString()) {
+ mCtx->importKey(pubkeyData.toUtf8());
+ }
+ }
+ }
- const auto &utils = getUtils();
-
- /**
- * {
- * "pubkeys" : [
- * {
- * "publicKey" : ...,
- * "fpr" : ...,
- * "sha" : ...
- * },
- * ...
- * ]
- * }
- */
-
- if (!utils.checkDataValue("pubkeys")) {
- QMessageBox::critical(nullptr, tr("Error"),
- tr("The communication content with the server does not meet the requirements"));
} else {
- auto &pubkeys = utils.getDataValue("pubkeys");
- qDebug() << "Pubkey Getter" << pubkeys.IsArray() << pubkeys.GetArray().Size();
- if (pubkeys.IsArray()) {
- for (const auto &pubkey : pubkeys.GetArray()) {
- if (pubkey.IsObject()
- && pubkey.HasMember("publicKey") && pubkey.HasMember("fpr") && pubkey.HasMember("sha")
- && pubkey["publicKey"].IsString() && pubkey["fpr"].IsString() && pubkey["sha"].IsString()) {
-
- auto pubkeyData = QString(pubkey["publicKey"].GetString());
-
- QCryptographicHash shaGen(QCryptographicHash::Sha256);
- shaGen.addData(pubkeyData.toUtf8());
-
- if (shaGen.result().toHex() == pubkey["sha"].GetString()) {
- mCtx->importKey(pubkeyData.toUtf8());
- }
-
- }
- }
-
- } else {
- QMessageBox::critical(nullptr, tr("Error"),
- tr("The communication content with the server does not meet the requirements"));
- }
+ QMessageBox::critical(nullptr, _("Error"),
+ _("The communication content with the server does "
+ "not meet the requirements"));
}
+ }
}
-
-
diff --git a/src/server/api/PubkeyGetter.h b/src/server/api/PubkeyGetter.h
new file mode 100644
index 00000000..6a3d50e9
--- /dev/null
+++ b/src/server/api/PubkeyGetter.h
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ *
+ */
+
+#ifndef GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H
+#define GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H
+
+#include "GpgFrontend.h"
+#include "gpg/GpgContext.h"
+#include "server/BaseAPI.h"
+
+class ComUtils;
+
+/**
+ * Get and Import Pubkey from server
+ */
+class PubkeyGetter : public BaseAPI {
+ public:
+ PubkeyGetter(GpgFrontend::GpgContext *ctx, const QVector<QString> &fprs);
+
+ private:
+ GpgFrontend::GpgContext *mCtx;
+
+ const QVector<QString> &mFprs;
+
+ protected:
+ void construct_json() final;
+
+ void deal_reply() final;
+};
+
+#endif // GPGFRONTEND_ZH_CN_TS_PUBKEYGETTER_H
diff --git a/src/server/api/PubkeyUploader.cpp b/src/server/api/PubkeyUploader.cpp
index c6101c65..35f764d8 100644
--- a/src/server/api/PubkeyUploader.cpp
+++ b/src/server/api/PubkeyUploader.cpp
@@ -1,7 +1,7 @@
/**
- * This file is part of GPGFrontend.
+ * This file is part of GpgFrontend.
*
- * GPGFrontend is free software: you can redistribute it and/or modify
+ * 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.
@@ -24,83 +24,83 @@
#include "server/api/PubkeyUploader.h"
-PubkeyUploader::PubkeyUploader(GpgME::GpgContext *ctx, const QVector<GpgKey> &keys) : BaseAPI(ComUtils::UploadPubkey),
- mCtx(ctx),
- mKeys(keys) {
-}
+PubkeyUploader::PubkeyUploader(GpgFrontend::GpgContext *ctx,
+ const QVector<GpgKey> &keys)
+ : BaseAPI(ComUtils::UploadPubkey), mCtx(ctx), mKeys(keys) {}
void PubkeyUploader::construct_json() {
- document.SetArray();
- QStringList keyIds;
- QCryptographicHash shaGen(QCryptographicHash::Sha256);
-
- auto &allocator = document.GetAllocator();
-
- QVector<QByteArray> keysData;
- for (const auto &key : mKeys) {
- QByteArray keyDataBuf;
- keyIds << key.id;
-
- // The use of multi-threading brings an improvement in UI smoothness
- gpgme_error_t error;
- auto thread = QThread::create([&]() {
- error = mCtx->exportKeys(&keyIds, &keyDataBuf);
- });
- thread->start();
- while (thread->isRunning()) QApplication::processEvents();
- thread->deleteLater();
- keysData.push_back(keyDataBuf);
- keyIds.clear();
- }
-
- int index = 0;
- for (const auto &keyData : keysData) {
- rapidjson::Value publicKeyObj, pubkey, sha, signedFpr;
-
- shaGen.addData(keyData);
- auto shaStr = shaGen.result().toHex();
- shaGen.reset();
-
- auto signFprStr = ComUtils::getSignStringBase64(mCtx, mKeys[index].fpr, mKeys[index]);
- qDebug() << "signFprStr" << signFprStr;
-
- pubkey.SetString(keyData.data(), keyData.count(), allocator);
- sha.SetString(shaStr.data(), shaStr.count(), allocator);
- signedFpr.SetString(signFprStr.data(), signFprStr.count(), allocator);
-
- publicKeyObj.SetObject();
- publicKeyObj.AddMember("publicKey", pubkey, allocator);
- publicKeyObj.AddMember("sha", sha, allocator);
- publicKeyObj.AddMember("signedFpr", signedFpr, allocator);
-
- document.PushBack(publicKeyObj, allocator);
- index++;
- }
+ document.SetArray();
+ QStringList keyIds;
+ QCryptographicHash shaGen(QCryptographicHash::Sha256);
+
+ auto &allocator = document.GetAllocator();
+
+ QVector<QByteArray> keysData;
+ for (const auto &key : mKeys) {
+ QByteArray keyDataBuf;
+ keyIds << key.id;
+
+ // The use of multi-threading brings an improvement in UI smoothness
+ gpgme_error_t error;
+ auto thread = QThread::create(
+ [&]() { error = mCtx->exportKeys(&keyIds, &keyDataBuf); });
+ thread->start();
+ while (thread->isRunning()) QApplication::processEvents();
+ thread->deleteLater();
+ keysData.push_back(keyDataBuf);
+ keyIds.clear();
+ }
+
+ int index = 0;
+ for (const auto &keyData : keysData) {
+ rapidjson::Value publicKeyObj, pubkey, sha, signedFpr;
+
+ shaGen.addData(keyData);
+ auto shaStr = shaGen.result().toHex();
+ shaGen.reset();
+
+ auto signFprStr =
+ ComUtils::getSignStringBase64(mCtx, mKeys[index].fpr, mKeys[index]);
+ qDebug() << "signFprStr" << signFprStr;
+
+ pubkey.SetString(keyData.data(), keyData.count(), allocator);
+ sha.SetString(shaStr.data(), shaStr.count(), allocator);
+ signedFpr.SetString(signFprStr.data(), signFprStr.count(), allocator);
+
+ publicKeyObj.SetObject();
+ publicKeyObj.AddMember("publicKey", pubkey, allocator);
+ publicKeyObj.AddMember("sha", sha, allocator);
+ publicKeyObj.AddMember("signedFpr", signedFpr, allocator);
+
+ document.PushBack(publicKeyObj, allocator);
+ index++;
+ }
}
void PubkeyUploader::deal_reply() {
-
- const auto &utils = getUtils();
-
- /**
- * {
- * "strings" : [
- * "...",
- * "..."
- * ]
- * }
- */
-
- if (!utils.checkDataValue("strings")) {
- QMessageBox::critical(nullptr, tr("Error"),
- tr("The communication content with the server does not meet the requirements"));
+ const auto &utils = getUtils();
+
+ /**
+ * {
+ * "strings" : [
+ * "...",
+ * "..."
+ * ]
+ * }
+ */
+
+ if (!utils.checkDataValue("strings")) {
+ QMessageBox::critical(nullptr, _("Error"),
+ _("The communication content with the server does "
+ "not meet the requirements"));
+ } else {
+ auto &strings = utils.getDataValue("strings");
+ qDebug() << "Pubkey Uploader" << strings.IsArray()
+ << strings.GetArray().Size();
+ if (strings.IsArray() && strings.GetArray().Size() == mKeys.size()) {
+ good = true;
} else {
- auto &strings = utils.getDataValue("strings");
- qDebug() << "Pubkey Uploader" << strings.IsArray() << strings.GetArray().Size();
- if (strings.IsArray() && strings.GetArray().Size() == mKeys.size()) {
- good = true;
- } else {
- good = false;
- }
+ good = false;
}
+ }
}
diff --git a/src/server/api/PubkeyUploader.h b/src/server/api/PubkeyUploader.h
new file mode 100644
index 00000000..efad27ac
--- /dev/null
+++ b/src/server/api/PubkeyUploader.h
@@ -0,0 +1,51 @@
+/**
+ * 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.
+ *
+ */
+
+#ifndef GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H
+#define GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H
+
+#include "GpgFrontend.h"
+#include "gpg/GpgContext.h"
+#include "rapidjson/document.h"
+#include "server/BaseAPI.h"
+
+/**
+ * Upload pubkey into server
+ */
+class PubkeyUploader : public BaseAPI {
+ public:
+ PubkeyUploader(GpgFrontend::GpgContext *ctx, const QVector<GpgKey> &keys);
+
+ private:
+ const QVector<GpgKey> &mKeys;
+
+ GpgFrontend::GpgContext *mCtx;
+
+ protected:
+ void construct_json() final;
+
+ void deal_reply() final;
+};
+
+#endif // GPGFRONTEND_ZH_CN_TS_PUBKEYUPLOADER_H