diff --git a/src/browser/BrowserAction.cpp b/src/browser/BrowserAction.cpp index 1ea73b3f..a303df7a 100644 --- a/src/browser/BrowserAction.cpp +++ b/src/browser/BrowserAction.cpp @@ -278,18 +278,18 @@ QJsonObject BrowserAction::handleGetLogins(const QJsonObject& json, const QStrin QJsonObject BrowserAction::handleGeneratePassword(const QJsonObject& json, const QString& action) { - const QString nonce = json.value("nonce").toString(); - const QString password = browserSettings()->generatePassword(); + auto nonce = json.value("nonce").toString(); + auto password = browserSettings()->generatePassword(); if (nonce.isEmpty() || password.isEmpty()) { return QJsonObject(); } + // For backwards compatibility + password["login"] = password["entropy"]; + QJsonArray arr; - QJsonObject passwd; - passwd["login"] = QString::number(password.length() * 8); // bits; - passwd["password"] = password; - arr.append(passwd); + arr.append(password); const QString newNonce = incrementNonce(nonce); diff --git a/src/browser/BrowserSettings.cpp b/src/browser/BrowserSettings.cpp index 667812d1..a284488e 100644 --- a/src/browser/BrowserSettings.cpp +++ b/src/browser/BrowserSettings.cpp @@ -512,18 +512,23 @@ PasswordGenerator::GeneratorFlags BrowserSettings::passwordGeneratorFlags() return flags; } -QString BrowserSettings::generatePassword() +QJsonObject BrowserSettings::generatePassword() { + QJsonObject password; if (generatorType() == 0) { m_passwordGenerator.setLength(passwordLength()); m_passwordGenerator.setCharClasses(passwordCharClasses()); m_passwordGenerator.setFlags(passwordGeneratorFlags()); - return m_passwordGenerator.generatePassword(); + const QString pw = m_passwordGenerator.generatePassword(); + password["entropy"] = m_passwordGenerator.estimateEntropy(pw); + password["password"] = pw; } else { m_passPhraseGenerator.setWordCount(passPhraseWordCount()); m_passPhraseGenerator.setWordSeparator(passPhraseWordSeparator()); - return m_passPhraseGenerator.generatePassphrase(); + password["entropy"] = m_passPhraseGenerator.estimateEntropy(); + password["password"] = m_passPhraseGenerator.generatePassphrase(); } + return password; } void BrowserSettings::updateBinaryPaths(const QString& customProxyLocation) diff --git a/src/browser/BrowserSettings.h b/src/browser/BrowserSettings.h index b47e9286..bc8f2de1 100644 --- a/src/browser/BrowserSettings.h +++ b/src/browser/BrowserSettings.h @@ -119,7 +119,7 @@ public: void setPasswordLength(int length); PasswordGenerator::CharClasses passwordCharClasses(); PasswordGenerator::GeneratorFlags passwordGeneratorFlags(); - QString generatePassword(); + QJsonObject generatePassword(); void updateBinaryPaths(const QString& customProxyLocation = QString()); bool checkIfProxyExists(QString& path); diff --git a/src/core/PassphraseGenerator.cpp b/src/core/PassphraseGenerator.cpp index a94035e8..b14886a1 100644 --- a/src/core/PassphraseGenerator.cpp +++ b/src/core/PassphraseGenerator.cpp @@ -35,15 +35,16 @@ PassphraseGenerator::PassphraseGenerator() setDefaultWordList(); } -double PassphraseGenerator::calculateEntropy(const QString& passphrase) +double PassphraseGenerator::estimateEntropy(int wordCount) { - Q_UNUSED(passphrase); - if (m_wordlist.isEmpty()) { return 0.0; } + if (wordCount < 1) { + wordCount = m_wordCount; + } - return std::log2(m_wordlist.size()) * m_wordCount; + return std::log2(m_wordlist.size()) * wordCount; } void PassphraseGenerator::setWordCount(int wordCount) diff --git a/src/core/PassphraseGenerator.h b/src/core/PassphraseGenerator.h index 3cda1b7c..5868faab 100644 --- a/src/core/PassphraseGenerator.h +++ b/src/core/PassphraseGenerator.h @@ -35,7 +35,7 @@ public: TITLECASE }; - double calculateEntropy(const QString& passphrase); + double estimateEntropy(int wordCount = 0); void setWordCount(int wordCount); void setWordList(const QString& path); void setWordCase(PassphraseWordCase wordCase); diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp index 1132582d..e203af67 100644 --- a/src/core/PasswordGenerator.cpp +++ b/src/core/PasswordGenerator.cpp @@ -31,7 +31,7 @@ PasswordGenerator::PasswordGenerator() { } -double PasswordGenerator::calculateEntropy(const QString& password) +double PasswordGenerator::estimateEntropy(const QString& password) { return ZxcvbnMatch(password.toLatin1(), nullptr, nullptr); } diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h index 7bfdddd6..22627d25 100644 --- a/src/core/PasswordGenerator.h +++ b/src/core/PasswordGenerator.h @@ -57,7 +57,7 @@ public: public: PasswordGenerator(); - double calculateEntropy(const QString& password); + double estimateEntropy(const QString& password); void setLength(int length); void setCharClasses(const CharClasses& classes); void setFlags(const GeneratorFlags& flags); diff --git a/src/gui/PasswordGeneratorWidget.cpp b/src/gui/PasswordGeneratorWidget.cpp index 5f3d4349..902dbdfe 100644 --- a/src/gui/PasswordGeneratorWidget.cpp +++ b/src/gui/PasswordGeneratorWidget.cpp @@ -254,9 +254,9 @@ void PasswordGeneratorWidget::updatePasswordStrength(const QString& password) { double entropy = 0.0; if (m_ui->tabWidget->currentIndex() == Password) { - entropy = m_passwordGenerator->calculateEntropy(password); + entropy = m_passwordGenerator->estimateEntropy(password); } else { - entropy = m_dicewareGenerator->calculateEntropy(password); + entropy = m_dicewareGenerator->estimateEntropy(); } m_ui->entropyLabel->setText(tr("Entropy: %1 bit").arg(QString::number(entropy, 'f', 2)));