diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-06-12 23:47:17 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-06-29 14:09:46 +0200 |
| commit | 05b2584fa4d773f5a88ed3ce98f5dd8304e11c34 (patch) | |
| tree | f72e73c3259b8100e886f49f67ecc669b7667502 /credentials.cpp | |
| parent | 3b8fafc4122848219898245d52dabd669cacb4ba (diff) | |
First commit
Diffstat (limited to 'credentials.cpp')
| -rw-r--r-- | credentials.cpp | 103 |
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); +} |
