From 05b2584fa4d773f5a88ed3ce98f5dd8304e11c34 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Mon, 12 Jun 2023 23:47:17 +0200 Subject: First commit --- credentials.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 credentials.cpp (limited to 'credentials.cpp') 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 +#include +#include +#include + +static const QString service = "xxcc", sep = ";"; + +QList Credentials::load() +{ + const QStringList users = storedUsers(); + QList 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); +} -- cgit v1.2.3