From 6ecc6b6f0272a47d41ce5d619eaa779a29fcf9df Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Thu, 29 Jun 2023 14:10:06 +0200 Subject: WIP OMEMO --- trust_db.cpp | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 trust_db.cpp (limited to 'trust_db.cpp') diff --git a/trust_db.cpp b/trust_db.cpp new file mode 100644 index 0000000..d61397c --- /dev/null +++ b/trust_db.cpp @@ -0,0 +1,246 @@ +#include "trust_db.h" +#include +#include +#include +#include +#include +#include +#include + +TrustDb::TrustDb(const QString &jid) : + jid(jid) +{ +} + +static QString toString(const QXmpp::TrustSecurityPolicy securityPolicy) +{ + switch (securityPolicy) + { + case QXmpp::NoSecurityPolicy: + return "NoSecurityPolicy"; + + case QXmpp::Toakafa: + return "Toakafa"; + } + + return "unknown"; +} + +static int toSecurityPolicy(const QString &s, + QXmpp::TrustSecurityPolicy &securityPolicy) +{ + if (s == "NoSecurityPolicy") + { + securityPolicy = QXmpp::NoSecurityPolicy; + return 0; + } + else if (s == "Toakafa") + { + securityPolicy = QXmpp::Toakafa; + return 0; + } + + return -1; +} + +QString TrustDb::service() const +{ + return "xxcc/trust/" + jid; +} + +QXmppTask TrustDb::setSecurityPolicy(const QString &encryption, + const QXmpp::TrustSecurityPolicy securityPolicy) +{ + QKeychain::WritePasswordJob job(service()); + QEventLoop loop; + + job.setKey("securityPolicy/" + encryption); + job.setTextData(toString(securityPolicy)); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + if (job.error()) + std::cerr << "Failed to store security policy: " + << qPrintable(job.errorString()) << std::endl; + + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::resetSecurityPolicy(const QString &encryption) +{ + QKeychain::DeletePasswordJob job(service()); + QEventLoop loop; + + job.setKey("securityPolicy/" + encryption); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + if (job.error()) + std::cerr << "Failed to reset security policy: " + << qPrintable(job.errorString()) << std::endl; + + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::securityPolicy( + const QString &encryption) +{ + QKeychain::ReadPasswordJob job(service()); + QEventLoop loop; + + job.setKey("securityPolicy/" + encryption); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + if (job.error()) + std::cerr << "Failed to read security policy: " + << qPrintable(job.errorString()) << std::endl; + + QXmpp::TrustSecurityPolicy policy = QXmpp::Toakafa; + const QString data = job.textData(); + + if (toSecurityPolicy(data, policy)) + std::cerr << "Invalid security policy " << qPrintable(data) + << std::endl; + + return QXmpp::Private::makeReadyTask(QXmpp::TrustSecurityPolicy(policy)); +} + +QXmppTask TrustDb::setOwnKey(const QString &encryption, + const QByteArray &keyId) +{ + QKeychain::WritePasswordJob job(service()); + QEventLoop loop; + + job.setKey("key/" + encryption); + job.setBinaryData(keyId); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + if (job.error()) + std::cerr << "Failed to store own key: " + << qPrintable(job.errorString()) << std::endl; + + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::resetOwnKey(const QString &encryption) +{ + QKeychain::DeletePasswordJob job(service()); + QEventLoop loop; + + job.setKey("key/" + encryption); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + if (job.error()) + std::cerr << "Failed to reset own key: " + << qPrintable(job.errorString()) << std::endl; + + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::ownKey(const QString &encryption) +{ + QKeychain::ReadPasswordJob job(service()); + QEventLoop loop; + + job.setKey("key/" + encryption); + job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); + job.start(); + loop.exec(); + + QByteArray ret; + + if (job.error()) + std::cerr << "Failed to read own key: " + << qPrintable(job.errorString()) << std::endl; + else + ret = job.binaryData(); + + return QXmpp::Private::makeReadyTask(QByteArray(ret)); +} + +QXmppTask TrustDb::addKeys(const QString &encryption, + const QString &keyOwnerJid, const QList &keyIds, + const QXmpp::TrustLevel trustLevel) +{ + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::removeKeys(const QString &encryption, + const QList &keyIds) +{ + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::removeKeys(const QString &encryption, + const QString &keyOwnerJid) +{ + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask TrustDb::removeKeys(const QString &encryption) +{ + return QXmpp::Private::makeReadyTask(); +} + +QXmppTask>> TrustDb::keys(const QString &encryption, + const QXmpp::TrustLevels trustLevels) +{ + return QXmpp::Private::makeReadyTask(QHash>()); +} + +QXmppTask>> TrustDb::keys(const QString &encryption, + const QList &keyOwnerJids, + const QXmpp::TrustLevels trustLevels) +{ + return QXmpp::Private::makeReadyTask(QHash>()); +} + +QXmppTask TrustDb::hasKey(const QString &encryption, + const QString &keyOwnerJid, QXmpp::TrustLevels trustLevels) +{ + return QXmpp::Private::makeReadyTask(bool()); +} + +QXmppTask>> TrustDb::setTrustLevel( + const QString &encryption, + const QMultiHash &keyIds, + const QXmpp::TrustLevel trustLevel) +{ + return QXmpp::Private::makeReadyTask(QHash>()); +} + +QXmppTask>> TrustDb::setTrustLevel( + const QString &encryption, + const QList &keyOwnerJids, + const QXmpp::TrustLevel oldTrustLevel, + const QXmpp::TrustLevel newTrustLevel) +{ + return QXmpp::Private::makeReadyTask(QHash>()); +} + +QXmppTask TrustDb::trustLevel(const QString &encryption, + const QString &keyOwnerJid, const QByteArray &keyId) +{ + return QXmpp::Private::makeReadyTask(QXmpp::TrustLevel()); +} + +QXmppTask TrustDb::resetAll(const QString &encryption) +{ + return QXmpp::Private::makeReadyTask(); +} -- cgit v1.2.3