File indexing completed on 2024-05-19 05:08:36

0001 /*
0002     SPDX-FileCopyrightText: 2022 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "passstore.h"
0007 #include "config-kmymoney.h"
0008 
0009 // ----------------------------------------------------------------------------
0010 // QT Includes
0011 
0012 #include <QAction>
0013 #include <QDir>
0014 #include <QFileInfo>
0015 #include <QLineEdit>
0016 #include <QTextStream>
0017 
0018 // ----------------------------------------------------------------------------
0019 // KDE Includes
0020 
0021 #include <KLocalizedString>
0022 
0023 // ----------------------------------------------------------------------------
0024 // Project Includes
0025 
0026 #include "icons.h"
0027 #include "kgpgfile.h"
0028 
0029 using namespace Icons;
0030 
0031 class PassStorePrivate
0032 {
0033 public:
0034     explicit PassStorePrivate(PassStore* qq)
0035         : q_ptr(qq)
0036         , m_lineEdit(nullptr)
0037         , m_loadPasswordAction(nullptr)
0038     {
0039     }
0040 
0041     PassStore* q_ptr;
0042     QLineEdit* m_lineEdit;
0043     QAction* m_loadPasswordAction;
0044     QString m_applicationPrefix;
0045     QString m_passwordId;
0046 
0047     QString passwordFile()
0048     {
0049         return QStringLiteral("%1/.password-store/%2/%3.gpg").arg(QDir::home().absolutePath(), m_applicationPrefix, m_passwordId);
0050     }
0051 };
0052 
0053 PassStore::PassStore(QLineEdit* parent, const QString& applicationPrefix, const QString& id)
0054     : QObject(parent)
0055     , d_ptr(new PassStorePrivate(this))
0056 {
0057     Q_D(PassStore);
0058     d->m_lineEdit = parent;
0059     d->m_applicationPrefix = applicationPrefix;
0060     d->m_loadPasswordAction = d->m_lineEdit->addAction(Icons::get(Icon::Vault), QLineEdit::TrailingPosition);
0061     d->m_loadPasswordAction->setToolTip(i18n("Read the password from pass store"));
0062 
0063     setPasswordId(id);
0064 
0065 #ifdef ENABLE_GPG
0066     connect(d->m_loadPasswordAction, &QAction::triggered, this, [&]() {
0067         Q_D(PassStore);
0068         KGPGFile passwordFile(d->passwordFile());
0069         if (passwordFile.open(QIODevice::ReadOnly)) {
0070             QTextStream stream(&passwordFile);
0071             const auto pwd = stream.readLine();
0072             d->m_lineEdit->clear();
0073             d->m_lineEdit->setText(pwd);
0074         }
0075     });
0076 #endif
0077 }
0078 
0079 PassStore::~PassStore()
0080 {
0081     Q_D(PassStore);
0082     delete d;
0083 }
0084 
0085 void PassStore::setPasswordId(const QString& id)
0086 {
0087     Q_D(PassStore);
0088     d->m_passwordId = id;
0089 
0090     // replace directory separators
0091     d->m_passwordId.replace(QLatin1Char('/'), QLatin1Char('_'));
0092     d->m_passwordId.replace(QLatin1Char('\\'), QLatin1Char('_'));
0093 
0094     // control visibility of icon
0095     bool visible = false;
0096 #ifdef ENABLE_GPG
0097     if (KGPGFile::GPGAvailable() && !id.isEmpty()) {
0098         QFileInfo fi(d->passwordFile());
0099         visible = (fi.exists() && fi.isReadable());
0100     }
0101 #endif
0102     d->m_loadPasswordAction->setVisible(visible);
0103 }
0104 
0105 QString PassStore::passwordId() const
0106 {
0107     Q_D(const PassStore);
0108     return d->m_passwordId;
0109 }
0110 
0111 bool PassStore::isActionVisible() const
0112 {
0113     Q_D(const PassStore);
0114     return d->m_loadPasswordAction->isVisible();
0115 }