File indexing completed on 2024-05-12 13:54:24
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 }