Compare commits

..

No commits in common. "7238486de0c4f13f61626f0bccfc7502c45f9798" and "b70d73ce9610e415a751c0041368c3c759d12d85" have entirely different histories.

4 changed files with 123 additions and 281 deletions

View File

@ -94,23 +94,6 @@
return ret; \ return ret; \
} }
#define DEFINE_EXECUTE_API_USING_STANDARD_EVEN_HANDLE_MODEL \
EXECUTE_MODULE() { \
auto event_id = event["event_id"]; \
auto it = _gr_module_event_handlers.find(event_id); \
if (it != _gr_module_event_handlers.end()) { \
return it.value()(event); \
} \
CB_ERR(event, -1, QString("unsupported event id: %1").arg(event_id)); \
} \
END_EXECUTE_MODULE()
#define REGISTER_EVENT_HANDLER(event_id, handler) \
static const bool _gv_register_event_handler_by_id_##event_id = [] { \
_gr_module_event_handlers[#event_id] = handler; \
return true; \
}();
inline void MLogDebug(const QString& s) { GFModuleLogDebug(s.toUtf8()); } inline void MLogDebug(const QString& s) { GFModuleLogDebug(s.toUtf8()); }
inline void MLogInfo(const QString& s) { GFModuleLogInfo(s.toUtf8()); } inline void MLogInfo(const QString& s) { GFModuleLogInfo(s.toUtf8()); }
inline void MLogWarn(const QString& s) { GFModuleLogWarn(s.toUtf8()); } inline void MLogWarn(const QString& s) { GFModuleLogWarn(s.toUtf8()); }
@ -138,22 +121,11 @@ inline auto UnStrDup(const char* s) -> QString {
return q_s; return q_s;
} }
inline auto FormatStringHelper(const QString& format,
const std::string& arg) -> QString {
return format.arg(QString::fromStdString(arg));
}
template <typename T> template <typename T>
auto FormatStringHelper(const QString& format, T arg) -> QString { auto FormatStringHelper(const QString& format, T arg) -> QString {
return format.arg(arg); return format.arg(arg);
} }
template <typename... Args>
auto FormatStringHelper(const QString& format, const std::string& arg,
Args... args) -> QString {
return FormatStringHelper(format.arg(QString::fromStdString(arg)), args...);
}
template <typename T, typename... Args> template <typename T, typename... Args>
auto FormatStringHelper(const QString& format, T arg, Args... args) -> QString { auto FormatStringHelper(const QString& format, T arg, Args... args) -> QString {
return FormatStringHelper(format.arg(arg), args...); return FormatStringHelper(format.arg(arg), args...);
@ -163,13 +135,6 @@ inline auto FormatStringHelper(const QString& format) -> QString {
return format; return format;
} }
template <typename T>
inline auto FormatStringHelper(const T& format) ->
typename std::enable_if<std::is_same<T, std::string>::value,
QString>::type {
return FormatStringHelper(QString::fromStdString(format));
}
template <typename... Args> template <typename... Args>
auto FormatString(const QString& format, Args... args) -> QString { auto FormatString(const QString& format, Args... args) -> QString {
return FormatStringHelper(format, args...); return FormatStringHelper(format, args...);

View File

@ -44,23 +44,3 @@
return QMapToGFModuleMetaDataList( \ return QMapToGFModuleMetaDataList( \
{{"Name", (name)}, {"Description", (desc)}, {"Author", (author)}}); \ {{"Name", (name)}, {"Description", (desc)}, {"Author", (author)}}); \
} }
#define GF_MODULE_API_DEFINE_V2(id, name, ver, desc, author) \
auto GFGetModuleGFSDKVersion() -> const char* { \
return DUP(GF_SDK_VERSION_STR); \
} \
auto GFGetModuleQtEnvVersion() -> const char* { \
return DUP(QT_VERSION_STR); \
} \
auto GFGetModuleID() -> const char* { return DUP((id)); } \
auto GFGetModuleVersion() -> const char* { return DUP((ver)); } \
auto GFGetModuleMetaData() -> GFModuleMetaData* { \
return QMapToGFModuleMetaDataList( \
{{"Name", (name)}, {"Description", (desc)}, {"Author", (author)}}); \
} \
using MEvent = QMap<QString, QString>; \
using EventHandler = std::function<int(const MEvent&)>; \
static QMap<QString, EventHandler> Module##nameEventHandlers; \
static QMap<QString, EventHandler>& _gr_module_event_handlers = \
Module##nameEventHandlers; \
DEFINE_EXECUTE_API_USING_STANDARD_EVEN_HANDLE_MODEL

View File

@ -43,144 +43,36 @@
#define VMIME_STATIC #define VMIME_STATIC
#include <vmime/vmime.hpp> #include <vmime/vmime.hpp>
// vmime extend
#include <vmime/contentTypeField.hpp>
#include "GFModuleCommonUtils.hpp" #include "GFModuleCommonUtils.hpp"
#include "GFModuleDefine.h" #include "GFModuleDefine.h"
GF_MODULE_API_DEFINE_V2("com.bktus.gpgfrontend.module.email", "Email", "1.0.0", GF_MODULE_API_DEFINE("com.bktus.gpgfrontend.module.email", "Email", "1.0.0",
"Everything related to E-Mails.", "Saturneric") "Everything related to E-Mails.", "Saturneric")
DEFINE_TRANSLATIONS_STRUCTURE(ModuleEMail); DEFINE_TRANSLATIONS_STRUCTURE(ModuleEMail);
auto inline Q_SC(const std::string& s) -> QString { extern auto CalculateBinaryChacksum(const QString &path)
return QString::fromStdString(s); -> std::optional<QString>;
}
auto GFRegisterModule() -> int { auto GFRegisterModule() -> int {
MLogDebug("email module registering..."); MLogDebug("email module registering...");
LISTEN("EMAIL_VERIFY_EML_DATA"); REGISTER_TRANS_READER();
vmime::datetime dl("Sat, 08 Oct 2005 14:07:52 +0200");
dl.getDay();
return 0; return 0;
} }
auto GFActiveModule() -> int { return 0; } auto GFActiveModule() -> int { return 0; }
REGISTER_EVENT_HANDLER(EMAIL_VERIFY_EML_DATA, [](const MEvent& event) -> int { EXECUTE_MODULE() {
if (event["eml_data"].isEmpty()) CB_ERR(event, -1, "eml_data is empty"); FLOG_DEBUG("email executing, event id: %1", event["event_id"]);
auto data = QByteArray::fromBase64(QString(event["eml_data"]).toLatin1()); CB_SUCC(event);
auto hash = QCryptographicHash::hash(data, QCryptographicHash::Sha1); }
FLOG_DEBUG("E-Mail Raw Data SHA-1 Hash: %1", hash.toHex()); END_EXECUTE_MODULE()
vmime::string vmime_data(data.constData(), data.size());
auto message = vmime::make_shared<vmime::message>();
try {
message->parse(vmime_data);
} catch (const vmime::exception& e) {
FLOG_DEBUG("error when parsing vmime data: %1", e.what());
CB_ERR(event, -2, "error when parsing vmime data");
}
auto header = message->getHeader();
auto content_type_field =
header->getField<vmime::contentTypeField>(vmime::fields::CONTENT_TYPE);
auto content_type_value =
Q_SC(content_type_field->getValue()->generate()).trimmed();
/*
* OpenPGP signed messages are denoted by the "multipart/signed" content type.
*/
if (content_type_value != "multipart/signed")
CB_ERR(event, -2, "Content-Type must be multipart/signed");
auto prm_protocol = content_type_field->getParameter("protocol");
auto prm_protocol_value = Q_SC(prm_protocol->getValue().generate());
/*
* with a "protocol" parameter which MUST have a value of
* "application/pgp-signature"
*/
if (prm_protocol_value != "application/pgp-signature")
CB_ERR(event, -2,
"protocol of Content-Type MUST be application/pgp-signature");
auto body = message->getBody();
auto content_type = body->getContentType();
auto part_count = body->getPartCount();
FLOG_DEBUG("body content type: %1", content_type.generate());
FLOG_DEBUG("body page count: %1", part_count);
/*
* The multipart/signed body MUST consist of exactly two parts.
*/
if (part_count != 2)
CB_ERR(event, -2, "body MUST consist of exactly two parts");
/*
The first part contains the signed data in MIME canonical format,
including a set of appropriate content headers describing the data.
*/
auto part_mime = body->getPartAt(0);
auto part_mime_parse_offset = part_mime->getParsedOffset();
auto part_mime_parse_length = part_mime->getParsedLength();
auto part_mime_content_text = QByteArray::fromStdString(
vmime_data.substr(part_mime_parse_offset, part_mime_parse_length));
FLOG_DEBUG("body part of raw offset: %1, length: %2", part_mime_parse_offset,
part_mime_parse_length);
FLOG_DEBUG("body part of raw content left: %1",
part_mime_content_text.left(64));
FLOG_DEBUG("body part of raw content right: %1",
part_mime_content_text.right(64));
auto part_mime_content_hash = QCryptographicHash::hash(
part_mime_content_text, QCryptographicHash::Sha1);
FLOG_DEBUG("body part of raw content hash: %1",
part_mime_content_hash.toHex());
if (part_mime_content_text.isEmpty())
CB_ERR(event, -2, "mime raw data part is empty");
/*
* The second body MUST contain the OpenPGP digital signature. It MUST
* be labeled with a content type of "application/pgp-signature"
*/
auto part_sign = body->getPartAt(1);
auto part_sign_header = part_sign->getHeader();
auto part_sign_content_type = part_sign_header->ContentType();
auto part_sign_content_type_value =
Q_SC(part_sign_content_type->getValue()->generate());
if (part_sign_content_type_value != "application/pgp-signature")
CB_ERR(
event, -2,
"signature part must have a Content-Type of application/pgp-signature");
auto part_sign_body_content =
QByteArray::fromStdString(part_sign->getBody()->generate());
if (part_sign_body_content.trimmed().isEmpty())
CB_ERR(event, -2, "signature part is empty");
FLOG_DEBUG("body part of signature content: %1", part_sign_body_content);
// callback
CB(event, GFGetModuleID(),
{
{"ret", QString::number(0)},
{"mime", QString::fromLatin1(part_mime_content_text.toBase64())},
{"signature", QString::fromLatin1(part_sign_body_content.toBase64())},
});
return 0;
});
auto GFDeactivateModule() -> int { return 0; } auto GFDeactivateModule() -> int { return 0; }

View File

@ -30,13 +30,13 @@
#include <QtCore> #include <QtCore>
#include "GFModuleCommonUtils.hpp"
#include "GFModuleDefine.h" #include "GFModuleDefine.h"
#include "VKSInterface.h" #include "VKSInterface.h"
GF_MODULE_API_DEFINE_V2("com.bktus.gpgfrontend.module.key_server_sync", GF_MODULE_API_DEFINE("com.bktus.gpgfrontend.module.key_server_sync",
"KeyServerSync", "1.0.0", "KeyServerSync", "1.0.0",
"Sync Information From Trusted Key Server.", "Sync Information From Trusted Key Server.", "Saturneric")
"Saturneric")
auto GFRegisterModule() -> int { auto GFRegisterModule() -> int {
LOG_DEBUG("key server sync module registering"); LOG_DEBUG("key server sync module registering");
@ -51,8 +51,11 @@ auto GFActiveModule() -> int {
return 0; return 0;
} }
REGISTER_EVENT_HANDLER( EXECUTE_MODULE() {
REQUEST_GET_PUBLIC_KEY_BY_FINGERPRINT, [](const MEvent& event) -> int { FLOG_DEBUG("key server sync module executing, event id: %1",
event["event_id"]);
if (event["event_id"] == "REQUEST_GET_PUBLIC_KEY_BY_FINGERPRINT") {
if (event["fingerprint"].isEmpty()) if (event["fingerprint"].isEmpty())
CB_ERR(event, -1, "fingerprint is empty"); CB_ERR(event, -1, "fingerprint is empty");
@ -85,11 +88,11 @@ REGISTER_EVENT_HANDLER(
QObject::connect(vks, &VKSInterface::SignalKeyRetrieved, vks, QObject::connect(vks, &VKSInterface::SignalKeyRetrieved, vks,
&VKSInterface::deleteLater); &VKSInterface::deleteLater);
vks->GetByFingerprint(fingerprint); vks->GetByFingerprint(fingerprint);
return 0;
});
REGISTER_EVENT_HANDLER( return 0;
REQUEST_GET_PUBLIC_KEY_BY_KEY_ID, [](const MEvent& event) -> int { }
if (event["event_id"] == "REQUEST_GET_PUBLIC_KEY_BY_KEY_ID") {
if (event["key_id"].isEmpty()) CB_ERR(event, -1, "key_id is empty"); if (event["key_id"].isEmpty()) CB_ERR(event, -1, "key_id is empty");
QByteArray key_id = event["key_id"].toLatin1(); QByteArray key_id = event["key_id"].toLatin1();
@ -122,10 +125,9 @@ REGISTER_EVENT_HANDLER(
vks->GetByKeyId(key_id); vks->GetByKeyId(key_id);
return 0; return 0;
}); }
REGISTER_EVENT_HANDLER( if (event["event_id"] == "REQUEST_UPLOAD_PUBLIC_KEY") {
REQUEST_UPLOAD_PUBLIC_KEY, [](const MEvent& event) -> int {
if (event["key_text"].isEmpty()) CB_ERR(event, -1, "key_text is empty"); if (event["key_text"].isEmpty()) CB_ERR(event, -1, "key_text is empty");
QByteArray key_text = event["key_text"].toLatin1(); QByteArray key_text = event["key_text"].toLatin1();
@ -140,8 +142,7 @@ REGISTER_EVENT_HANDLER(
{ {
{"ret", QString::number(0)}, {"ret", QString::number(0)},
{"fingerprint", fpr}, {"fingerprint", fpr},
{"status", {"status", QString::fromUtf8(QJsonDocument(status).toJson())},
QString::fromUtf8(QJsonDocument(status).toJson())},
{"token", token}, {"token", token},
}); });
}); });
@ -161,7 +162,11 @@ REGISTER_EVENT_HANDLER(
&VKSInterface::deleteLater); &VKSInterface::deleteLater);
vks->UploadKey(key_text); vks->UploadKey(key_text);
return 0; return 0;
}); }
CB_ERR(event, -1, "the type of this event is not supported");
}
END_EXECUTE_MODULE()
auto GFDeactivateModule() -> int { return 0; } auto GFDeactivateModule() -> int { return 0; }