aboutsummaryrefslogtreecommitdiff
path: root/trust_db.cpp
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-06-29 14:10:06 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-08-30 02:46:41 +0200
commit6ecc6b6f0272a47d41ce5d619eaa779a29fcf9df (patch)
treeb304ad33ecadcd1209347b67d525506356d149f0 /trust_db.cpp
parent48cfe26383feb2fcf6638905060c605af8eb2c69 (diff)
downloadxxcc-6ecc6b6f0272a47d41ce5d619eaa779a29fcf9df.tar.gz
WIP OMEMO
Diffstat (limited to 'trust_db.cpp')
-rw-r--r--trust_db.cpp246
1 files changed, 246 insertions, 0 deletions
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 <QXmppConfiguration.h>
+#include <QXmppFutureUtils_p.h>
+#include <QXmppPromise.h>
+#include <qt5keychain/keychain.h>
+#include <QEventLoop>
+#include <QtConcurrent>
+#include <iostream>
+
+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<void> 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<void> 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<QXmpp::TrustSecurityPolicy> 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<void> 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<void> 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<QByteArray> 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<void> TrustDb::addKeys(const QString &encryption,
+ const QString &keyOwnerJid, const QList<QByteArray> &keyIds,
+ const QXmpp::TrustLevel trustLevel)
+{
+ return QXmpp::Private::makeReadyTask();
+}
+
+QXmppTask<void> TrustDb::removeKeys(const QString &encryption,
+ const QList<QByteArray> &keyIds)
+{
+ return QXmpp::Private::makeReadyTask();
+}
+
+QXmppTask<void> TrustDb::removeKeys(const QString &encryption,
+ const QString &keyOwnerJid)
+{
+ return QXmpp::Private::makeReadyTask();
+}
+
+QXmppTask<void> TrustDb::removeKeys(const QString &encryption)
+{
+ return QXmpp::Private::makeReadyTask();
+}
+
+QXmppTask<QHash<QXmpp::TrustLevel,
+ QMultiHash<QString, QByteArray>>> TrustDb::keys(const QString &encryption,
+ const QXmpp::TrustLevels trustLevels)
+{
+ return QXmpp::Private::makeReadyTask(QHash<QXmpp::TrustLevel,
+ QMultiHash<QString, QByteArray>>());
+}
+
+QXmppTask<QHash<QString,
+ QHash<QByteArray, QXmpp::TrustLevel>>> TrustDb::keys(const QString &encryption,
+ const QList<QString> &keyOwnerJids,
+ const QXmpp::TrustLevels trustLevels)
+{
+ return QXmpp::Private::makeReadyTask(QHash<QString,
+ QHash<QByteArray, QXmpp::TrustLevel>>());
+}
+
+QXmppTask<bool> TrustDb::hasKey(const QString &encryption,
+ const QString &keyOwnerJid, QXmpp::TrustLevels trustLevels)
+{
+ return QXmpp::Private::makeReadyTask(bool());
+}
+
+QXmppTask<QHash<QString,
+ QMultiHash<QString, QByteArray>>> TrustDb::setTrustLevel(
+ const QString &encryption,
+ const QMultiHash<QString, QByteArray> &keyIds,
+ const QXmpp::TrustLevel trustLevel)
+{
+ return QXmpp::Private::makeReadyTask(QHash<QString,
+ QMultiHash<QString, QByteArray>>());
+}
+
+QXmppTask<QHash<QString,
+ QMultiHash<QString, QByteArray>>> TrustDb::setTrustLevel(
+ const QString &encryption,
+ const QList<QString> &keyOwnerJids,
+ const QXmpp::TrustLevel oldTrustLevel,
+ const QXmpp::TrustLevel newTrustLevel)
+{
+ return QXmpp::Private::makeReadyTask(QHash<QString,
+ QMultiHash<QString, QByteArray>>());
+}
+
+QXmppTask<QXmpp::TrustLevel> TrustDb::trustLevel(const QString &encryption,
+ const QString &keyOwnerJid, const QByteArray &keyId)
+{
+ return QXmpp::Private::makeReadyTask(QXmpp::TrustLevel());
+}
+
+QXmppTask<void> TrustDb::resetAll(const QString &encryption)
+{
+ return QXmpp::Private::makeReadyTask();
+}