aboutsummaryrefslogtreecommitdiff
path: root/credentials.cpp
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-06-12 23:47:17 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-06-29 14:09:46 +0200
commit05b2584fa4d773f5a88ed3ce98f5dd8304e11c34 (patch)
treef72e73c3259b8100e886f49f67ecc669b7667502 /credentials.cpp
parent3b8fafc4122848219898245d52dabd669cacb4ba (diff)
First commit
Diffstat (limited to 'credentials.cpp')
-rw-r--r--credentials.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/credentials.cpp b/credentials.cpp
new file mode 100644
index 0000000..8d6a01b
--- /dev/null
+++ b/credentials.cpp
@@ -0,0 +1,103 @@
+#include "credentials.h"
+#include <QEventLoop>
+#include <qt5keychain/keychain.h>
+#include <QXmppConfiguration.h>
+#include <iostream>
+
+static const QString service = "xxcc", sep = ";";
+
+QList<Credentials::Pair> Credentials::load()
+{
+ const QStringList users = storedUsers();
+ QList<Pair> ret;
+
+ for (const auto &user : users)
+ {
+ QKeychain::ReadPasswordJob job(service);
+ QEventLoop loop;
+
+ job.setKey(user);
+ job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
+ job.start();
+ loop.exec();
+
+ const QString pwd = job.textData();
+
+ if (job.error())
+ std::cerr << "Failed to retrieve password for " << qPrintable(user)
+ << ": " << qPrintable(job.errorString()) << std::endl;
+ else
+ ret.append(Pair(user, pwd));
+ }
+
+ return ret;
+}
+
+void Credentials::store(Client *c)
+{
+ QKeychain::WritePasswordJob job(service);
+ const QXmppConfiguration &cfg = c->configuration();
+ const QString user = cfg.jidBare();
+ QEventLoop loop;
+
+ job.setKey(user);
+ job.setTextData(cfg.password());
+ job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
+ job.start();
+ loop.exec();
+
+ if (job.error())
+ std::cerr << "Failed to store password: "
+ << qPrintable(job.errorString()) << std::endl;
+ else
+ storeUser(user);
+}
+
+void Credentials::storeUser(const QString &user)
+{
+ QString list = storedUsersList();
+ QKeychain::WritePasswordJob job(service);
+ QEventLoop loop;
+
+ if (!list.isEmpty())
+ list += sep;
+
+ list += user;
+
+ job.setKey("users");
+ job.setTextData(list);
+ job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
+ job.start();
+ loop.exec();
+
+ if (job.error())
+ std::cerr << "Failed to store user: "
+ << qPrintable(job.errorString()) << std::endl;
+}
+
+QString Credentials::storedUsersList()
+{
+ QKeychain::ReadPasswordJob job(service);
+ QString ret;
+ QEventLoop loop;
+
+ job.setKey("users");
+ job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
+ job.start();
+ loop.exec();
+
+ const QString users = job.textData();
+
+ if (job.error())
+ std::cerr << "Failed to retrieve users: "
+ << qPrintable(job.errorString()) << std::endl;
+ else
+ ret = users;
+
+ return ret;
+}
+
+QStringList Credentials::storedUsers()
+{
+ return storedUsersList().split(sep);
+}