File indexing completed on 2024-04-28 05:50:08

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  */
0005 #include "password.h"
0006 
0007 #include "../secrets/secrets.h"
0008 #include "../logging_p.h"
0009 
0010 KEYSMITH_LOGGER(logger, ".model.password")
0011 
0012 namespace model
0013 {
0014     PasswordRequest::PasswordRequest(accounts::AccountSecret *secret, QObject *parent) :
0015         QObject(parent), m_secret(secret), m_previous(false), m_haveKey(false), m_havePassword(false)
0016     {
0017         QObject::connect(m_secret, &accounts::AccountSecret::existingPasswordNeeded, this, &PasswordRequest::setPreviouslyDefined);
0018         QObject::connect(m_secret, &accounts::AccountSecret::newPasswordNeeded, this, &PasswordRequest::setNewPasswordNeeded);
0019         QObject::connect(m_secret, &accounts::AccountSecret::passwordAvailable, this, &PasswordRequest::setPasswordAvailable);
0020         QObject::connect(m_secret, &accounts::AccountSecret::keyAvailable, this, &PasswordRequest::setKeyAvailable);
0021         QObject::connect(m_secret, &accounts::AccountSecret::keyFailed, this, &PasswordRequest::setPasswordRejected);
0022         m_previous = secret->isExistingPasswordRequested();
0023         m_firstRun = secret->isNewPasswordRequested();
0024         m_haveKey = secret->isKeyAvailable();
0025         m_havePassword = secret->isPasswordAvailable();
0026     }
0027 
0028     bool PasswordRequest::firstRun(void) const
0029     {
0030         return m_firstRun;
0031     }
0032 
0033     bool PasswordRequest::previouslyDefined(void) const
0034     {
0035         return m_previous;
0036     }
0037 
0038     bool PasswordRequest::keyAvailable(void) const
0039     {
0040         return m_haveKey;
0041     }
0042 
0043     bool PasswordRequest::passwordProvided(void) const
0044     {
0045         return m_havePassword;
0046     }
0047 
0048     bool PasswordRequest::provideBothPasswords(QString password, QString other)
0049     {
0050         if (password != other || password.isEmpty()) {
0051             qCDebug(logger) << "Not applying new password(s): passwords must match and must not be empty";
0052             return false;
0053         }
0054 
0055         if (m_previous) {
0056             qCDebug(logger) << "Ignoring new password(s): function should not be used to unlock existing account secrets";
0057             return false;
0058         }
0059 
0060         std::optional<secrets::KeyDerivationParameters> params = secrets::KeyDerivationParameters::create();
0061         if (!params) {
0062             qCDebug(logger) << "Unable apply new password(s): failed to create default key derivation parameters";
0063             return false;
0064         }
0065 
0066         if (m_secret->answerNewPassword(password, *params)) {
0067             other.fill(QLatin1Char('*'), -1);
0068             return true;
0069         }
0070 
0071         qCDebug(logger) << "Failed to apply new password(s)";
0072         return false;
0073     }
0074 
0075     bool PasswordRequest::providePassword(QString password)
0076     {
0077         if (password.isEmpty()) {
0078             qCDebug(logger) << "Not applying password: passwords must not be empty";
0079             return false;
0080         }
0081 
0082         if (!m_previous) {
0083             qCDebug(logger) << "Ignoring password: function should not be used to set up new account secrets";
0084             return false;
0085         }
0086 
0087         if (m_secret->answerExistingPassword(password)) {
0088             password.fill(QLatin1Char('*'), -1);
0089             return true;
0090         }
0091 
0092         qCDebug(logger) << "Failed to apply password for existing account secrets";
0093         return false;
0094     }
0095 
0096     void PasswordRequest::setKeyAvailable(void)
0097     {
0098         if (!m_haveKey) {
0099             m_haveKey = true;
0100             Q_EMIT passwordAccepted();
0101         } else {
0102             qCDebug(logger) << "Ignored signal: already marked key as available";
0103         }
0104     }
0105 
0106     void PasswordRequest::setPasswordAvailable(void)
0107     {
0108         if (!m_havePassword) {
0109             m_havePassword = true;
0110             Q_EMIT passwordStateChanged();
0111         } else {
0112             qCDebug(logger) << "Ignored signal: already marked password as available";
0113         }
0114     }
0115 
0116     void PasswordRequest::setPasswordRejected(void)
0117     {
0118         if (m_havePassword) {
0119             m_havePassword = false;
0120             Q_EMIT passwordStateChanged();
0121             Q_EMIT passwordRejected();
0122         } else {
0123             qCDebug(logger) << "Ignored signal: already marked password as rejected";
0124         }
0125     }
0126 
0127     void PasswordRequest::setPreviouslyDefined(void)
0128     {
0129         if (!m_previous) {
0130             m_previous = true;
0131             Q_EMIT passwordRequestChanged();
0132             Q_EMIT passwordExists();
0133         } else {
0134             qCDebug(logger) << "Ignored signal: already marked password for existing secrets";
0135         }
0136     }
0137 
0138     void PasswordRequest::setNewPasswordNeeded(void)
0139     {
0140         if (!m_firstRun) {
0141             m_firstRun = true;
0142             Q_EMIT passwordRequestChanged();
0143             Q_EMIT newPasswordNeeded();
0144         } else {
0145             qCDebug(logger) << "Ignored signal: already marked password for first run/setup of secrets";
0146         }
0147     }
0148 }