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 }