#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); }