From 83ed9a8d4e52d0ae22e143d534ca8f159d26e9ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfram=20R=C3=B6sler?= Date: Sun, 29 Mar 2020 15:39:06 +0200 Subject: [PATCH] Check passwords against the HIBP online service (#4438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #1083 * Add online HIBP checker dialog to the database reports widget. Permission is requested from the user prior to performing any network operations. * The number of times a password has been found in a breach is shown to the user. * If no passwords are breached then a positive message is presented. * Source of HIBP icon: https://github.com/simple-icons/simple-icons/blob/develop/icons/haveibeenpwned.svg Authored-by: Wolfram Rösler Co-authored-by: Jonathan White --- CHANGELOG.md | 3 + COPYING | 4 + share/demo.kdbx | Bin 38965 -> 65285 bytes .../application/scalable/actions/hibp.svg | 1 + share/icons/icons.qrc | 1 + src/CMakeLists.txt | 3 + src/core/HibpDownloader.cpp | 190 +++++++++++++ src/core/HibpDownloader.h | 72 +++++ src/gui/AboutDialog.cpp | 2 +- src/gui/reports/ReportsDialog.cpp | 36 ++- src/gui/reports/ReportsDialog.h | 5 +- src/gui/reports/ReportsPageHibp.cpp | 55 ++++ src/gui/reports/ReportsPageHibp.h | 41 +++ src/gui/reports/ReportsWidgetHealthcheck.cpp | 2 +- src/gui/reports/ReportsWidgetHealthcheck.h | 2 +- src/gui/reports/ReportsWidgetHibp.cpp | 269 ++++++++++++++++++ src/gui/reports/ReportsWidgetHibp.h | 82 ++++++ src/gui/reports/ReportsWidgetHibp.ui | 193 +++++++++++++ 18 files changed, 949 insertions(+), 12 deletions(-) create mode 100644 share/icons/application/scalable/actions/hibp.svg create mode 100644 src/core/HibpDownloader.cpp create mode 100644 src/core/HibpDownloader.h create mode 100644 src/gui/reports/ReportsPageHibp.cpp create mode 100644 src/gui/reports/ReportsPageHibp.h create mode 100644 src/gui/reports/ReportsWidgetHibp.cpp create mode 100644 src/gui/reports/ReportsWidgetHibp.h create mode 100644 src/gui/reports/ReportsWidgetHibp.ui diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bdcb5bf0..615fb34f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ ### Added - Added CLI db-info command [#4231] +- Switch application icons to Material Design [#4066] +- Health Check report [#551] +- HIBP report: Check passwords against the HIBP online service [#1083] ### Changed - Renamed CLI create command to db-create [#4231] diff --git a/COPYING b/COPYING index f06c6b225..d5508a925 100644 --- a/COPYING +++ b/COPYING @@ -230,3 +230,7 @@ License: MIT Files: share/icons/application/scalable/apps/freedesktop.svg Copyright: GPL-2+ Comment: from Freedesktop.org website + +Files: share/icons/application/scalable/actions/hibp.svg +Copyright: GPL-2+ +Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/) diff --git a/share/demo.kdbx b/share/demo.kdbx index 1f372710486e39a33ec9aceef80be303f1e60f07..1f2cb14727d90118ade3638829058f6abbf09acb 100644 GIT binary patch literal 65285 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 diff --git a/share/icons/application/scalable/actions/hibp.svg b/share/icons/application/scalable/actions/hibp.svg new file mode 100644 index 000000000..c0af23f39 --- /dev/null +++ b/share/icons/application/scalable/actions/hibp.svg @@ -0,0 +1 @@ +haveibeenpwned icon \ No newline at end of file diff --git a/share/icons/icons.qrc b/share/icons/icons.qrc index 61e2b618c..d61251848 100644 --- a/share/icons/icons.qrc +++ b/share/icons/icons.qrc @@ -37,6 +37,7 @@ application/scalable/actions/group-new.svg application/scalable/actions/health.svg application/scalable/actions/help-about.svg + application/scalable/actions/hibp.svg application/scalable/actions/key-enter.svg application/scalable/actions/keyboard-shortcuts.svg application/scalable/actions/message-close.svg diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e9e9a7334..24f44bdc5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -159,6 +159,8 @@ set(keepassx_SOURCES gui/reports/ReportsDialog.cpp gui/reports/ReportsWidgetHealthcheck.cpp gui/reports/ReportsPageHealthcheck.cpp + gui/reports/ReportsWidgetHibp.cpp + gui/reports/ReportsPageHibp.cpp gui/reports/ReportsWidgetStatistics.cpp gui/reports/ReportsPageStatistics.cpp gui/osutils/OSUtilsBase.cpp @@ -287,6 +289,7 @@ endif() if(WITH_XC_NETWORKING) list(APPEND keepassx_SOURCES + core/HibpDownloader.cpp core/IconDownloader.cpp core/NetworkManager.cpp gui/UpdateCheckDialog.cpp diff --git a/src/core/HibpDownloader.cpp b/src/core/HibpDownloader.cpp new file mode 100644 index 000000000..53189af91 --- /dev/null +++ b/src/core/HibpDownloader.cpp @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "HibpDownloader.h" +#include "core/Config.h" +#include "core/Global.h" +#include "core/NetworkManager.h" + +#include +#include +#include + +namespace +{ + /* + * Return the SHA1 hash of the specified password in upper-case hex. + * + * The result is always exactly 40 characters long. + */ + QString sha1Hex(const QString& password) + { + // Get the binary SHA1 + const auto sha1 = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha1); + return sha1.toHex().toUpper(); + } + + /* + * Search a password's hash in the output of the HIBP web service. + * + * Returns the number of times the password is found in breaches, or + * 0 if the password is not in the HIBP result. + */ + int pwnCount(const QString& password, const QString& hibpResult) + { + // The first 5 characters of the hash are in the URL already, + // the HIBP result contains the remainder + auto pos = hibpResult.indexOf(sha1Hex(password).mid(5)); + if (pos < 0) { + return 0; + } + + // Skip past the sha1 and ':' + pos += 36; + + // Find where the count ends + auto end = hibpResult.indexOf('\n', pos); + if (end < 0) { + end = hibpResult.size(); + } + + // Extract the count, remove remaining whitespace, and convert to int + return hibpResult.midRef(pos, end - pos).trimmed().toInt(); + } +} // namespace + +HibpDownloader::HibpDownloader(QObject* parent) + : QObject(parent) +{ +} + +HibpDownloader::~HibpDownloader() +{ + abort(); +} + +/* + * Add one password to the list list of passwords to check. + * + * Invoke this function once for every password to check, + * then call validate(). + */ +void HibpDownloader::add(const QString& password) +{ + if (!m_pwdsToTry.contains(password)) { + m_pwdsToTry << password; + } +} + +/* + * Start validating the passwords against HIBP. + */ +void HibpDownloader::validate() +{ + for (auto password : m_pwdsToTry) { + // The URL we query is https://api.pwnedpasswords.com/range/XXXXX, + // where XXXXX is the first five bytes of the hex representation of + // the password's SHA1. + const auto url = QString("https://api.pwnedpasswords.com/range/") + sha1Hex(password).left(5); + + // HIBP requires clients to specify a user agent in the request + // (https://haveibeenpwned.com/API/v3#UserAgent); however, in order + // to minimize the amount of information we expose about ourselves, + // we don't add the KeePassXC version number or platform. + auto request = QNetworkRequest(url); + request.setRawHeader("User-Agent", "KeePassXC"); + + // Finally, submit the request to HIBP. + auto reply = getNetMgr()->get(request); + connect(reply, &QNetworkReply::finished, this, &HibpDownloader::fetchFinished); + connect(reply, &QIODevice::readyRead, this, &HibpDownloader::fetchReadyRead); + m_replies.insert(reply, {password, {}}); + } + + m_pwdsToTry.clear(); +} + +int HibpDownloader::passwordsToValidate() const +{ + return m_pwdsToTry.size(); +} + +int HibpDownloader::passwordsRemaining() const +{ + return m_replies.size(); +} + +/* + * Abort the current online activity (if any). + */ +void HibpDownloader::abort() +{ + for (auto reply : m_replies.keys()) { + reply->abort(); + reply->deleteLater(); + } + m_replies.clear(); +} + +/* + * Called when new data has been loaded from the HIBP server. + */ +void HibpDownloader::fetchReadyRead() +{ + const auto reply = qobject_cast(sender()); + auto entry = m_replies.find(reply); + if (entry != m_replies.end()) { + entry->second += reply->readAll(); + } +} + +/* + * Called after all data has been loaded from the HIBP server. + */ +void HibpDownloader::fetchFinished() +{ + const auto reply = qobject_cast(sender()); + const auto entry = m_replies.find(reply); + if (entry == m_replies.end()) { + return; + } + + // Get result status + const auto ok = reply->error() == QNetworkReply::NoError; + const auto err = reply->errorString(); + + const auto password = entry->first; + const auto hibpReply = entry->second; + + reply->deleteLater(); + m_replies.remove(reply); + + // If there was an error, assume it's permanent and abort + // (don't process the rest of the password list). + if (!ok) { + auto msg = tr("Online password validation failed") + ":\n" + err; + if (!hibpReply.isEmpty()) { + msg += "\n" + hibpReply; + } + abort(); + emit fetchFailed(msg); + return; + } + + // Current password validated, send the result to the caller + emit hibpResult(password, pwnCount(password, hibpReply)); +} diff --git a/src/core/HibpDownloader.h b/src/core/HibpDownloader.h new file mode 100644 index 000000000..04c109bae --- /dev/null +++ b/src/core/HibpDownloader.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_HIBPDOWNLOADER_H +#define KEEPASSXC_HIBPDOWNLOADER_H + +#include "config-keepassx.h" +#include +#include +#include + +#ifndef WITH_XC_NETWORKING +#error This file requires KeePassXC to be built with network support. +#endif + +class QNetworkReply; + +/* + * Check if a password has been hacked by looking it up on the + * "Have I Been Pwned" website (https://haveibeenpwned.com/) + * in the background. + * + * Usage: Pass the password to check to the ctor and process + * the `finished` signal to get the result. Process the + * `failed` signal to handle errors. + */ +class HibpDownloader : public QObject +{ + Q_OBJECT + +public: + explicit HibpDownloader(QObject* parent = nullptr); + ~HibpDownloader() override; + + void add(const QString& password); + void validate(); + int passwordsToValidate() const; + int passwordsRemaining() const; + +signals: + void hibpResult(const QString& password, int count); + void fetchFailed(const QString& error); + +public slots: + void abort(); + +private slots: + void fetchFinished(); + void fetchReadyRead(); + +private: + void fetchPassword(const QString& password); + + QStringList m_pwdsToTry; // The list of remaining passwords to validate + QHash> m_replies; +}; + +#endif // KEEPASSXC_HIBPDOWNLOADER_H diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index f9b85ac63..518a85891 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -76,7 +76,7 @@ static const QString aboutContributors = R"(
  • fonic (Entry Table View)
  • kylemanna (YubiKey)
  • c4rlo (Offline HIBP Checker)
  • -
  • wolframroesler (HTML Export, Statistics, Password Health)
  • +
  • wolframroesler (HTML Export, Statistics, Password Health, HIBP integration)
  • mdaniel (OpVault Importer)
  • keithbennett (KeePassHTTP)
  • Typz (KeePassHTTP)
  • diff --git a/src/gui/reports/ReportsDialog.cpp b/src/gui/reports/ReportsDialog.cpp index 22ebab41a..2fdc24389 100644 --- a/src/gui/reports/ReportsDialog.cpp +++ b/src/gui/reports/ReportsDialog.cpp @@ -19,8 +19,10 @@ #include "ui_ReportsDialog.h" #include "ReportsPageHealthcheck.h" +#include "ReportsPageHibp.h" #include "ReportsPageStatistics.h" #include "ReportsWidgetHealthcheck.h" +#include "ReportsWidgetHibp.h" #include "core/Global.h" #include "touchid/TouchID.h" @@ -53,6 +55,7 @@ ReportsDialog::ReportsDialog(QWidget* parent) : DialogyWidget(parent) , m_ui(new Ui::ReportsDialog()) , m_healthPage(new ReportsPageHealthcheck()) + , m_hibpPage(new ReportsPageHibp()) , m_statPage(new ReportsPageStatistics()) , m_editEntryWidget(new EditEntryWidget(this)) { @@ -60,6 +63,7 @@ ReportsDialog::ReportsDialog(QWidget* parent) connect(m_ui->buttonBox, SIGNAL(rejected()), SLOT(reject())); addPage(m_healthPage); + addPage(m_hibpPage); addPage(m_statPage); m_ui->stackedWidget->setCurrentIndex(0); @@ -70,9 +74,8 @@ ReportsDialog::ReportsDialog(QWidget* parent) adjustSize(); connect(m_ui->categoryList, SIGNAL(categoryChanged(int)), m_ui->stackedWidget, SLOT(setCurrentIndex(int))); - connect(m_healthPage->m_healthWidget, - SIGNAL(entryActivated(const Group*, Entry*)), - SLOT(entryActivationSignalReceived(const Group*, Entry*))); + connect(m_healthPage->m_healthWidget, SIGNAL(entryActivated(Entry*)), SLOT(entryActivationSignalReceived(Entry*))); + connect(m_hibpPage->m_hibpWidget, SIGNAL(entryActivated(Entry*)), SLOT(entryActivationSignalReceived(Entry*))); connect(m_editEntryWidget, SIGNAL(editFinished(bool)), SLOT(switchToMainView(bool))); } @@ -113,16 +116,33 @@ void ReportsDialog::reject() emit editFinished(true); } -void ReportsDialog::entryActivationSignalReceived(const Group* group, Entry* entry) +void ReportsDialog::entryActivationSignalReceived(Entry* entry) { - m_editEntryWidget->loadEntry(entry, false, false, group->hierarchy().join(" > "), m_db); + m_sender = static_cast(sender()); + m_editEntryWidget->loadEntry(entry, false, false, entry->group()->hierarchy().join(" > "), m_db); m_ui->stackedWidget->setCurrentWidget(m_editEntryWidget); } void ReportsDialog::switchToMainView(bool previousDialogAccepted) { - m_ui->stackedWidget->setCurrentWidget(m_healthPage->m_healthWidget); - if (previousDialogAccepted) { - m_healthPage->m_healthWidget->calculateHealth(); + // Sanity check + if (!m_sender) { + return; } + + // Return to the previous widget + m_ui->stackedWidget->setCurrentWidget(m_sender); + + // If "OK" was clicked, and if we came from the Health Check pane, + // re-compute Health Check + if (previousDialogAccepted) { + if (m_sender == m_healthPage->m_healthWidget) { + m_healthPage->m_healthWidget->calculateHealth(); + } else if (m_sender == m_hibpPage->m_hibpWidget) { + m_hibpPage->m_hibpWidget->refreshAfterEdit(); + } + } + + // Don't process the same sender twice + m_sender = nullptr; } diff --git a/src/gui/reports/ReportsDialog.h b/src/gui/reports/ReportsDialog.h index 7a53623c3..a82d7545e 100644 --- a/src/gui/reports/ReportsDialog.h +++ b/src/gui/reports/ReportsDialog.h @@ -31,6 +31,7 @@ class Entry; class Group; class QTabWidget; class ReportsPageHealthcheck; +class ReportsPageHibp; class ReportsPageStatistics; namespace Ui @@ -68,15 +69,17 @@ signals: private slots: void reject(); - void entryActivationSignalReceived(const Group*, Entry* entry); + void entryActivationSignalReceived(Entry* entry); void switchToMainView(bool previousDialogAccepted); private: QSharedPointer m_db; const QScopedPointer m_ui; const QSharedPointer m_healthPage; + const QSharedPointer m_hibpPage; const QSharedPointer m_statPage; QPointer m_editEntryWidget; + QWidget* m_sender = nullptr; class ExtraPage; QList m_extraPages; diff --git a/src/gui/reports/ReportsPageHibp.cpp b/src/gui/reports/ReportsPageHibp.cpp new file mode 100644 index 000000000..8f5640a20 --- /dev/null +++ b/src/gui/reports/ReportsPageHibp.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ReportsPageHibp.h" + +#include "ReportsWidgetHibp.h" +#include "core/Resources.h" + +#include + +ReportsPageHibp::ReportsPageHibp() + : m_hibpWidget(new ReportsWidgetHibp()) +{ +} + +QString ReportsPageHibp::name() +{ + return QApplication::tr("HIBP"); +} + +QIcon ReportsPageHibp::icon() +{ + return resources()->icon("hibp"); +} + +QWidget* ReportsPageHibp::createWidget() +{ + return m_hibpWidget; +} + +void ReportsPageHibp::loadSettings(QWidget* widget, QSharedPointer db) +{ + const auto settingsWidget = reinterpret_cast(widget); + settingsWidget->loadSettings(db); +} + +void ReportsPageHibp::saveSettings(QWidget* widget) +{ + const auto settingsWidget = reinterpret_cast(widget); + settingsWidget->saveSettings(); +} diff --git a/src/gui/reports/ReportsPageHibp.h b/src/gui/reports/ReportsPageHibp.h new file mode 100644 index 000000000..9d74347c9 --- /dev/null +++ b/src/gui/reports/ReportsPageHibp.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_REPORTSPAGEHIBP_H +#define KEEPASSXC_REPORTSPAGEHIBP_H + +#include + +#include "ReportsDialog.h" + +class ReportsWidgetHibp; + +class ReportsPageHibp : public IReportsPage +{ +public: + ReportsWidgetHibp* m_hibpWidget; + + ReportsPageHibp(); + + QString name() override; + QIcon icon() override; + QWidget* createWidget() override; + void loadSettings(QWidget* widget, QSharedPointer db) override; + void saveSettings(QWidget* widget) override; +}; + +#endif // KEEPASSXC_REPORTSPAGEHIBP_H diff --git a/src/gui/reports/ReportsWidgetHealthcheck.cpp b/src/gui/reports/ReportsWidgetHealthcheck.cpp index 49370d5f8..1212a5970 100644 --- a/src/gui/reports/ReportsWidgetHealthcheck.cpp +++ b/src/gui/reports/ReportsWidgetHealthcheck.cpp @@ -227,7 +227,7 @@ void ReportsWidgetHealthcheck::emitEntryActivated(const QModelIndex& index) const auto group = row.first; const auto entry = row.second; if (group && entry) { - emit entryActivated(group, const_cast(entry)); + emit entryActivated(const_cast(entry)); } } diff --git a/src/gui/reports/ReportsWidgetHealthcheck.h b/src/gui/reports/ReportsWidgetHealthcheck.h index bf0cf531e..86931c9db 100644 --- a/src/gui/reports/ReportsWidgetHealthcheck.h +++ b/src/gui/reports/ReportsWidgetHealthcheck.h @@ -49,7 +49,7 @@ protected: void showEvent(QShowEvent* event) override; signals: - void entryActivated(const Group* group, Entry* entry); + void entryActivated(Entry*); public slots: void calculateHealth(); diff --git a/src/gui/reports/ReportsWidgetHibp.cpp b/src/gui/reports/ReportsWidgetHibp.cpp new file mode 100644 index 000000000..1c625d131 --- /dev/null +++ b/src/gui/reports/ReportsWidgetHibp.cpp @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "ReportsWidgetHibp.h" +#include "ui_ReportsWidgetHibp.h" + +#include "config-keepassx.h" +#include "core/Database.h" +#include "core/Group.h" +#include "gui/MessageBox.h" + +#include + +ReportsWidgetHibp::ReportsWidgetHibp(QWidget* parent) + : QWidget(parent) + , m_ui(new Ui::ReportsWidgetHibp()) +{ + m_ui->setupUi(this); + + m_referencesModel.reset(new QStandardItemModel()); + m_ui->hibpTableView->setModel(m_referencesModel.data()); + m_ui->hibpTableView->setSelectionMode(QAbstractItemView::NoSelection); + m_ui->hibpTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + + connect(m_ui->hibpTableView, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); +#ifdef WITH_XC_NETWORKING + connect(&m_downloader, SIGNAL(hibpResult(QString, int)), SLOT(addHibpResult(QString, int))); + connect(&m_downloader, SIGNAL(fetchFailed(QString)), SLOT(fetchFailed(QString))); + + connect(m_ui->validationButton, &QPushButton::pressed, [this] { startValidation(); }); +#endif +} + +ReportsWidgetHibp::~ReportsWidgetHibp() +{ +} + +void ReportsWidgetHibp::loadSettings(QSharedPointer db) +{ + // Re-initialize + m_db = std::move(db); + m_referencesModel->clear(); + m_pwndPasswords.clear(); + m_error.clear(); + m_rowToEntry.clear(); + m_editedEntry = nullptr; +#ifdef WITH_XC_NETWORKING + m_ui->stackedWidget->setCurrentIndex(0); + m_ui->validationButton->setEnabled(true); + m_ui->progressBar->hide(); +#else + // Compiled without networking, can't do anything + m_ui->stackedWidget->setCurrentIndex(2); +#endif +} + +/* + * Fill the table will all entries that have passwords that we've + * found to have been pwned. + */ +void ReportsWidgetHibp::makeHibpTable() +{ + // Reset the table + m_referencesModel->clear(); + m_referencesModel->setHorizontalHeaderLabels(QStringList() << tr("Title") << tr("Path") << tr("Password exposed…")); + m_rowToEntry.clear(); + + // Search database for passwords that we've found so far + QList> items; + for (const auto* entry : m_db->rootGroup()->entriesRecursive()) { + if (!entry->isRecycled()) { + const auto found = m_pwndPasswords.find(entry->password()); + if (found != m_pwndPasswords.end()) { + items.append({entry, found.value()}); + } + } + } + + // Sort decending by the number the password has been exposed + qSort(items.begin(), items.end(), [](QPair& lhs, QPair& rhs) { + return lhs.second > rhs.second; + }); + + // Build the table + for (const auto& item : items) { + const auto entry = item.first; + const auto group = entry->group(); + const auto count = item.second; + + auto row = QList(); + row << new QStandardItem(entry->iconPixmap(), entry->title()) + << new QStandardItem(group->iconPixmap(), group->hierarchy().join("/")) + << new QStandardItem(countToText(count)); + m_referencesModel->appendRow(row); + row[2]->setForeground(QBrush(QColor("red"))); + + // Store entry pointer per table row (used in double click handler) + m_rowToEntry.append(entry); + } + + // If there was an error, append the error message to the table + if (!m_error.isEmpty()) { + auto row = QList(); + row << new QStandardItem(m_error); + m_referencesModel->appendRow(row); + row[0]->setForeground(QBrush(QColor("red"))); + } + + // If we're done and everything is good, display a motivational message +#ifdef WITH_XC_NETWORKING + if (m_downloader.passwordsRemaining() == 0 && m_pwndPasswords.isEmpty() && m_error.isEmpty()) { + m_referencesModel->clear(); + m_referencesModel->setHorizontalHeaderLabels(QStringList() << tr("Congratulations, no exposed passwords!")); + } +#endif + + m_ui->hibpTableView->resizeRowsToContents(); + + m_ui->stackedWidget->setCurrentIndex(1); +} + +/* + * Invoked when the downloader has finished checking one password. + */ +void ReportsWidgetHibp::addHibpResult(const QString& password, int count) +{ + // Add the password to the list of our findings if it has been pwned + if (count > 0) { + m_pwndPasswords[password] = count; + } + +#ifdef WITH_XC_NETWORKING + // Update the progress bar + int remaining = m_downloader.passwordsRemaining(); + if (remaining > 0) { + m_ui->progressBar->setValue(m_ui->progressBar->maximum() - remaining); + } else { + // Finished, remove the progress bar and build the table + m_ui->progressBar->hide(); + makeHibpTable(); + } +#endif +} + +/* + * Invoked when a query to the HIBP server fails. + * + * Displays the table with the current findings. + */ +void ReportsWidgetHibp::fetchFailed(const QString& error) +{ + m_error = error; + m_ui->progressBar->hide(); + makeHibpTable(); +} + +/* + * Add passwords to the downloader and start the actual online validation. + */ +void ReportsWidgetHibp::startValidation() +{ +#ifdef WITH_XC_NETWORKING + // Collect all passwords in the database (unless recycled, and + // unless empty) and submit them to the downloader. + for (const auto* entry : m_db->rootGroup()->entriesRecursive()) { + if (!entry->isRecycled() && !entry->password().isEmpty()) { + m_downloader.add(entry->password()); + } + } + + // Store the number of passwords we need to check for the progress bar + m_ui->progressBar->show(); + m_ui->progressBar->setMaximum(m_downloader.passwordsToValidate()); + m_ui->validationButton->setEnabled(false); + + m_downloader.validate(); +#endif +} + +/* + * Convert the number of times a password has been pwned into + * a display text for the third table column. + */ +QString ReportsWidgetHibp::countToText(int count) +{ + if (count == 1) { + return tr("once"); + } else if (count <= 10) { + return tr("up to 10 times"); + } else if (count <= 100) { + return tr("up to 100 times"); + } else if (count <= 1000) { + return tr("up to 1000 times"); + } else if (count <= 10000) { + return tr("up to 10,000 times"); + } else if (count <= 100000) { + return tr("up to 100,000 times"); + } else if (count <= 1000000) { + return tr("up to a million times"); + } + + return tr("millions of times"); +} + +/* + * Double-click handler + */ +void ReportsWidgetHibp::emitEntryActivated(const QModelIndex& index) +{ + if (!index.isValid()) { + return; + } + + // Find which database entry was double-clicked + const auto entry = m_rowToEntry[index.row()]; + if (entry) { + // Found it, invoke entry editor + m_editedEntry = entry; + m_editedPassword = entry->password(); + emit entryActivated(const_cast(entry)); + } +} + +/* + * Invoked after "OK" was clicked in the entry editor. + * Re-validates the edited entry's new password. + */ +void ReportsWidgetHibp::refreshAfterEdit() +{ + // Sanity check + if (!m_editedEntry) { + return; + } + + // No need to re-validate if there was no change + if (m_editedEntry->password() == m_editedPassword) { + return; + } + + // Remove the previous password from the list of findings + m_pwndPasswords.remove(m_editedPassword); + + // Validate the new password against HIBP +#ifdef WITH_XC_NETWORKING + m_downloader.add(m_editedEntry->password()); + m_downloader.validate(); +#endif + + m_editedEntry = nullptr; +} + +void ReportsWidgetHibp::saveSettings() +{ + // nothing to do - the tab is passive +} diff --git a/src/gui/reports/ReportsWidgetHibp.h b/src/gui/reports/ReportsWidgetHibp.h new file mode 100644 index 000000000..b49ef082e --- /dev/null +++ b/src/gui/reports/ReportsWidgetHibp.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2020 KeePassXC Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSXC_REPORTSWIDGETHIBP_H +#define KEEPASSXC_REPORTSWIDGETHIBP_H + +#include "config-keepassx.h" +#include "gui/entry/EntryModel.h" + +#include +#include +#include +#include + +#ifdef WITH_XC_NETWORKING +#include "core/HibpDownloader.h" +#endif + +class Database; +class Entry; +class Group; +class QStandardItemModel; + +namespace Ui +{ + class ReportsWidgetHibp; +} + +class ReportsWidgetHibp : public QWidget +{ + Q_OBJECT +public: + explicit ReportsWidgetHibp(QWidget* parent = nullptr); + ~ReportsWidgetHibp(); + + void loadSettings(QSharedPointer db); + void saveSettings(); + void refreshAfterEdit(); + +signals: + void entryActivated(Entry*); + +public slots: + void emitEntryActivated(const QModelIndex&); + void addHibpResult(const QString&, int); + void fetchFailed(const QString& error); + +private: + void makeHibpTable(); + void startValidation(); + QString countToText(int count); + + QScopedPointer m_ui; + QScopedPointer m_referencesModel; + QSharedPointer m_db; + + QMap m_pwndPasswords; // Passwords we found to have been pwned (value is pwn count) + QString m_error; // Error message if download failed, else empty + QList m_rowToEntry; // List index is table row + QPointer m_editedEntry; // The entry we're currently editing + QString m_editedPassword; // The old password of the entry we're editing + +#ifdef WITH_XC_NETWORKING + HibpDownloader m_downloader; // This performs the actual HIBP online query +#endif +}; + +#endif // KEEPASSXC_REPORTSWIDGETHIBP_H diff --git a/src/gui/reports/ReportsWidgetHibp.ui b/src/gui/reports/ReportsWidgetHibp.ui new file mode 100644 index 000000000..e3eccfd34 --- /dev/null +++ b/src/gui/reports/ReportsWidgetHibp.ui @@ -0,0 +1,193 @@ + + + ReportsWidgetHibp + + + + 0 + 0 + 545 + 379 + + + + + + + Have I Been Pwned? + + + + + + 0 + + + + + 15 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + 450 + 16777215 + + + + CAUTION: This report requires sending information to the Have I Been Pwned online service (https://haveibeenpwned.com). If you proceed, your database passwords will be cryptographically hashed and the first five characters of those hashes will be sent securely to this service. Your database remains secure and cannot be reconstituted from this information. However, the number of passwords you send and your IP address will be exposed to this service. + + + true + + + + + + + + + 0 + + + + + + 275 + 16777215 + + + + Perform Online Analysis + + + true + + + + + + + + + 0 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::NoEditTriggers + + + false + + + true + + + Qt::ElideMiddle + + + false + + + false + + + true + + + false + + + + + + + + + + + + 450 + 16777215 + + + + This build of KeePassXC does not have network functions. Networking is required to check your passwords against Have I Been Pwned databases. + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + +