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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 V)e 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

nc~jH$Gvk zZc_7_wwSy9wx#8_oH%JAH8s=OIoBp0Sy*^)^^&DiU1HC-99>u1E3$F1_xnJFnRXf% zw^r}v?emOL{(_R37a9Id z5YTvWcG;SZ&C|BOI&|y)7roR4dwd>s7Ef|~?tauU&uI08Lw=TahyN9vtp9)dq4dsK zz52_a#B8`@u`zpx_dl~{yMxo*v!`-M9G~o7*}1+iC+wO}FTYCKGXBSg939N3K2NYx z;Smvjz`?4SJMBX3%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 + + + + + + + + + + + + + + + +