File indexing completed on 2024-05-12 05:06:12

0001 /*
0002     SPDX-FileCopyrightText: 2021 Igor Bugaev <freedbrt@gmail.com>
0003     SPDX-FileCopyrightText: 2022 Dawid Wróbel <me@dawidwrobel.com>
0004     SPDX-License-Identifier: BSD-3-Clause
0005 */
0006 
0007 #include <QDebug>
0008 #include <QEventLoop>
0009 
0010 #include "kmmkeychain.h"
0011 
0012 KMMKeychain::KMMKeychain(QObject* parent)
0013     : QObject(parent)
0014     , m_readCredentialJob(QLatin1String("org.kde.kmymoney"))
0015     , m_writeCredentialJob(QLatin1String("org.kde.kmymoney"))
0016     , m_deleteCredentialJob(QLatin1String("org.kde.kmymoney"))
0017 {
0018     m_readCredentialJob.setAutoDelete(false);
0019     m_writeCredentialJob.setAutoDelete(false);
0020     m_deleteCredentialJob.setAutoDelete(false);
0021 }
0022 
0023 void KMMKeychain::readKey(const QString& key)
0024 {
0025     m_readCredentialJob.setKey(key);
0026 
0027     QObject::connect(&m_readCredentialJob, &QKeychain::ReadPasswordJob::finished, this, [=]() {
0028         if (m_readCredentialJob.error()) {
0029             auto errorMessage =
0030                 QString("%1/%2 key read failed: %2").arg(m_readCredentialJob.service(), m_readCredentialJob.key(), m_readCredentialJob.errorString());
0031 
0032             qDebug() << errorMessage;
0033             Q_EMIT error(errorMessage);
0034         } else {
0035             qDebug() << QString("%1/%2 key read succeeded").arg(m_readCredentialJob.service(), m_readCredentialJob.key());
0036             Q_EMIT keyRestored(key, m_readCredentialJob.textData());
0037         }
0038     });
0039 
0040     m_readCredentialJob.start();
0041 }
0042 
0043 QString KMMKeychain::readKeySynchronous(const QString& key)
0044 {
0045     QString value = QString("");
0046 
0047     QEventLoop loop;
0048     connect(this, &KMMKeychain::keyRestored, this, [&](const QString, const QString textData) {
0049         value = textData;
0050     });
0051     connect(this, &KMMKeychain::error, &loop, &QEventLoop::quit);
0052     connect(this, &KMMKeychain::keyRestored, &loop, &QEventLoop::quit);
0053 
0054     readKey(key);
0055     loop.exec();
0056 
0057     return value;
0058 }
0059 
0060 void KMMKeychain::writeKey(const QString& key, const QString& value)
0061 {
0062     m_writeCredentialJob.setKey(key);
0063 
0064     QObject::connect(&m_writeCredentialJob, &QKeychain::WritePasswordJob::finished, this, [=]() {
0065         if (m_writeCredentialJob.error()) {
0066             auto errorMessage =
0067                 QString("%1/%2 key write failed: %2").arg(m_writeCredentialJob.service(), m_writeCredentialJob.key(), m_writeCredentialJob.errorString());
0068 
0069             qDebug() << errorMessage;
0070             Q_EMIT error(errorMessage);
0071         } else {
0072             Q_EMIT keyStored(key);
0073         }
0074     });
0075 
0076     m_writeCredentialJob.setTextData(value);
0077     m_writeCredentialJob.start();
0078 }
0079 
0080 void KMMKeychain::deleteKey(const QString& key)
0081 {
0082     m_deleteCredentialJob.setKey(key);
0083 
0084     QObject::connect(&m_deleteCredentialJob, &QKeychain::DeletePasswordJob::finished, this, [=]() {
0085         if (m_deleteCredentialJob.error()) {
0086             auto errorMessage =
0087                 QString("%1/%2 key delete failed: %2").arg(m_deleteCredentialJob.service(), m_deleteCredentialJob.key(), m_deleteCredentialJob.errorString());
0088 
0089             qDebug() << errorMessage;
0090             Q_EMIT error(errorMessage);
0091         } else {
0092             Q_EMIT keyDeleted(key);
0093         }
0094     });
0095 
0096     m_deleteCredentialJob.start();
0097 }