Restore correct formatting

Many lines were not conformant with the project's formatting rules.
This patch should fix all formatting and whitespace issues in the code
base.
A clang-format directive was put around the connect() calls containing
SIGNALs and SLOTs whose signatures would be denormalized because of the
formatting rules.
This commit is contained in:
Gianluca Recchia 2018-11-01 04:27:38 +01:00 committed by Jonathan White
parent f9625189cb
commit fc930bae69
No known key found for this signature in database
GPG key ID: 440FC65F2E0C6E01
186 changed files with 2437 additions and 2122 deletions

View file

@ -672,7 +672,7 @@ bool AutoType::checkSyntax(const QString& string)
QString shortcutKeys = "[\\^\\%~\\+@]"; QString shortcutKeys = "[\\^\\%~\\+@]";
// a normal string not in parentheses // a normal string not in parentheses
QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*"; QString fixedStrings = "[^\\^\\%~\\+@\\{\\}]*";
// clang-format off
QRegularExpression autoTypeSyntax( QRegularExpression autoTypeSyntax(
"^(?:" + shortcutKeys + "|" + fixedStrings + "|\\{(?:" + normalCommands + "|" + specialLiterals + "|" "^(?:" + shortcutKeys + "|" + fixedStrings + "|\\{(?:" + normalCommands + "|" + specialLiterals + "|"
+ functionKeys + functionKeys
@ -688,6 +688,7 @@ bool AutoType::checkSyntax(const QString& string)
+ customAttributes + customAttributes
+ "\\})*$", + "\\})*$",
QRegularExpression::CaseInsensitiveOption); QRegularExpression::CaseInsensitiveOption);
// clang-format on
QRegularExpressionMatch match = autoTypeSyntax.match(string); QRegularExpressionMatch match = autoTypeSyntax.match(string);
return match.hasMatch(); return match.hasMatch();
} }
@ -755,8 +756,9 @@ bool AutoType::verifyAutoTypeSyntax(const QString& sequence)
} }
} else if (AutoType::checkHighRepetition(sequence)) { } else if (AutoType::checkHighRepetition(sequence)) {
QMessageBox::StandardButton reply; QMessageBox::StandardButton reply;
reply = reply = QMessageBox::question(nullptr,
QMessageBox::question(nullptr, tr("Auto-Type"), tr("This Auto-Type command contains arguments which are " tr("Auto-Type"),
tr("This Auto-Type command contains arguments which are "
"repeated very often. Do you really want to proceed?")); "repeated very often. Do you really want to proceed?"));
if (reply == QMessageBox::No) { if (reply == QMessageBox::No) {

View file

@ -67,10 +67,13 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
QLabel* descriptionLabel = new QLabel(tr("Select entry to Auto-Type:"), this); QLabel* descriptionLabel = new QLabel(tr("Select entry to Auto-Type:"), this);
layout->addWidget(descriptionLabel); layout->addWidget(descriptionLabel);
// clang-format off
connect(m_view, SIGNAL(activated(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); connect(m_view, SIGNAL(activated(QModelIndex)), SLOT(emitMatchActivated(QModelIndex)));
connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); connect(m_view, SIGNAL(clicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex)));
connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(matchRemoved())); connect(m_view->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(matchRemoved()));
connect(m_view, SIGNAL(rejected()), SLOT(reject())); connect(m_view, SIGNAL(rejected()), SLOT(reject()));
// clang-format on
layout->addWidget(m_view); layout->addWidget(m_view);
QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, this); QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel, Qt::Horizontal, this);

View file

@ -211,8 +211,7 @@ int AutoTypePlatformX11::platformEventFilter(void* event)
xcb_key_press_event_t* keyPressEvent = static_cast<xcb_key_press_event_t*>(event); xcb_key_press_event_t* keyPressEvent = static_cast<xcb_key_press_event_t*>(event);
if (keyPressEvent->detail == m_currentGlobalKeycode if (keyPressEvent->detail == m_currentGlobalKeycode
&& (keyPressEvent->state & m_modifierMask) == m_currentGlobalNativeModifiers && (keyPressEvent->state & m_modifierMask) == m_currentGlobalNativeModifiers
&& (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized()) && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized()) && m_loaded) {
&& m_loaded) {
if (type == XCB_KEY_PRESS) { if (type == XCB_KEY_PRESS) {
emit globalShortcutTriggered(); emit globalShortcutTriggered();
} }

View file

@ -17,9 +17,10 @@
*/ */
#include "BrowserAccessControlDialog.h" #include "BrowserAccessControlDialog.h"
#include "core/Entry.h"
#include "ui_BrowserAccessControlDialog.h" #include "ui_BrowserAccessControlDialog.h"
#include "core/Entry.h"
BrowserAccessControlDialog::BrowserAccessControlDialog(QWidget* parent) BrowserAccessControlDialog::BrowserAccessControlDialog(QWidget* parent)
: QDialog(parent) : QDialog(parent)
, m_ui(new Ui::BrowserAccessControlDialog()) , m_ui(new Ui::BrowserAccessControlDialog())

View file

@ -167,7 +167,8 @@ QJsonObject BrowserAction::handleAssociate(const QJsonObject& json, const QStrin
QMutexLocker locker(&m_mutex); QMutexLocker locker(&m_mutex);
if (key.compare(m_clientPublicKey, Qt::CaseSensitive) == 0) { if (key.compare(m_clientPublicKey, Qt::CaseSensitive) == 0) {
// Check for identification key. If it's not found, ensure backwards compatibility and use the current public key // Check for identification key. If it's not found, ensure backwards compatibility and use the current public
// key
const QString idKey = decrypted.value("idKey").toString(); const QString idKey = decrypted.value("idKey").toString();
const QString id = m_browserService.storeKey((idKey.isEmpty() ? key : idKey)); const QString id = m_browserService.storeKey((idKey.isEmpty() ? key : idKey));
if (id.isEmpty()) { if (id.isEmpty()) {

View file

@ -19,11 +19,12 @@
#ifndef BROWSERENTRYSAVEDIALOG_H #ifndef BROWSERENTRYSAVEDIALOG_H
#define BROWSERENTRYSAVEDIALOG_H #define BROWSERENTRYSAVEDIALOG_H
#include <QDialog>
#include <QScopedPointer>
#include <QListWidgetItem>
#include "gui/DatabaseTabWidget.h" #include "gui/DatabaseTabWidget.h"
#include <QDialog>
#include <QListWidgetItem>
#include <QScopedPointer>
class Entry; class Entry;
namespace Ui namespace Ui

View file

@ -18,10 +18,11 @@
*/ */
#include "BrowserOptionDialog.h" #include "BrowserOptionDialog.h"
#include "ui_BrowserOptionDialog.h"
#include "BrowserSettings.h" #include "BrowserSettings.h"
#include "config-keepassx.h" #include "config-keepassx.h"
#include "core/FilePath.h" #include "core/FilePath.h"
#include "ui_BrowserOptionDialog.h"
#include <QFileDialog> #include <QFileDialog>
@ -32,18 +33,24 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent)
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->extensionLabel->setOpenExternalLinks(true); m_ui->extensionLabel->setOpenExternalLinks(true);
m_ui->extensionLabel->setText(tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2.").arg( m_ui->extensionLabel->setText(
"<a href=\"https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/\">Firefox</a>", tr("KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2.")
"<a href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\">Google Chrome / Chromium / Vivaldi</a>")); .arg("<a href=\"https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/\">Firefox</a>",
"<a "
"href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/"
"oboonakemofpalcgghocfoadofidjkkk\">Google Chrome / Chromium / Vivaldi</a>"));
m_ui->scriptWarningWidget->setVisible(false); m_ui->scriptWarningWidget->setVisible(false);
m_ui->scriptWarningWidget->setAutoHideTimeout(-1); m_ui->scriptWarningWidget->setAutoHideTimeout(-1);
m_ui->scriptWarningWidget->showMessage(tr("<b>Warning</b>, the keepassxc-proxy application was not found!" m_ui->scriptWarningWidget->showMessage(
tr("<b>Warning</b>, the keepassxc-proxy application was not found!"
"<br />Please check the KeePassXC installation directory or confirm the custom path in advanced options." "<br />Please check the KeePassXC installation directory or confirm the custom path in advanced options."
"<br />Browser integration WILL NOT WORK without the proxy application." "<br />Browser integration WILL NOT WORK without the proxy application."
"<br />Expected Path: "), MessageWidget::Warning); "<br />Expected Path: "),
MessageWidget::Warning);
m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"), MessageWidget::Warning); m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"),
MessageWidget::Warning);
m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setCloseButtonVisible(false);
m_ui->warningWidget->setAutoHideTimeout(-1); m_ui->warningWidget->setAutoHideTimeout(-1);

View file

@ -20,8 +20,8 @@
#ifndef BROWSEROPTIONDIALOG_H #ifndef BROWSEROPTIONDIALOG_H
#define BROWSEROPTIONDIALOG_H #define BROWSEROPTIONDIALOG_H
#include <QScopedPointer>
#include <QPointer> #include <QPointer>
#include <QScopedPointer>
#include <QWidget> #include <QWidget>
namespace Ui namespace Ui

View file

@ -17,16 +17,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <QJsonArray>
#include <QInputDialog> #include <QInputDialog>
#include <QProgressDialog> #include <QJsonArray>
#include <QMessageBox> #include <QMessageBox>
#include <QProgressDialog>
#include <QUuid> #include <QUuid>
#include "BrowserService.h"
#include "BrowserAccessControlDialog.h" #include "BrowserAccessControlDialog.h"
#include "BrowserEntryConfig.h" #include "BrowserEntryConfig.h"
#include "BrowserEntrySaveDialog.h" #include "BrowserEntrySaveDialog.h"
#include "BrowserService.h"
#include "BrowserSettings.h" #include "BrowserSettings.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/EntrySearcher.h" #include "core/EntrySearcher.h"
@ -54,7 +54,8 @@ BrowserService::BrowserService(DatabaseTabWidget* parent)
// Don't connect the signals when used from DatabaseSettingsWidgetBrowser (parent is nullptr) // Don't connect the signals when used from DatabaseSettingsWidgetBrowser (parent is nullptr)
if (m_dbTabWidget) { if (m_dbTabWidget) {
connect(m_dbTabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), this, SLOT(databaseLocked(DatabaseWidget*))); connect(m_dbTabWidget, SIGNAL(databaseLocked(DatabaseWidget*)), this, SLOT(databaseLocked(DatabaseWidget*)));
connect(m_dbTabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), this, SLOT(databaseUnlocked(DatabaseWidget*))); connect(
m_dbTabWidget, SIGNAL(databaseUnlocked(DatabaseWidget*)), this, SLOT(databaseUnlocked(DatabaseWidget*)));
connect(m_dbTabWidget, connect(m_dbTabWidget,
SIGNAL(activateDatabaseChanged(DatabaseWidget*)), SIGNAL(activateDatabaseChanged(DatabaseWidget*)),
this, this,
@ -355,7 +356,8 @@ void BrowserService::updateEntry(const QString& id,
return; return;
} }
if (username.compare(login, Qt::CaseSensitive) != 0 || entry->password().compare(password, Qt::CaseSensitive) != 0) { if (username.compare(login, Qt::CaseSensitive) != 0
|| entry->password().compare(password, Qt::CaseSensitive) != 0) {
int dialogResult = QMessageBox::No; int dialogResult = QMessageBox::No;
if (!browserSettings()->alwaysAllowUpdate()) { if (!browserSettings()->alwaysAllowUpdate()) {
QMessageBox msgBox; QMessageBox msgBox;
@ -394,8 +396,9 @@ QList<Entry*> BrowserService::searchEntries(QSharedPointer<Database> db, const Q
QUrl qUrl(url); QUrl qUrl(url);
// Ignore entry if port or scheme defined in the URL doesn't match // Ignore entry if port or scheme defined in the URL doesn't match
if ((entryQUrl.port() > 0 && entryQUrl.port() != qUrl.port()) || if ((entryQUrl.port() > 0 && entryQUrl.port() != qUrl.port())
(browserSettings()->matchUrlScheme() && !entryScheme.isEmpty() && entryScheme.compare(qUrl.scheme()) != 0)) { || (browserSettings()->matchUrlScheme() && !entryScheme.isEmpty()
&& entryScheme.compare(qUrl.scheme()) != 0)) {
continue; continue;
} }
@ -420,7 +423,8 @@ QList<Entry*> BrowserService::searchEntries(const QString& url, const StringPair
if (const auto& db = dbWidget->database()) { if (const auto& db = dbWidget->database()) {
// Check if database is connected with KeePassXC-Browser // Check if database is connected with KeePassXC-Browser
for (const StringPair& keyPair : keyList) { for (const StringPair& keyPair : keyList) {
QString key = db->metadata()->customData()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + keyPair.first); QString key =
db->metadata()->customData()->value(QLatin1String(ASSOCIATE_KEY_PREFIX) + keyPair.first);
if (!key.isEmpty() && keyPair.second == key) { if (!key.isEmpty() && keyPair.second == key) {
databases << db; databases << db;
} }
@ -484,16 +488,22 @@ void BrowserService::convertAttributesToCustomData(QSharedPointer<Database> curr
progress.reset(); progress.reset();
if (counter > 0) { if (counter > 0) {
QMessageBox::information(nullptr, tr("KeePassXC: Converted KeePassHTTP attributes"), QMessageBox::information(nullptr,
tr("KeePassXC: Converted KeePassHTTP attributes"),
tr("Successfully converted attributes from %1 entry(s).\n" tr("Successfully converted attributes from %1 entry(s).\n"
"Moved %2 keys to custom data.", "").arg(counter).arg(keyCounter), "Moved %2 keys to custom data.",
"")
.arg(counter)
.arg(keyCounter),
QMessageBox::Ok); QMessageBox::Ok);
} else if (counter == 0 && keyCounter > 0) { } else if (counter == 0 && keyCounter > 0) {
QMessageBox::information(nullptr, tr("KeePassXC: Converted KeePassHTTP attributes"), QMessageBox::information(nullptr,
tr("KeePassXC: Converted KeePassHTTP attributes"),
tr("Successfully moved %n keys to custom data.", "", keyCounter), tr("Successfully moved %n keys to custom data.", "", keyCounter),
QMessageBox::Ok); QMessageBox::Ok);
} else { } else {
QMessageBox::information(nullptr, tr("KeePassXC: No entry with KeePassHTTP attributes found!"), QMessageBox::information(nullptr,
tr("KeePassXC: No entry with KeePassHTTP attributes found!"),
tr("The active database does not contain an entry with KeePassHTTP attributes."), tr("The active database does not contain an entry with KeePassHTTP attributes."),
QMessageBox::Ok); QMessageBox::Ok);
} }
@ -539,9 +549,14 @@ QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QStrin
// Sort same priority entries by Title or UserName // Sort same priority entries by Title or UserName
auto entries = priorities.values(i); auto entries = priorities.values(i);
std::sort(entries.begin(), entries.end(), [&field](Entry* left, Entry* right) { std::sort(entries.begin(), entries.end(), [&field](Entry* left, Entry* right) {
return (QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field)) < 0) || return (QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field))
((QString::localeAwareCompare(left->attributes()->value(field), right->attributes()->value(field)) == 0) && < 0)
(QString::localeAwareCompare(left->attributes()->value("UserName"), right->attributes()->value("UserName")) < 0)); || ((QString::localeAwareCompare(left->attributes()->value(field),
right->attributes()->value(field))
== 0)
&& (QString::localeAwareCompare(left->attributes()->value("UserName"),
right->attributes()->value("UserName"))
< 0));
}); });
results << entries; results << entries;
if (browserSettings()->bestMatchOnly() && !pwEntries.isEmpty()) { if (browserSettings()->bestMatchOnly() && !pwEntries.isEmpty()) {
@ -843,7 +858,8 @@ int BrowserService::moveKeysToCustomData(Entry* entry, QSharedPointer<Database>
// Add key to database custom data // Add key to database custom data
if (db && !db->metadata()->customData()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey)) { if (db && !db->metadata()->customData()->contains(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey)) {
db->metadata()->customData()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey, entry->attributes()->value(key)); db->metadata()->customData()->set(QLatin1String(ASSOCIATE_KEY_PREFIX) + publicKey,
entry->attributes()->value(key));
++keyCounter; ++keyCounter;
} }
} }
@ -879,7 +895,6 @@ bool BrowserService::checkLegacySettings()
"Do you want to upgrade the settings to the latest standard?\n" "Do you want to upgrade the settings to the latest standard?\n"
"This is necessary to maintain compatibility with the browser plugin."), "This is necessary to maintain compatibility with the browser plugin."),
QMessageBox::Yes | QMessageBox::No); QMessageBox::Yes | QMessageBox::No);
return dialogResult == QMessageBox::Yes; return dialogResult == QMessageBox::Yes;
} }

View file

@ -46,8 +46,10 @@ HostInstaller::HostInstaller()
, TARGET_DIR_VIVALDI("/.config/vivaldi/NativeMessagingHosts") , TARGET_DIR_VIVALDI("/.config/vivaldi/NativeMessagingHosts")
, TARGET_DIR_TOR_BROWSER("/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts") , TARGET_DIR_TOR_BROWSER("/.tor-browser/app/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts")
#elif defined(Q_OS_WIN) #elif defined(Q_OS_WIN)
// clang-format off
, TARGET_DIR_CHROME("HKEY_CURRENT_USER\\Software\\Google\\Chrome\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser") , TARGET_DIR_CHROME("HKEY_CURRENT_USER\\Software\\Google\\Chrome\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
, TARGET_DIR_CHROMIUM("HKEY_CURRENT_USER\\Software\\Chromium\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser") , TARGET_DIR_CHROMIUM("HKEY_CURRENT_USER\\Software\\Chromium\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
// clang-format on
, TARGET_DIR_FIREFOX("HKEY_CURRENT_USER\\Software\\Mozilla\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser") , TARGET_DIR_FIREFOX("HKEY_CURRENT_USER\\Software\\Mozilla\\NativeMessagingHosts\\org.keepassxc.keepassxc_browser")
, TARGET_DIR_VIVALDI(TARGET_DIR_CHROME) , TARGET_DIR_VIVALDI(TARGET_DIR_CHROME)
, TARGET_DIR_TOR_BROWSER(TARGET_DIR_FIREFOX) , TARGET_DIR_TOR_BROWSER(TARGET_DIR_FIREFOX)

View file

@ -138,7 +138,8 @@ QString NativeMessagingBase::getLocalServerPath() const
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS) #if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
// Use XDG_RUNTIME_DIR instead of /tmp if it's available // Use XDG_RUNTIME_DIR instead of /tmp if it's available
QString path = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation); QString path = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
return path.isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverPath : path + serverPath; return path.isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverPath
: path + serverPath;
#else // Q_OS_MACOS, Q_OS_WIN and others #else // Q_OS_MACOS, Q_OS_WIN and others
return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverPath; return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverPath;
#endif #endif

View file

@ -33,8 +33,8 @@
#include <unistd.h> #include <unistd.h>
#ifndef Q_OS_WIN #ifndef Q_OS_WIN
#include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h>
#endif #endif
static const int NATIVE_MSG_MAX_LENGTH = 1024 * 1024; static const int NATIVE_MSG_MAX_LENGTH = 1024 * 1024;

View file

@ -65,8 +65,8 @@ void NativeMessagingHost::run()
// Update KeePassXC/keepassxc-proxy binary paths to Native Messaging scripts // Update KeePassXC/keepassxc-proxy binary paths to Native Messaging scripts
if (browserSettings()->updateBinaryPath()) { if (browserSettings()->updateBinaryPath()) {
browserSettings()->updateBinaryPaths(browserSettings()->useCustomProxy() ? browserSettings()->customProxyLocation() browserSettings()->updateBinaryPaths(
: ""); browserSettings()->useCustomProxy() ? browserSettings()->customProxyLocation() : "");
} }
m_running.store(true); m_running.store(true);

View file

@ -51,7 +51,8 @@ int Add::execute(const QStringList& arguments)
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption username(QStringList() << "u" << "username", QCommandLineOption username(QStringList() << "u"
<< "username",
QObject::tr("Username for the entry."), QObject::tr("Username for the entry."),
QObject::tr("username")); QObject::tr("username"));
parser.addOption(username); parser.addOption(username);
@ -59,15 +60,18 @@ int Add::execute(const QStringList& arguments)
QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL")); QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL"));
parser.addOption(url); parser.addOption(url);
QCommandLineOption prompt(QStringList() << "p" << "password-prompt", QCommandLineOption prompt(QStringList() << "p"
<< "password-prompt",
QObject::tr("Prompt for the entry's password.")); QObject::tr("Prompt for the entry's password."));
parser.addOption(prompt); parser.addOption(prompt);
QCommandLineOption generate(QStringList() << "g" << "generate", QCommandLineOption generate(QStringList() << "g"
<< "generate",
QObject::tr("Generate a password for the entry.")); QObject::tr("Generate a password for the entry."));
parser.addOption(generate); parser.addOption(generate);
QCommandLineOption length(QStringList() << "l" << "password-length", QCommandLineOption length(QStringList() << "l"
<< "password-length",
QObject::tr("Length for the generated password."), QObject::tr("Length for the generated password."),
QObject::tr("length")); QObject::tr("length"));
parser.addOption(length); parser.addOption(length);

View file

@ -50,12 +50,13 @@ int Clip::execute(const QStringList& arguments)
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption totp(QStringList() << "t" << "totp", QCommandLineOption totp(QStringList() << "t"
<< "totp",
QObject::tr("Copy the current TOTP to the clipboard.")); QObject::tr("Copy the current TOTP to the clipboard."));
parser.addOption(totp); parser.addOption(totp);
parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard")); parser.addPositionalArgument("entry", QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"));
parser.addPositionalArgument("timeout", parser.addPositionalArgument(
QObject::tr("Timeout in seconds before clearing the clipboard."), "[timeout]"); "timeout", QObject::tr("Timeout in seconds before clearing the clipboard."), "[timeout]");
parser.addHelpOption(); parser.addHelpOption();
parser.process(arguments); parser.process(arguments);

View file

@ -43,11 +43,13 @@ int Diceware::execute(const QStringList& arguments)
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription(description); parser.setApplicationDescription(description);
QCommandLineOption words(QStringList() << "W" << "words", QCommandLineOption words(QStringList() << "W"
<< "words",
QObject::tr("Word count for the diceware passphrase."), QObject::tr("Word count for the diceware passphrase."),
QObject::tr("count", "CLI parameter")); QObject::tr("count", "CLI parameter"));
parser.addOption(words); parser.addOption(words);
QCommandLineOption wordlistFile(QStringList() << "w" << "word-list", QCommandLineOption wordlistFile(QStringList() << "w"
<< "word-list",
QObject::tr("Wordlist for the diceware generator.\n[Default: EFF English]"), QObject::tr("Wordlist for the diceware generator.\n[Default: EFF English]"),
QObject::tr("path")); QObject::tr("path"));
parser.addOption(wordlistFile); parser.addOption(wordlistFile);

View file

@ -51,7 +51,8 @@ int Edit::execute(const QStringList& arguments)
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption username(QStringList() << "u" << "username", QCommandLineOption username(QStringList() << "u"
<< "username",
QObject::tr("Username for the entry."), QObject::tr("Username for the entry."),
QObject::tr("username")); QObject::tr("username"));
parser.addOption(username); parser.addOption(username);
@ -59,20 +60,24 @@ int Edit::execute(const QStringList& arguments)
QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL")); QCommandLineOption url(QStringList() << "url", QObject::tr("URL for the entry."), QObject::tr("URL"));
parser.addOption(url); parser.addOption(url);
QCommandLineOption title(QStringList() << "t" << "title", QCommandLineOption title(QStringList() << "t"
<< "title",
QObject::tr("Title for the entry."), QObject::tr("Title for the entry."),
QObject::tr("title")); QObject::tr("title"));
parser.addOption(title); parser.addOption(title);
QCommandLineOption prompt(QStringList() << "p" << "password-prompt", QCommandLineOption prompt(QStringList() << "p"
<< "password-prompt",
QObject::tr("Prompt for the entry's password.")); QObject::tr("Prompt for the entry's password."));
parser.addOption(prompt); parser.addOption(prompt);
QCommandLineOption generate(QStringList() << "g" << "generate", QCommandLineOption generate(QStringList() << "g"
<< "generate",
QObject::tr("Generate a password for the entry.")); QObject::tr("Generate a password for the entry."));
parser.addOption(generate); parser.addOption(generate);
QCommandLineOption length(QStringList() << "l" << "password-length", QCommandLineOption length(QStringList() << "l"
<< "password-length",
QObject::tr("Length for the generated password."), QObject::tr("Length for the generated password."),
QObject::tr("length")); QObject::tr("length"));
parser.addOption(length); parser.addOption(length);
@ -111,8 +116,7 @@ int Edit::execute(const QStringList& arguments)
} }
if (parser.value("username").isEmpty() && parser.value("url").isEmpty() && parser.value("title").isEmpty() if (parser.value("username").isEmpty() && parser.value("url").isEmpty() && parser.value("title").isEmpty()
&& !parser.isSet(prompt) && !parser.isSet(prompt) && !parser.isSet(generate)) {
&& !parser.isSet(generate)) {
err << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl; err << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl;
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View file

@ -51,9 +51,11 @@ static void estimate(const char* pwd, bool advanced)
int len = static_cast<int>(strlen(pwd)); int len = static_cast<int>(strlen(pwd));
if (!advanced) { if (!advanced) {
e = ZxcvbnMatch(pwd, nullptr, nullptr); e = ZxcvbnMatch(pwd, nullptr, nullptr);
// clang-format off
out << QObject::tr("Length %1").arg(len, 0) << '\t' out << QObject::tr("Length %1").arg(len, 0) << '\t'
<< QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t' << QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t'
<< QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << endl; << QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << endl;
// clang-format on
} else { } else {
int ChkLen = 0; int ChkLen = 0;
ZxcMatch_t *info, *p; ZxcMatch_t *info, *p;
@ -63,10 +65,12 @@ static void estimate(const char* pwd, bool advanced)
m += p->Entrpy; m += p->Entrpy;
} }
m = e - m; m = e - m;
// clang-format off
out << QObject::tr("Length %1").arg(len) << '\t' out << QObject::tr("Length %1").arg(len) << '\t'
<< QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t' << QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t'
<< QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << "\n " << QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << "\n "
<< QObject::tr("Multi-word extra bits %1").arg(m, 0, 'f', 1) << endl; << QObject::tr("Multi-word extra bits %1").arg(m, 0, 'f', 1) << endl;
// clang-format on
p = info; p = info;
ChkLen = 0; ChkLen = 0;
while (p) { while (p) {
@ -132,9 +136,10 @@ static void estimate(const char* pwd, bool advanced)
break; break;
} }
ChkLen += p->Length; ChkLen += p->Length;
// clang-format off
out << QObject::tr("Length %1").arg(p->Length) << '\t' out << QObject::tr("Length %1").arg(p->Length) << '\t'
<< QObject::tr("Entropy %1 (%2)").arg(p->Entrpy, 6, 'f', 3).arg(p->Entrpy * 0.301029996, 0, 'f', 2) << '\t'; << QObject::tr("Entropy %1 (%2)").arg(p->Entrpy, 6, 'f', 3).arg(p->Entrpy * 0.301029996, 0, 'f', 2) << '\t';
// clang-format on
for (n = 0; n < p->Length; ++n, ++pwd) { for (n = 0; n < p->Length; ++n, ++pwd) {
out << *pwd; out << *pwd;
} }
@ -143,7 +148,8 @@ static void estimate(const char* pwd, bool advanced)
} }
ZxcvbnFreeInfo(info); ZxcvbnFreeInfo(info);
if (ChkLen != len) { if (ChkLen != len) {
out << QObject::tr("*** Password length (%1) != sum of length of parts (%2) ***").arg(len).arg(ChkLen) << endl; out << QObject::tr("*** Password length (%1) != sum of length of parts (%2) ***").arg(len).arg(ChkLen)
<< endl;
} }
} }
} }
@ -156,7 +162,8 @@ int Estimate::execute(const QStringList& arguments)
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription(description); parser.setApplicationDescription(description);
parser.addPositionalArgument("password", QObject::tr("Password for which to estimate the entropy."), "[password]"); parser.addPositionalArgument("password", QObject::tr("Password for which to estimate the entropy."), "[password]");
QCommandLineOption advancedOption(QStringList() << "a" << "advanced", QCommandLineOption advancedOption(QStringList() << "a"
<< "advanced",
QObject::tr("Perform advanced analysis on the password.")); QObject::tr("Perform advanced analysis on the password."));
parser.addOption(advancedOption); parser.addOption(advancedOption);
parser.addHelpOption(); parser.addHelpOption();

View file

@ -84,7 +84,8 @@ int Extract::execute(const QStringList& arguments)
if (fileKey->type() != FileKey::Hashed) { if (fileKey->type() != FileKey::Hashed) {
err << QObject::tr("WARNING: You are using a legacy key file format which may become\n" err << QObject::tr("WARNING: You are using a legacy key file format which may become\n"
"unsupported in the future.\n\n" "unsupported in the future.\n\n"
"Please consider generating a new key file.") << endl; "Please consider generating a new key file.")
<< endl;
} }
// LCOV_EXCL_STOP // LCOV_EXCL_STOP

View file

@ -43,26 +43,33 @@ int Generate::execute(const QStringList& arguments)
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription(description); parser.setApplicationDescription(description);
QCommandLineOption len(QStringList() << "L" << "length", QCommandLineOption len(QStringList() << "L"
<< "length",
QObject::tr("Length of the generated password"), QObject::tr("Length of the generated password"),
QObject::tr("length")); QObject::tr("length"));
parser.addOption(len); parser.addOption(len);
QCommandLineOption lower(QStringList() << "l" << "lower", QCommandLineOption lower(QStringList() << "l"
<< "lower",
QObject::tr("Use lowercase characters")); QObject::tr("Use lowercase characters"));
parser.addOption(lower); parser.addOption(lower);
QCommandLineOption upper(QStringList() << "u" << "upper", QCommandLineOption upper(QStringList() << "u"
<< "upper",
QObject::tr("Use uppercase characters")); QObject::tr("Use uppercase characters"));
parser.addOption(upper); parser.addOption(upper);
QCommandLineOption numeric(QStringList() << "n" << "numeric", QCommandLineOption numeric(QStringList() << "n"
<< "numeric",
QObject::tr("Use numbers.")); QObject::tr("Use numbers."));
parser.addOption(numeric); parser.addOption(numeric);
QCommandLineOption special(QStringList() << "s" << "special", QCommandLineOption special(QStringList() << "s"
<< "special",
QObject::tr("Use special characters")); QObject::tr("Use special characters"));
parser.addOption(special); parser.addOption(special);
QCommandLineOption extended(QStringList() << "e" << "extended", QCommandLineOption extended(QStringList() << "e"
<< "extended",
QObject::tr("Use extended ASCII")); QObject::tr("Use extended ASCII"));
parser.addOption(extended); parser.addOption(extended);
QCommandLineOption exclude(QStringList() << "x" << "exclude", QCommandLineOption exclude(QStringList() << "x"
<< "exclude",
QObject::tr("Exclude character set"), QObject::tr("Exclude character set"),
QObject::tr("chars")); QObject::tr("chars"));
parser.addOption(exclude); parser.addOption(exclude);

View file

@ -49,7 +49,8 @@ int List::execute(const QStringList& arguments)
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption recursiveOption(QStringList() << "R" << "recursive", QCommandLineOption recursiveOption(QStringList() << "R"
<< "recursive",
QObject::tr("Recursively list the elements of the group.")); QObject::tr("Recursively list the elements of the group."));
parser.addOption(recursiveOption); parser.addOption(recursiveOption);
parser.addHelpOption(); parser.addHelpOption();

View file

@ -47,12 +47,14 @@ int Merge::execute(const QStringList& arguments)
parser.addPositionalArgument("database2", QObject::tr("Path of the database to merge from.")); parser.addPositionalArgument("database2", QObject::tr("Path of the database to merge from."));
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
QCommandLineOption samePasswordOption(QStringList() << "s" << "same-credentials", QCommandLineOption samePasswordOption(QStringList() << "s"
<< "same-credentials",
QObject::tr("Use the same credentials for both database files.")); QObject::tr("Use the same credentials for both database files."));
parser.addOption(samePasswordOption); parser.addOption(samePasswordOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption keyFileFromOption(QStringList() << "f" << "key-file-from", QCommandLineOption keyFileFromOption(QStringList() << "f"
<< "key-file-from",
QObject::tr("Key file of the database to merge from."), QObject::tr("Key file of the database to merge from."),
QObject::tr("path")); QObject::tr("path"));
parser.addOption(keyFileFromOption); parser.addOption(keyFileFromOption);

View file

@ -48,11 +48,13 @@ int Show::execute(const QStringList& arguments)
parser.addPositionalArgument("database", QObject::tr("Path of the database.")); parser.addPositionalArgument("database", QObject::tr("Path of the database."));
parser.addOption(Command::QuietOption); parser.addOption(Command::QuietOption);
parser.addOption(Command::KeyFileOption); parser.addOption(Command::KeyFileOption);
QCommandLineOption totp(QStringList() << "t" << "totp", QCommandLineOption totp(QStringList() << "t"
<< "totp",
QObject::tr("Show the entry's current TOTP.")); QObject::tr("Show the entry's current TOTP."));
parser.addOption(totp); parser.addOption(totp);
QCommandLineOption attributes( QCommandLineOption attributes(
QStringList() << "a" << "attributes", QStringList() << "a"
<< "attributes",
QObject::tr( QObject::tr(
"Names of the attributes to show. " "Names of the attributes to show. "
"This option can be specified more than once, with each attribute shown one-per-line in the given order. " "This option can be specified more than once, with each attribute shown one-per-line in the given order. "

View file

@ -67,7 +67,6 @@ void setStdinEcho(bool enable = true)
} }
SetConsoleMode(hIn, mode); SetConsoleMode(hIn, mode);
#else #else
struct termios t; struct termios t;
tcgetattr(STDIN_FILENO, &t); tcgetattr(STDIN_FILENO, &t);

View file

@ -18,8 +18,8 @@
#ifndef KEEPASSXC_UTILS_H #ifndef KEEPASSXC_UTILS_H
#define KEEPASSXC_UTILS_H #define KEEPASSXC_UTILS_H
#include <QtCore/qglobal.h>
#include "cli/TextStream.h" #include "cli/TextStream.h"
#include <QtCore/qglobal.h>
namespace Utils namespace Utils
{ {
@ -36,6 +36,6 @@ namespace Test
{ {
void setNextPassword(const QString& password); void setNextPassword(const QString& password);
} }
}; }; // namespace Utils
#endif // KEEPASSXC_UTILS_H #endif // KEEPASSXC_UTILS_H

View file

@ -15,7 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef KEEPASSXC_BOOTSTRAP_H #ifndef KEEPASSXC_BOOTSTRAP_H
#define KEEPASSXC_BOOTSTRAP_H #define KEEPASSXC_BOOTSTRAP_H
@ -28,7 +27,6 @@ void restoreMainWindowState(MainWindow& mainWindow);
void disableCoreDumps(); void disableCoreDumps();
bool createWindowsDACL(); bool createWindowsDACL();
void setupSearchPaths(); void setupSearchPaths();
}; }; // namespace Bootstrap
#endif // KEEPASSXC_BOOTSTRAP_H #endif // KEEPASSXC_BOOTSTRAP_H

View file

@ -727,7 +727,8 @@ QSharedPointer<Database> Database::unlockFromStdin(const QString& databaseFilena
if (fileKey->type() != FileKey::Hashed) { if (fileKey->type() != FileKey::Hashed) {
err << QObject::tr("WARNING: You are using a legacy key file format which may become\n" err << QObject::tr("WARNING: You are using a legacy key file format which may become\n"
"unsupported in the future.\n\n" "unsupported in the future.\n\n"
"Please consider generating a new key file.") << endl; "Please consider generating a new key file.")
<< endl;
} }
// LCOV_EXCL_STOP // LCOV_EXCL_STOP

View file

@ -657,12 +657,14 @@ Entry* Entry::clone(CloneFlags flags) const
if (flags & CloneUserAsRef) { if (flags & CloneUserAsRef) {
// Build the username reference // Build the username reference
QString username = "{REF:U@I:" + uuidToHex() + "}"; QString username = "{REF:U@I:" + uuidToHex() + "}";
entry->m_attributes->set(EntryAttributes::UserNameKey, username.toUpper(), m_attributes->isProtected(EntryAttributes::UserNameKey)); entry->m_attributes->set(
EntryAttributes::UserNameKey, username.toUpper(), m_attributes->isProtected(EntryAttributes::UserNameKey));
} }
if (flags & ClonePassAsRef) { if (flags & ClonePassAsRef) {
QString password = "{REF:P@I:" + uuidToHex() + "}"; QString password = "{REF:P@I:" + uuidToHex() + "}";
entry->m_attributes->set(EntryAttributes::PasswordKey, password.toUpper(), m_attributes->isProtected(EntryAttributes::PasswordKey)); entry->m_attributes->set(
EntryAttributes::PasswordKey, password.toUpper(), m_attributes->isProtected(EntryAttributes::PasswordKey));
} }
entry->m_autoTypeAssociations->copyDataFrom(m_autoTypeAssociations); entry->m_autoTypeAssociations->copyDataFrom(m_autoTypeAssociations);
@ -1065,7 +1067,8 @@ QString Entry::resolveUrl(const QString& url) const
// Validate the URL // Validate the URL
QUrl tempUrl = QUrl(newUrl); QUrl tempUrl = QUrl(newUrl);
if (tempUrl.isValid() && (tempUrl.scheme() == "http" || tempUrl.scheme() == "https" || tempUrl.scheme() == "file")) { if (tempUrl.isValid()
&& (tempUrl.scheme() == "http" || tempUrl.scheme() == "https" || tempUrl.scheme() == "file")) {
return tempUrl.url(); return tempUrl.url();
} }

View file

@ -36,7 +36,8 @@
class Database; class Database;
class Group; class Group;
namespace Totp { namespace Totp
{
struct Settings; struct Settings;
} }

View file

@ -23,8 +23,8 @@ const QString EntryAttributes::UserNameKey = "UserName";
const QString EntryAttributes::PasswordKey = "Password"; const QString EntryAttributes::PasswordKey = "Password";
const QString EntryAttributes::URLKey = "URL"; const QString EntryAttributes::URLKey = "URL";
const QString EntryAttributes::NotesKey = "Notes"; const QString EntryAttributes::NotesKey = "Notes";
const QStringList EntryAttributes::DefaultAttributes(QStringList() << TitleKey << UserNameKey << PasswordKey << URLKey const QStringList EntryAttributes::DefaultAttributes(QStringList()
<< NotesKey); << TitleKey << UserNameKey << PasswordKey << URLKey << NotesKey);
const QString EntryAttributes::WantedFieldGroupName = "WantedField"; const QString EntryAttributes::WantedFieldGroupName = "WantedField";
const QString EntryAttributes::SearchInGroupName = "SearchIn"; const QString EntryAttributes::SearchInGroupName = "SearchIn";

View file

@ -630,10 +630,12 @@ Entry* Group::findEntryByPathRecursive(const QString& entryPath, const QString&
// Return the first entry that matches the full path OR if there is no leading // Return the first entry that matches the full path OR if there is no leading
// slash, return the first entry title that matches // slash, return the first entry title that matches
for (Entry* entry : entries()) { for (Entry* entry : entries()) {
// clang-format off
if (entryPath == (basePath + entry->title()) if (entryPath == (basePath + entry->title())
|| (!entryPath.startsWith("/") && entry->title() == entryPath)) { || (!entryPath.startsWith("/") && entry->title() == entryPath)) {
return entry; return entry;
} }
// clang-format on
} }
for (Group* group : children()) { for (Group* group : children()) {
@ -654,9 +656,11 @@ Group* Group::findGroupByPath(const QString& groupPath)
if (groupPath.isEmpty()) { if (groupPath.isEmpty()) {
normalizedGroupPath = QString("/"); // root group normalizedGroupPath = QString("/"); // root group
} else { } else {
// clang-format off
normalizedGroupPath = (groupPath.startsWith("/") ? "" : "/") normalizedGroupPath = (groupPath.startsWith("/") ? "" : "/")
+ groupPath + groupPath
+ (groupPath.endsWith("/") ? "" : "/"); + (groupPath.endsWith("/") ? "" : "/");
// clang-format on
} }
return findGroupByPathRecursive(normalizedGroupPath, "/"); return findGroupByPathRecursive(normalizedGroupPath, "/");
} }
@ -894,6 +898,7 @@ void Group::connectDatabaseSignalsRecursive(Database* db)
} }
if (db) { if (db) {
// clang-format off
connect(this, SIGNAL(groupDataChanged(Group*)), db, SIGNAL(groupDataChanged(Group*))); connect(this, SIGNAL(groupDataChanged(Group*)), db, SIGNAL(groupDataChanged(Group*)));
connect(this, SIGNAL(groupAboutToRemove(Group*)), db, SIGNAL(groupAboutToRemove(Group*))); connect(this, SIGNAL(groupAboutToRemove(Group*)), db, SIGNAL(groupAboutToRemove(Group*)));
connect(this, SIGNAL(groupRemoved()), db, SIGNAL(groupRemoved())); connect(this, SIGNAL(groupRemoved()), db, SIGNAL(groupRemoved()));
@ -902,6 +907,7 @@ void Group::connectDatabaseSignalsRecursive(Database* db)
connect(this, SIGNAL(aboutToMove(Group*,Group*,int)), db, SIGNAL(groupAboutToMove(Group*,Group*,int))); connect(this, SIGNAL(aboutToMove(Group*,Group*,int)), db, SIGNAL(groupAboutToMove(Group*,Group*,int)));
connect(this, SIGNAL(groupMoved()), db, SIGNAL(groupMoved())); connect(this, SIGNAL(groupMoved()), db, SIGNAL(groupMoved()));
connect(this, SIGNAL(groupModified()), db, SLOT(markAsModified())); connect(this, SIGNAL(groupModified()), db, SLOT(markAsModified()));
// clang-format on
} }
m_db = db; m_db = db;

View file

@ -55,12 +55,13 @@ void InactivityTimer::deactivate()
bool InactivityTimer::eventFilter(QObject* watched, QEvent* event) bool InactivityTimer::eventFilter(QObject* watched, QEvent* event)
{ {
const QEvent::Type type = event->type(); const QEvent::Type type = event->type();
// clang-format off
if ((type >= QEvent::MouseButtonPress && type <= QEvent::KeyRelease) if ((type >= QEvent::MouseButtonPress && type <= QEvent::KeyRelease)
|| (type >= QEvent::HoverEnter && type <= QEvent::HoverMove) || (type >= QEvent::HoverEnter && type <= QEvent::HoverMove)
|| (type == QEvent::Wheel)) { || (type == QEvent::Wheel)) {
m_timer->start(); m_timer->start();
} }
// clang-format on
return QObject::eventFilter(watched, event); return QObject::eventFilter(watched, event);
} }

View file

@ -93,7 +93,8 @@ Merger::ChangeList Merger::mergeGroup(const MergeContext& context)
moveEntry(targetEntry, context.m_targetGroup); moveEntry(targetEntry, context.m_targetGroup);
} else { } else {
// Entry is already present in the database. Update it. // Entry is already present in the database. Update it.
const bool locationChanged = targetEntry->timeInfo().locationChanged() < sourceEntry->timeInfo().locationChanged(); const bool locationChanged =
targetEntry->timeInfo().locationChanged() < sourceEntry->timeInfo().locationChanged();
if (locationChanged && targetEntry->group() != context.m_targetGroup) { if (locationChanged && targetEntry->group() != context.m_targetGroup) {
changes << tr("Relocating %1 [%2]").arg(sourceEntry->title(), sourceEntry->uuidToHex()); changes << tr("Relocating %1 [%2]").arg(sourceEntry->title(), sourceEntry->uuidToHex());
moveEntry(targetEntry, context.m_targetGroup); moveEntry(targetEntry, context.m_targetGroup);
@ -136,7 +137,8 @@ Merger::ChangeList Merger::mergeGroup(const MergeContext& context)
return changes; return changes;
} }
Merger::ChangeList Merger::resolveGroupConflict(const MergeContext& context, const Group* sourceChildGroup, Group* targetChildGroup) Merger::ChangeList
Merger::resolveGroupConflict(const MergeContext& context, const Group* sourceChildGroup, Group* targetChildGroup)
{ {
Q_UNUSED(context); Q_UNUSED(context);
ChangeList changes; ChangeList changes;
@ -261,10 +263,13 @@ void Merger::eraseGroup(Group* group)
database->setDeletedObjects(deletions); database->setDeletedObjects(deletions);
} }
Merger::ChangeList Merger::resolveEntryConflict_Duplicate(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry) Merger::ChangeList
Merger::resolveEntryConflict_Duplicate(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry)
{ {
ChangeList changes; ChangeList changes;
const int comparison = compare(targetEntry->timeInfo().lastModificationTime(), sourceEntry->timeInfo().lastModificationTime(), CompareItemIgnoreMilliseconds); const int comparison = compare(targetEntry->timeInfo().lastModificationTime(),
sourceEntry->timeInfo().lastModificationTime(),
CompareItemIgnoreMilliseconds);
// if one entry is newer, create a clone and add it to the group // if one entry is newer, create a clone and add it to the group
if (comparison < 0) { if (comparison < 0) {
Entry* clonedEntry = sourceEntry->clone(Entry::CloneNewUuid | Entry::CloneIncludeHistory); Entry* clonedEntry = sourceEntry->clone(Entry::CloneNewUuid | Entry::CloneIncludeHistory);
@ -280,11 +285,14 @@ Merger::ChangeList Merger::resolveEntryConflict_Duplicate(const MergeContext& co
return changes; return changes;
} }
Merger::ChangeList Merger::resolveEntryConflict_KeepLocal(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry) Merger::ChangeList
Merger::resolveEntryConflict_KeepLocal(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry)
{ {
Q_UNUSED(context); Q_UNUSED(context);
ChangeList changes; ChangeList changes;
const int comparison = compare(targetEntry->timeInfo().lastModificationTime(), sourceEntry->timeInfo().lastModificationTime(), CompareItemIgnoreMilliseconds); const int comparison = compare(targetEntry->timeInfo().lastModificationTime(),
sourceEntry->timeInfo().lastModificationTime(),
CompareItemIgnoreMilliseconds);
if (comparison < 0) { if (comparison < 0) {
// we need to make our older entry "newer" than the new entry - therefore // we need to make our older entry "newer" than the new entry - therefore
// we just create a new history entry without any changes - this preserves // we just create a new history entry without any changes - this preserves
@ -300,11 +308,14 @@ Merger::ChangeList Merger::resolveEntryConflict_KeepLocal(const MergeContext& co
return changes; return changes;
} }
Merger::ChangeList Merger::resolveEntryConflict_KeepRemote(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry) Merger::ChangeList
Merger::resolveEntryConflict_KeepRemote(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry)
{ {
Q_UNUSED(context); Q_UNUSED(context);
ChangeList changes; ChangeList changes;
const int comparison = compare(targetEntry->timeInfo().lastModificationTime(), sourceEntry->timeInfo().lastModificationTime(), CompareItemIgnoreMilliseconds); const int comparison = compare(targetEntry->timeInfo().lastModificationTime(),
sourceEntry->timeInfo().lastModificationTime(),
CompareItemIgnoreMilliseconds);
if (comparison > 0) { if (comparison > 0) {
// we need to make our older entry "newer" than the new entry - therefore // we need to make our older entry "newer" than the new entry - therefore
// we just create a new history entry without any changes - this preserves // we just create a new history entry without any changes - this preserves
@ -322,13 +333,17 @@ Merger::ChangeList Merger::resolveEntryConflict_KeepRemote(const MergeContext& c
return changes; return changes;
} }
Merger::ChangeList Merger::resolveEntryConflict_MergeHistories(const MergeContext& context,
Merger::ChangeList Merger::resolveEntryConflict_MergeHistories(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry, Group::MergeMode mergeMethod) const Entry* sourceEntry,
Entry* targetEntry,
Group::MergeMode mergeMethod)
{ {
Q_UNUSED(context); Q_UNUSED(context);
ChangeList changes; ChangeList changes;
const int comparison = compare(targetEntry->timeInfo().lastModificationTime(), sourceEntry->timeInfo().lastModificationTime(), CompareItemIgnoreMilliseconds); const int comparison = compare(targetEntry->timeInfo().lastModificationTime(),
sourceEntry->timeInfo().lastModificationTime(),
CompareItemIgnoreMilliseconds);
if (comparison < 0) { if (comparison < 0) {
Group* currentGroup = targetEntry->group(); Group* currentGroup = targetEntry->group();
Entry* clonedEntry = sourceEntry->clone(Entry::CloneIncludeHistory); Entry* clonedEntry = sourceEntry->clone(Entry::CloneIncludeHistory);
@ -347,14 +362,15 @@ Merger::ChangeList Merger::resolveEntryConflict_MergeHistories(const MergeContex
qPrintable(targetEntry->group()->name())); qPrintable(targetEntry->group()->name()));
const bool changed = mergeHistory(sourceEntry, targetEntry, mergeMethod); const bool changed = mergeHistory(sourceEntry, targetEntry, mergeMethod);
if (changed) { if (changed) {
changes << tr("Synchronizing from older source %1 [%2]").arg(targetEntry->title(), targetEntry->uuidToHex()); changes
<< tr("Synchronizing from older source %1 [%2]").arg(targetEntry->title(), targetEntry->uuidToHex());
} }
} }
return changes; return changes;
} }
Merger::ChangeList
Merger::ChangeList Merger::resolveEntryConflict(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry) Merger::resolveEntryConflict(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry)
{ {
ChangeList changes; ChangeList changes;
// We need to cut off the milliseconds since the persistent format only supports times down to seconds // We need to cut off the milliseconds since the persistent format only supports times down to seconds
@ -395,15 +411,19 @@ bool Merger::mergeHistory(const Entry* sourceEntry, Entry* targetEntry, Group::M
Q_UNUSED(mergeMethod); Q_UNUSED(mergeMethod);
const auto targetHistoryItems = targetEntry->historyItems(); const auto targetHistoryItems = targetEntry->historyItems();
const auto sourceHistoryItems = sourceEntry->historyItems(); const auto sourceHistoryItems = sourceEntry->historyItems();
const int comparison = compare(sourceEntry->timeInfo().lastModificationTime(), targetEntry->timeInfo().lastModificationTime(), CompareItemIgnoreMilliseconds); const int comparison = compare(sourceEntry->timeInfo().lastModificationTime(),
targetEntry->timeInfo().lastModificationTime(),
CompareItemIgnoreMilliseconds);
const bool preferLocal = mergeMethod == Group::KeepLocal || comparison < 0; const bool preferLocal = mergeMethod == Group::KeepLocal || comparison < 0;
const bool preferRemote = mergeMethod == Group::KeepRemote || comparison > 0; const bool preferRemote = mergeMethod == Group::KeepRemote || comparison > 0;
QMap<QDateTime, Entry*> merged; QMap<QDateTime, Entry*> merged;
for (Entry* historyItem : targetHistoryItems) { for (Entry* historyItem : targetHistoryItems) {
const QDateTime modificationTime = Clock::serialized(historyItem->timeInfo().lastModificationTime()); const QDateTime modificationTime = Clock::serialized(historyItem->timeInfo().lastModificationTime());
if (merged.contains(modificationTime) && !merged[modificationTime]->equals(historyItem, CompareItemIgnoreMilliseconds)) { if (merged.contains(modificationTime)
::qWarning("Inconsistent history entry of %s[%s] at %s contains conflicting changes - conflict resolution may lose data!", && !merged[modificationTime]->equals(historyItem, CompareItemIgnoreMilliseconds)) {
::qWarning("Inconsistent history entry of %s[%s] at %s contains conflicting changes - conflict resolution "
"may lose data!",
qPrintable(sourceEntry->title()), qPrintable(sourceEntry->title()),
qPrintable(sourceEntry->uuidToHex()), qPrintable(sourceEntry->uuidToHex()),
qPrintable(modificationTime.toString("yyyy-MM-dd HH-mm-ss-zzz"))); qPrintable(modificationTime.toString("yyyy-MM-dd HH-mm-ss-zzz")));
@ -413,8 +433,10 @@ bool Merger::mergeHistory(const Entry* sourceEntry, Entry* targetEntry, Group::M
for (Entry* historyItem : sourceHistoryItems) { for (Entry* historyItem : sourceHistoryItems) {
// Items with same modification-time changes will be regarded as same (like KeePass2) // Items with same modification-time changes will be regarded as same (like KeePass2)
const QDateTime modificationTime = Clock::serialized(historyItem->timeInfo().lastModificationTime()); const QDateTime modificationTime = Clock::serialized(historyItem->timeInfo().lastModificationTime());
if (merged.contains(modificationTime) && !merged[modificationTime]->equals(historyItem, CompareItemIgnoreMilliseconds)) { if (merged.contains(modificationTime)
::qWarning("History entry of %s[%s] at %s contains conflicting changes - conflict resolution may lose data!", && !merged[modificationTime]->equals(historyItem, CompareItemIgnoreMilliseconds)) {
::qWarning(
"History entry of %s[%s] at %s contains conflicting changes - conflict resolution may lose data!",
qPrintable(sourceEntry->title()), qPrintable(sourceEntry->title()),
qPrintable(sourceEntry->uuidToHex()), qPrintable(sourceEntry->uuidToHex()),
qPrintable(modificationTime.toString("yyyy-MM-dd HH-mm-ss-zzz"))); qPrintable(modificationTime.toString("yyyy-MM-dd HH-mm-ss-zzz")));
@ -430,7 +452,9 @@ bool Merger::mergeHistory(const Entry* sourceEntry, Entry* targetEntry, Group::M
const QDateTime targetModificationTime = Clock::serialized(targetEntry->timeInfo().lastModificationTime()); const QDateTime targetModificationTime = Clock::serialized(targetEntry->timeInfo().lastModificationTime());
const QDateTime sourceModificationTime = Clock::serialized(sourceEntry->timeInfo().lastModificationTime()); const QDateTime sourceModificationTime = Clock::serialized(sourceEntry->timeInfo().lastModificationTime());
if (targetModificationTime == sourceModificationTime && !targetEntry->equals(sourceEntry, CompareItemIgnoreMilliseconds | CompareItemIgnoreHistory | CompareItemIgnoreLocation)) { if (targetModificationTime == sourceModificationTime
&& !targetEntry->equals(sourceEntry,
CompareItemIgnoreMilliseconds | CompareItemIgnoreHistory | CompareItemIgnoreLocation)) {
::qWarning("Entry of %s[%s] contains conflicting changes - conflict resolution may lose data!", ::qWarning("Entry of %s[%s] contains conflicting changes - conflict resolution may lose data!",
qPrintable(sourceEntry->title()), qPrintable(sourceEntry->title()),
qPrintable(sourceEntry->uuidToHex())); qPrintable(sourceEntry->uuidToHex()));

View file

@ -55,14 +55,22 @@ private:
bool mergeHistory(const Entry* sourceEntry, Entry* targetEntry, Group::MergeMode mergeMethod); bool mergeHistory(const Entry* sourceEntry, Entry* targetEntry, Group::MergeMode mergeMethod);
void moveEntry(Entry* entry, Group* targetGroup); void moveEntry(Entry* entry, Group* targetGroup);
void moveGroup(Group* group, Group* targetGroup); void moveGroup(Group* group, Group* targetGroup);
void eraseEntry(Entry* entry); // remove an entry without a trace in the deletedObjects - needed for elemination cloned entries // remove an entry without a trace in the deletedObjects - needed for elemination cloned entries
void eraseGroup(Group* group); // remove an entry without a trace in the deletedObjects - needed for elemination cloned entries void eraseEntry(Entry* entry);
// remove an entry without a trace in the deletedObjects - needed for elemination cloned entries
void eraseGroup(Group* group);
ChangeList resolveEntryConflict(const MergeContext& context, const Entry* existingEntry, Entry* otherEntry); ChangeList resolveEntryConflict(const MergeContext& context, const Entry* existingEntry, Entry* otherEntry);
ChangeList resolveGroupConflict(const MergeContext& context, const Group* existingGroup, Group* otherGroup); ChangeList resolveGroupConflict(const MergeContext& context, const Group* existingGroup, Group* otherGroup);
Merger::ChangeList resolveEntryConflict_Duplicate(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry); Merger::ChangeList
Merger::ChangeList resolveEntryConflict_KeepLocal(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry); resolveEntryConflict_Duplicate(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry);
Merger::ChangeList resolveEntryConflict_KeepRemote(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry); Merger::ChangeList
Merger::ChangeList resolveEntryConflict_MergeHistories(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry, Group::MergeMode mergeMethod); resolveEntryConflict_KeepLocal(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry);
Merger::ChangeList
resolveEntryConflict_KeepRemote(const MergeContext& context, const Entry* sourceEntry, Entry* targetEntry);
Merger::ChangeList resolveEntryConflict_MergeHistories(const MergeContext& context,
const Entry* sourceEntry,
Entry* targetEntry,
Group::MergeMode mergeMethod);
private: private:
MergeContext m_context; MergeContext m_context;

View file

@ -9,6 +9,7 @@ class OSEventFilter : public QAbstractNativeEventFilter
public: public:
OSEventFilter(); OSEventFilter();
bool nativeEventFilter(const QByteArray& eventType, void* message, long* result) override; bool nativeEventFilter(const QByteArray& eventType, void* message, long* result) override;
private: private:
Q_DISABLE_COPY(OSEventFilter) Q_DISABLE_COPY(OSEventFilter)
}; };

View file

@ -124,7 +124,6 @@ bool PasswordGenerator::isValid() const
} }
return !passwordGroups().isEmpty(); return !passwordGroups().isEmpty();
} }
QVector<PasswordGroup> PasswordGenerator::passwordGroups() const QVector<PasswordGroup> PasswordGenerator::passwordGroups() const

View file

@ -22,14 +22,12 @@
#include "core/Translator.h" #include "core/Translator.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QElapsedTimer>
#include <QIODevice> #include <QIODevice>
#include <QImageReader> #include <QImageReader>
#include <QLocale> #include <QLocale>
#include <QStringList>
#include <QRegularExpression> #include <QRegularExpression>
#include <QStringList>
#include <QElapsedTimer>
#include <cctype> #include <cctype>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -105,8 +103,7 @@ bool readAllFromDevice(QIODevice* device, QByteArray& data)
if (readResult > 0) { if (readResult > 0) {
readBytes += readResult; readBytes += readResult;
} }
} } while (readResult > 0);
while (readResult > 0);
if (readResult == -1) { if (readResult == -1) {
return false; return false;
@ -196,8 +193,7 @@ void wait(int ms)
QCoreApplication::processEvents(QEventLoop::AllEvents, timeLeft); QCoreApplication::processEvents(QEventLoop::AllEvents, timeLeft);
sleep(10); sleep(10);
} }
} } while (!timer.hasExpired(ms));
while (!timer.hasExpired(ms));
} }
} }

View file

@ -39,8 +39,8 @@ bool isHex(const QByteArray& ba);
bool isBase64(const QByteArray& ba); bool isBase64(const QByteArray& ba);
void sleep(int ms); void sleep(int ms);
void wait(int ms); void wait(int ms);
QRegularExpression convertToRegex(const QString& string, bool useWildcards = false, bool exactMatch = false, QRegularExpression convertToRegex(const QString& string, bool useWildcards = false,
bool caseSensitive = false); bool exactMatch = false, bool caseSensitive = false);
template <typename RandomAccessIterator, typename T> template <typename RandomAccessIterator, typename T>
RandomAccessIterator binaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T& value) RandomAccessIterator binaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T& value)

View file

@ -144,7 +144,8 @@ bool Crypto::testSha512()
QByteArray sha512Test = QByteArray sha512Test =
CryptoHash::hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", CryptoHash::Sha512); CryptoHash::hash("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", CryptoHash::Sha512);
if (sha512Test != QByteArray::fromHex("204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b" if (sha512Test
!= QByteArray::fromHex("204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b"
"07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445")) { "07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445")) {
raiseError("SHA-512 mismatch."); raiseError("SHA-512 mismatch.");
return false; return false;

View file

@ -18,8 +18,8 @@
#ifndef KEEPASSX_KDF_H #ifndef KEEPASSX_KDF_H
#define KEEPASSX_KDF_H #define KEEPASSX_KDF_H
#include <QVariant>
#include <QUuid> #include <QUuid>
#include <QVariant>
#define KDF_DEFAULT_SEED_SIZE 32 #define KDF_DEFAULT_SEED_SIZE 32
#define KDF_DEFAULT_ROUNDS 1000000ull #define KDF_DEFAULT_ROUNDS 1000000ull

View file

@ -42,8 +42,7 @@ bool Kdbx3Reader::readDatabaseImpl(QIODevice* device,
// check if all required headers were present // check if all required headers were present
if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() || m_streamStartBytes.isEmpty() if (m_masterSeed.isEmpty() || m_encryptionIV.isEmpty() || m_streamStartBytes.isEmpty()
|| m_protectedStreamKey.isEmpty() || m_protectedStreamKey.isEmpty() || db->cipher().isNull()) {
|| db->cipher().isNull()) {
raiseError(tr("missing database headers")); raiseError(tr("missing database headers"));
return false; return false;
} }

View file

@ -66,9 +66,10 @@ bool Kdbx3Writer::writeDatabase(QIODevice* device, Database* db)
writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3_1); writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_3_1);
CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122())); CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122()));
CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::CompressionFlags, CHECK_RETURN_FALSE(
Endian::sizedIntToBytes<qint32>(db->compressionAlgorithm(), writeHeaderField<quint16>(&header,
KeePass2::BYTEORDER))); KeePass2::HeaderFieldID::CompressionFlags,
Endian::sizedIntToBytes<qint32>(db->compressionAlgorithm(), KeePass2::BYTEORDER)));
auto kdf = db->kdf(); auto kdf = db->kdf();
CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed)); CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed));
CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::TransformSeed, kdf->seed())); CHECK_RETURN_FALSE(writeHeaderField<quint16>(&header, KeePass2::HeaderFieldID::TransformSeed, kdf->seed()));

View file

@ -72,10 +72,12 @@ bool Kdbx4Writer::writeDatabase(QIODevice* device, Database* db)
writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_4); writeMagicNumbers(&header, KeePass2::SIGNATURE_1, KeePass2::SIGNATURE_2, KeePass2::FILE_VERSION_4);
CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122())); CHECK_RETURN_FALSE(
CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CompressionFlags, writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::CipherID, db->cipher().toRfc4122()));
Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgorithm()), CHECK_RETURN_FALSE(writeHeaderField<quint32>(
KeePass2::BYTEORDER))); &header,
KeePass2::HeaderFieldID::CompressionFlags,
Endian::sizedIntToBytes(static_cast<int>(db->compressionAlgorithm()), KeePass2::BYTEORDER)));
CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed)); CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::MasterSeed, masterSeed));
CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::EncryptionIV, encryptionIV)); CHECK_RETURN_FALSE(writeHeaderField<quint32>(&header, KeePass2::HeaderFieldID::EncryptionIV, encryptionIV));

View file

@ -21,7 +21,6 @@
#include "core/Database.h" #include "core/Database.h"
#include "core/Metadata.h" #include "core/Metadata.h"
#include "core/TimeInfo.h" #include "core/TimeInfo.h"
#include "core/Database.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QPair> #include <QPair>

View file

@ -356,12 +356,14 @@ void KdbxXmlWriter::writeEntry(const Entry* entry)
for (const QString& key : attributesKeyList) { for (const QString& key : attributesKeyList) {
m_xml.writeStartElement("String"); m_xml.writeStartElement("String");
// clang-format off
bool protect = bool protect =
(((key == "Title") && m_meta->protectTitle()) || ((key == "UserName") && m_meta->protectUsername()) (((key == "Title") && m_meta->protectTitle()) || ((key == "UserName") && m_meta->protectUsername())
|| ((key == "Password") && m_meta->protectPassword()) || ((key == "Password") && m_meta->protectPassword())
|| ((key == "URL") && m_meta->protectUrl()) || ((key == "URL") && m_meta->protectUrl())
|| ((key == "Notes") && m_meta->protectNotes()) || ((key == "Notes") && m_meta->protectNotes())
|| entry->attributes()->isProtected(key)); || entry->attributes()->isProtected(key));
// clang-format on
writeString("Key", key); writeString("Key", key);

View file

@ -35,6 +35,6 @@ namespace KeePass1
Rijndael = 2, Rijndael = 2,
Twofish = 8 Twofish = 8
}; };
} } // namespace KeePass1
#endif // KEEPASSX_KEEPASS1_H #endif // KEEPASSX_KEEPASS1_H

View file

@ -50,14 +50,12 @@ const QString KeePass2::KDFPARAM_ARGON2_ASSOCDATA("A");
const QList<QPair<QUuid, QString>> KeePass2::CIPHERS{ const QList<QPair<QUuid, QString>> KeePass2::CIPHERS{
qMakePair(KeePass2::CIPHER_AES256, QObject::tr("AES: 256-bit")), qMakePair(KeePass2::CIPHER_AES256, QObject::tr("AES: 256-bit")),
qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")), qMakePair(KeePass2::CIPHER_TWOFISH, QObject::tr("Twofish: 256-bit")),
qMakePair(KeePass2::CIPHER_CHACHA20, QObject::tr("ChaCha20: 256-bit")) qMakePair(KeePass2::CIPHER_CHACHA20, QObject::tr("ChaCha20: 256-bit"))};
};
const QList<QPair<QUuid, QString>> KeePass2::KDFS{ const QList<QPair<QUuid, QString>> KeePass2::KDFS{
qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2 (KDBX 4 – recommended)")), qMakePair(KeePass2::KDF_ARGON2, QObject::tr("Argon2 (KDBX 4 – recommended)")),
qMakePair(KeePass2::KDF_AES_KDBX4, QObject::tr("AES-KDF (KDBX 4)")), qMakePair(KeePass2::KDF_AES_KDBX4, QObject::tr("AES-KDF (KDBX 4)")),
qMakePair(KeePass2::KDF_AES_KDBX3, QObject::tr("AES-KDF (KDBX 3.1)")) qMakePair(KeePass2::KDF_AES_KDBX3, QObject::tr("AES-KDF (KDBX 3.1)"))};
};
QByteArray KeePass2::hmacKey(const QByteArray& masterSeed, const QByteArray& transformedMasterKey) QByteArray KeePass2::hmacKey(const QByteArray& masterSeed, const QByteArray& transformedMasterKey)
{ {

View file

@ -21,9 +21,9 @@
#include <QList> #include <QList>
#include <QMap> #include <QMap>
#include <QSharedPointer> #include <QSharedPointer>
#include <QUuid>
#include <QVariantMap> #include <QVariantMap>
#include <QtGlobal> #include <QtGlobal>
#include <QUuid>
#include "crypto/SymmetricCipher.h" #include "crypto/SymmetricCipher.h"
#include "crypto/kdf/Kdf.h" #include "crypto/kdf/Kdf.h"

View file

@ -64,10 +64,9 @@ AboutDialog::AboutDialog(QWidget* parent)
debugInfo.append(tr("Distribution: %1").arg(KEEPASSXC_DIST_TYPE).append("\n")); debugInfo.append(tr("Distribution: %1").arg(KEEPASSXC_DIST_TYPE).append("\n"));
#endif #endif
debugInfo.append("\n").append(QString("%1\n- Qt %2\n- %3\n\n") debugInfo.append("\n").append(
.arg(tr("Libraries:"), QString("%1\n- Qt %2\n- %3\n\n")
QString::fromLocal8Bit(qVersion()), .arg(tr("Libraries:"), QString::fromLocal8Bit(qVersion()), Crypto::backendVersion()));
Crypto::backendVersion()));
#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
debugInfo.append(tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4") debugInfo.append(tr("Operating system: %1\nCPU architecture: %2\nKernel: %3 %4")

View file

@ -25,7 +25,7 @@ namespace Ui
{ {
class ApplicationSettingsWidgetGeneral; class ApplicationSettingsWidgetGeneral;
class ApplicationSettingsWidgetSecurity; class ApplicationSettingsWidgetSecurity;
} } // namespace Ui
class ISettingsPage class ISettingsPage
{ {

View file

@ -38,8 +38,9 @@ CategoryListWidget::CategoryListWidget(QWidget* parent)
connect(m_ui->scrollUp, SIGNAL(clicked()), SLOT(scrollCategoriesUp())); connect(m_ui->scrollUp, SIGNAL(clicked()), SLOT(scrollCategoriesUp()));
connect(m_ui->scrollDown, SIGNAL(clicked()), SLOT(scrollCategoriesDown())); connect(m_ui->scrollDown, SIGNAL(clicked()), SLOT(scrollCategoriesDown()));
connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateCategoryScrollButtons())); connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateCategoryScrollButtons()));
connect( // clang-format off
m_ui->categoryList->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), SLOT(updateCategoryScrollButtons())); connect(m_ui->categoryList->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), SLOT(updateCategoryScrollButtons()));
// clang-format on
} }
CategoryListWidget::~CategoryListWidget() CategoryListWidget::~CategoryListWidget()

View file

@ -105,9 +105,11 @@ void DatabaseOpenWidget::showEvent(QShowEvent* event)
#ifdef WITH_XC_YUBIKEY #ifdef WITH_XC_YUBIKEY
// showEvent() may be called twice, so make sure we are only polling once // showEvent() may be called twice, so make sure we are only polling once
if (!m_yubiKeyBeingPolled) { if (!m_yubiKeyBeingPolled) {
// clang-format off
connect(YubiKey::instance(), SIGNAL(detected(int,bool)), SLOT(yubikeyDetected(int,bool)), Qt::QueuedConnection); connect(YubiKey::instance(), SIGNAL(detected(int,bool)), SLOT(yubikeyDetected(int,bool)), Qt::QueuedConnection);
connect(YubiKey::instance(), SIGNAL(detectComplete()), SLOT(yubikeyDetectComplete()), Qt::QueuedConnection); connect(YubiKey::instance(), SIGNAL(detectComplete()), SLOT(yubikeyDetectComplete()), Qt::QueuedConnection);
connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection); connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection);
// clang-format on
pollYubikey(); pollYubikey();
m_yubiKeyBeingPolled = true; m_yubiKeyBeingPolled = true;

View file

@ -94,10 +94,12 @@ QSharedPointer<Database> DatabaseTabWidget::execNewDatabaseWizard()
Q_ASSERT(db->key()); Q_ASSERT(db->key());
Q_ASSERT(db->kdf()); Q_ASSERT(db->kdf());
if (!db->key() || !db->kdf()) { if (!db->key() || !db->kdf()) {
MessageBox::critical(this, tr("Database creation error"), MessageBox::critical(this,
tr("Database creation error"),
tr("The created database has no key or KDF, refusing to save it.\n" tr("The created database has no key or KDF, refusing to save it.\n"
"This is definitely a bug, please report it to the developers."), "This is definitely a bug, please report it to the developers."),
QMessageBox::Ok, QMessageBox::Ok); QMessageBox::Ok,
QMessageBox::Ok);
return {}; return {};
} }
@ -216,7 +218,7 @@ void DatabaseTabWidget::mergeDatabase()
auto dbWidget = currentDatabaseWidget(); auto dbWidget = currentDatabaseWidget();
if (dbWidget && !dbWidget->isLocked()) { if (dbWidget && !dbWidget->isLocked()) {
QString filter = QString("%1 (*.kdbx);;%2 (*)").arg(tr("KeePass 2 Database"), tr("All files")); QString filter = QString("%1 (*.kdbx);;%2 (*)").arg(tr("KeePass 2 Database"), tr("All files"));
const QString fileName = fileDialog()->getOpenFileName(this, tr("Merge database"), "", filter); const QString fileName = fileDialog()->getOpenFileName(this, tr("Merge database"), QString(), filter);
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
mergeDatabase(fileName); mergeDatabase(fileName);
} }

View file

@ -50,8 +50,8 @@
#include "gui/EntryPreviewWidget.h" #include "gui/EntryPreviewWidget.h"
#include "gui/KeePass1OpenWidget.h" #include "gui/KeePass1OpenWidget.h"
#include "gui/MessageBox.h" #include "gui/MessageBox.h"
#include "gui/TotpSetupDialog.h"
#include "gui/TotpDialog.h" #include "gui/TotpDialog.h"
#include "gui/TotpSetupDialog.h"
#include "gui/TotpExportSettingsDialog.h" #include "gui/TotpExportSettingsDialog.h"
#include "gui/entry/EditEntryWidget.h" #include "gui/entry/EditEntryWidget.h"
#include "gui/entry/EntryView.h" #include "gui/entry/EntryView.h"
@ -155,6 +155,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
addChildWidget(m_csvImportWizard); addChildWidget(m_csvImportWizard);
addChildWidget(m_keepass1OpenWidget); addChildWidget(m_keepass1OpenWidget);
// clang-format off
connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged())); connect(m_mainSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(mainSplitterSizesChanged()));
connect(m_previewSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(previewSplitterSizesChanged())); connect(m_previewSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(previewSplitterSizesChanged()));
connect(this, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), m_previewView, SLOT(setDatabaseMode(DatabaseWidget::Mode))); connect(this, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), m_previewView, SLOT(setDatabaseMode(DatabaseWidget::Mode)));
@ -177,6 +178,7 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
connect(&m_fileWatchTimer, SIGNAL(timeout()), this, SLOT(reloadDatabaseFile())); connect(&m_fileWatchTimer, SIGNAL(timeout()), this, SLOT(reloadDatabaseFile()));
connect(&m_fileWatchUnblockTimer, SIGNAL(timeout()), this, SLOT(unblockAutoReload())); connect(&m_fileWatchUnblockTimer, SIGNAL(timeout()), this, SLOT(unblockAutoReload()));
connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitCurrentModeChanged())); connect(this, SIGNAL(currentChanged(int)), this, SLOT(emitCurrentModeChanged()));
// clang-format on
connectDatabaseSignals(); connectDatabaseSignals();

View file

@ -18,6 +18,7 @@
#include "EditWidget.h" #include "EditWidget.h"
#include "ui_EditWidget.h" #include "ui_EditWidget.h"
#include <QPushButton> #include <QPushButton>
#include <QScrollArea> #include <QScrollArea>

View file

@ -31,6 +31,7 @@
#ifdef WITH_XC_NETWORKING #ifdef WITH_XC_NETWORKING
#include <QtNetwork> #include <QtNetwork>
#include <QNetworkAccessManager>
#endif #endif
IconStruct::IconStruct() IconStruct::IconStruct()
@ -44,6 +45,7 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
, m_ui(new Ui::EditWidgetIcons()) , m_ui(new Ui::EditWidgetIcons())
, m_db(nullptr) , m_db(nullptr)
#ifdef WITH_XC_NETWORKING #ifdef WITH_XC_NETWORKING
, m_netMgr(new QNetworkAccessManager(this))
, m_reply(nullptr) , m_reply(nullptr)
#endif #endif
, m_defaultIconModel(new DefaultIconModel(this)) , m_defaultIconModel(new DefaultIconModel(this))
@ -54,6 +56,7 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
m_ui->defaultIconsView->setModel(m_defaultIconModel); m_ui->defaultIconsView->setModel(m_defaultIconModel);
m_ui->customIconsView->setModel(m_customIconModel); m_ui->customIconsView->setModel(m_customIconModel);
// clang-format off
connect(m_ui->defaultIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonDefaultIcons())); connect(m_ui->defaultIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonDefaultIcons()));
connect(m_ui->customIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonCustomIcons())); connect(m_ui->customIconsView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateRadioButtonCustomIcons()));
connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SLOT(updateWidgetsDefaultIcons(bool))); connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SLOT(updateWidgetsDefaultIcons(bool)));
@ -64,14 +67,11 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SIGNAL(widgetUpdated())); connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SIGNAL(widgetUpdated()));
connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SIGNAL(widgetUpdated())); connect(m_ui->defaultIconsRadio, SIGNAL(toggled(bool)), this, SIGNAL(widgetUpdated()));
connect(m_ui->defaultIconsView->selectionModel(), connect(m_ui->defaultIconsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SIGNAL(widgetUpdated()));
this, connect(m_ui->customIconsView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SIGNAL(widgetUpdated())); this, SIGNAL(widgetUpdated()));
connect(m_ui->customIconsView->selectionModel(), // clang-format on
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this,
SIGNAL(widgetUpdated()));
m_ui->faviconButton->setVisible(false); m_ui->faviconButton->setVisible(false);
m_ui->addButton->setEnabled(true); m_ui->addButton->setEnabled(true);
@ -156,7 +156,8 @@ void EditWidgetIcons::setUrl(const QString& url)
} }
#ifdef WITH_XC_NETWORKING #ifdef WITH_XC_NETWORKING
namespace { namespace
{
// Try to get the 2nd level domain of the host part of a QUrl. For example, // Try to get the 2nd level domain of the host part of a QUrl. For example,
// "foo.bar.example.com" would become "example.com", and "foo.bar.example.co.uk" // "foo.bar.example.com" would become "example.com", and "foo.bar.example.co.uk"
// would become "example.co.uk". // would become "example.co.uk".
@ -183,7 +184,7 @@ namespace {
QUrl url = convertVariantToUrl(var); QUrl url = convertVariantToUrl(var);
return url; return url;
} }
} } // namespace
#endif #endif
void EditWidgetIcons::downloadFavicon() void EditWidgetIcons::downloadFavicon()
@ -264,8 +265,9 @@ void EditWidgetIcons::fetchFinished()
return; return;
} else { } else {
if (!fallbackEnabled) { if (!fallbackEnabled) {
emit messageEditEntry(tr("Unable to fetch favicon.") + "\n" + emit messageEditEntry(
tr("Hint: You can enable DuckDuckGo as a fallback under Tools>Settings>Security"), tr("Unable to fetch favicon.") + "\n"
+ tr("Hint: You can enable DuckDuckGo as a fallback under Tools>Settings>Security"),
MessageWidget::Error); MessageWidget::Error);
} else { } else {
emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error); emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error);
@ -294,7 +296,7 @@ void EditWidgetIcons::startFetchFavicon(const QUrl& url)
QNetworkRequest request(url); QNetworkRequest request(url);
m_reply = m_netMgr.get(request); m_reply = m_netMgr->get(request);
connect(m_reply, &QNetworkReply::finished, this, &EditWidgetIcons::fetchFinished); connect(m_reply, &QNetworkReply::finished, this, &EditWidgetIcons::fetchFinished);
connect(m_reply, &QIODevice::readyRead, this, &EditWidgetIcons::fetchReadyRead); connect(m_reply, &QIODevice::readyRead, this, &EditWidgetIcons::fetchReadyRead);
#else #else
@ -339,8 +341,9 @@ void EditWidgetIcons::addCustomIconFromFile()
if (!errornames.empty()) { if (!errornames.empty()) {
// Show the first 8 icons that failed to load // Show the first 8 icons that failed to load
errornames = errornames.mid(0, 8); errornames = errornames.mid(0, 8);
emit messageEditEntry(msg + "\n" + tr("The following icon(s) failed:", "", errornames.size()) + emit messageEditEntry(msg + "\n" + tr("The following icon(s) failed:", "", errornames.size()) + "\n"
"\n" + errornames.join("\n"), MessageWidget::Error); + errornames.join("\n"),
MessageWidget::Error);
} else if (numloaded > 0) { } else if (numloaded > 0) {
emit messageEditEntry(msg, MessageWidget::Positive); emit messageEditEntry(msg, MessageWidget::Positive);
} else { } else {

View file

@ -21,9 +21,8 @@
#include <QSet> #include <QSet>
#include <QUrl> #include <QUrl>
#include <QWidget>
#include <QNetworkAccessManager>
#include <QUuid> #include <QUuid>
#include <QWidget>
#include "config-keepassx.h" #include "config-keepassx.h"
#include "core/Global.h" #include "core/Global.h"
@ -33,6 +32,7 @@ class Database;
class DefaultIconModel; class DefaultIconModel;
class CustomIconModel; class CustomIconModel;
#ifdef WITH_XC_NETWORKING #ifdef WITH_XC_NETWORKING
class QNetworkAccessManager;
class QNetworkReply; class QNetworkReply;
#endif #endif
@ -95,7 +95,7 @@ private:
QUrl m_fetchUrl; QUrl m_fetchUrl;
QList<QUrl> m_urlsToTry; QList<QUrl> m_urlsToTry;
QByteArray m_bytesReceived; QByteArray m_bytesReceived;
QNetworkAccessManager m_netMgr; QNetworkAccessManager* m_netMgr;
QNetworkReply* m_reply; QNetworkReply* m_reply;
int m_redirects; int m_redirects;
#endif #endif

View file

@ -16,11 +16,11 @@
*/ */
#include "EditWidgetProperties.h" #include "EditWidgetProperties.h"
#include "ui_EditWidgetProperties.h"
#include <QUuid>
#include "MessageBox.h" #include "MessageBox.h"
#include "ui_EditWidgetProperties.h"
#include <QUuid>
EditWidgetProperties::EditWidgetProperties(QWidget* parent) EditWidgetProperties::EditWidgetProperties(QWidget* parent)
: QWidget(parent) : QWidget(parent)
@ -32,9 +32,11 @@ EditWidgetProperties::EditWidgetProperties(QWidget* parent)
m_ui->removeCustomDataButton->setEnabled(false); m_ui->removeCustomDataButton->setEnabled(false);
m_ui->customDataTable->setModel(m_customDataModel); m_ui->customDataTable->setModel(m_customDataModel);
// clang-format off
connect(m_ui->customDataTable->selectionModel(), connect(m_ui->customDataTable->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SLOT(toggleRemoveButton(QItemSelection))); SLOT(toggleRemoveButton(QItemSelection)));
// clang-format on
connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData())); connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedPluginData()));
} }
@ -66,7 +68,8 @@ const CustomData* EditWidgetProperties::customData() const
void EditWidgetProperties::removeSelectedPluginData() void EditWidgetProperties::removeSelectedPluginData()
{ {
if (QMessageBox::Yes != MessageBox::question(this, if (QMessageBox::Yes
!= MessageBox::question(this,
tr("Delete plugin data?"), tr("Delete plugin data?"),
tr("Do you really want to delete the selected plugin data?\n" tr("Do you really want to delete the selected plugin data?\n"
"This may cause the affected plugins to malfunction."), "This may cause the affected plugins to malfunction."),
@ -97,8 +100,8 @@ void EditWidgetProperties::updateModel()
m_customDataModel->setHorizontalHeaderLabels({tr("Key"), tr("Value")}); m_customDataModel->setHorizontalHeaderLabels({tr("Key"), tr("Value")});
for (const QString& key : m_customData->keys()) { for (const QString& key : m_customData->keys()) {
m_customDataModel->appendRow(QList<QStandardItem*>() << new QStandardItem(key) m_customDataModel->appendRow(QList<QStandardItem*>()
<< new QStandardItem(m_customData->value(key))); << new QStandardItem(key) << new QStandardItem(m_customData->value(key)));
} }
m_ui->removeCustomDataButton->setEnabled(false); m_ui->removeCustomDataButton->setEnabled(false);

View file

@ -16,6 +16,7 @@
*/ */
#include "KeePass1OpenWidget.h" #include "KeePass1OpenWidget.h"
#include "ui_DatabaseOpenWidget.h"
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
@ -24,7 +25,6 @@
#include "core/Metadata.h" #include "core/Metadata.h"
#include "format/KeePass1Reader.h" #include "format/KeePass1Reader.h"
#include "gui/MessageBox.h" #include "gui/MessageBox.h"
#include "ui_DatabaseOpenWidget.h"
KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent) KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent)
: DatabaseOpenWidget(parent) : DatabaseOpenWidget(parent)

View file

@ -20,10 +20,10 @@
#include "ui_MainWindow.h" #include "ui_MainWindow.h"
#include <QCloseEvent> #include <QCloseEvent>
#include <QDesktopServices>
#include <QMimeData> #include <QMimeData>
#include <QShortcut> #include <QShortcut>
#include <QTimer> #include <QTimer>
#include <QDesktopServices>
#include "config-keepassx.h" #include "config-keepassx.h"
@ -56,8 +56,8 @@
#include <QtDBus/QtDBus> #include <QtDBus/QtDBus>
#endif #endif
#include "gui/PasswordGeneratorWidget.h"
#include "gui/ApplicationSettingsWidget.h" #include "gui/ApplicationSettingsWidget.h"
#include "gui/PasswordGeneratorWidget.h"
#include "touchid/TouchID.h" #include "touchid/TouchID.h"
@ -67,7 +67,8 @@ class BrowserPlugin : public ISettingsPage
public: public:
BrowserPlugin(DatabaseTabWidget* tabWidget) BrowserPlugin(DatabaseTabWidget* tabWidget)
{ {
m_nativeMessagingHost = QSharedPointer<NativeMessagingHost>(new NativeMessagingHost(tabWidget, browserSettings()->isEnabled())); m_nativeMessagingHost =
QSharedPointer<NativeMessagingHost>(new NativeMessagingHost(tabWidget, browserSettings()->isEnabled()));
} }
~BrowserPlugin() ~BrowserPlugin()
@ -346,11 +347,13 @@ MainWindow::MainWindow()
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
setUnifiedTitleAndToolBarOnMac(true); setUnifiedTitleAndToolBarOnMac(true);
#endif #endif
// clang-format off
connect(m_ui->tabWidget, connect(m_ui->tabWidget,
SIGNAL(messageGlobal(QString,MessageWidget::MessageType)), SIGNAL(messageGlobal(QString,MessageWidget::MessageType)),
this, this,
SLOT(displayGlobalMessage(QString,MessageWidget::MessageType))); SLOT(displayGlobalMessage(QString,MessageWidget::MessageType)));
// clang-format on
connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(hideGlobalMessage())); connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(hideGlobalMessage()));
m_screenLockListener = new ScreenLockListener(this); m_screenLockListener = new ScreenLockListener(this);
@ -368,13 +371,15 @@ MainWindow::MainWindow()
tr("WARNING: You are using an unstable build of KeePassXC!\n" tr("WARNING: You are using an unstable build of KeePassXC!\n"
"There is a high risk of corruption, maintain a backup of your databases.\n" "There is a high risk of corruption, maintain a backup of your databases.\n"
"This version is not meant for production use."), "This version is not meant for production use."),
MessageWidget::Warning, -1); MessageWidget::Warning,
-1);
#elif (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) && QT_VERSION < QT_VERSION_CHECK(5, 6, 0)) #elif (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) && QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
if (!config()->get("QtErrorMessageShown", false).toBool()) { if (!config()->get("QtErrorMessageShown", false).toBool()) {
m_ui->globalMessageWidget->showMessage( m_ui->globalMessageWidget->showMessage(
tr("WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!\n" tr("WARNING: Your Qt version may cause KeePassXC to crash with an On-Screen Keyboard!\n"
"We recommend you use the AppImage available on our downloads page."), "We recommend you use the AppImage available on our downloads page."),
MessageWidget::Warning, -1); MessageWidget::Warning,
-1);
config()->set("QtErrorMessageShown", true); config()->set("QtErrorMessageShown", true);
} }
#endif #endif

View file

@ -71,7 +71,8 @@ void PasswordEdit::setShowPassword(bool show)
emit showPasswordChanged(show); emit showPasswordChanged(show);
} }
bool PasswordEdit::isPasswordVisible() const { bool PasswordEdit::isPasswordVisible() const
{
return isEnabled(); return isEnabled();
} }

View file

@ -338,10 +338,8 @@ void PasswordGeneratorWidget::selectSimpleMode()
m_ui->checkBoxLower->setChecked(m_ui->checkBoxLowerAdv->isChecked()); m_ui->checkBoxLower->setChecked(m_ui->checkBoxLowerAdv->isChecked());
m_ui->checkBoxNumbers->setChecked(m_ui->checkBoxNumbersAdv->isChecked()); m_ui->checkBoxNumbers->setChecked(m_ui->checkBoxNumbersAdv->isChecked());
m_ui->checkBoxSpecialChars->setChecked(m_ui->checkBoxBraces->isChecked() | m_ui->checkBoxPunctuation->isChecked() m_ui->checkBoxSpecialChars->setChecked(m_ui->checkBoxBraces->isChecked() | m_ui->checkBoxPunctuation->isChecked()
| m_ui->checkBoxQuotes->isChecked() | m_ui->checkBoxQuotes->isChecked() | m_ui->checkBoxMath->isChecked()
| m_ui->checkBoxMath->isChecked() | m_ui->checkBoxDashes->isChecked() | m_ui->checkBoxLogograms->isChecked());
| m_ui->checkBoxDashes->isChecked()
| m_ui->checkBoxLogograms->isChecked());
m_ui->checkBoxExtASCII->setChecked(m_ui->checkBoxExtASCIIAdv->isChecked()); m_ui->checkBoxExtASCII->setChecked(m_ui->checkBoxExtASCIIAdv->isChecked());
m_ui->simpleBar->show(); m_ui->simpleBar->show();
} }

View file

@ -17,9 +17,10 @@
*/ */
#include "TotpSetupDialog.h" #include "TotpSetupDialog.h"
#include "totp/totp.h"
#include "ui_TotpSetupDialog.h" #include "ui_TotpSetupDialog.h"
#include "totp/totp.h"
TotpSetupDialog::TotpSetupDialog(QWidget* parent, Entry* entry) TotpSetupDialog::TotpSetupDialog(QWidget* parent, Entry* entry)
: QDialog(parent) : QDialog(parent)
, m_ui(new Ui::TotpSetupDialog()) , m_ui(new Ui::TotpSetupDialog())

View file

@ -89,7 +89,9 @@ CsvImportWidget::CsvImportWidget(QWidget* parent)
#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0) #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
connect(combo, QOverload<int>::of(&QComboBox::currentIndexChanged), [=] { comboChanged(combo, i); }); connect(combo, QOverload<int>::of(&QComboBox::currentIndexChanged), [=] { comboChanged(combo, i); });
#else #else
connect(combo, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=]{ comboChanged(combo, i); }); connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=] {
comboChanged(combo, i);
});
#endif #endif
// layout labels and combo fields in column-first order // layout labels and combo fields in column-first order

View file

@ -42,7 +42,6 @@ void CsvImportWizard::load(const QString& filename, Database* database)
m_parse->load(filename, database); m_parse->load(filename, database);
} }
void CsvImportWizard::parseFinished(bool accepted) void CsvImportWizard::parseFinished(bool accepted)
{ {
emit importFinished(accepted); emit importFinished(accepted);

View file

@ -18,16 +18,17 @@
#include "DatabaseSettingsDialog.h" #include "DatabaseSettingsDialog.h"
#include "ui_DatabaseSettingsDialog.h" #include "ui_DatabaseSettingsDialog.h"
#include "DatabaseSettingsWidgetGeneral.h"
#include "DatabaseSettingsWidgetEncryption.h" #include "DatabaseSettingsWidgetEncryption.h"
#include "DatabaseSettingsWidgetGeneral.h"
#include "DatabaseSettingsWidgetMasterKey.h" #include "DatabaseSettingsWidgetMasterKey.h"
#ifdef WITH_XC_BROWSER #ifdef WITH_XC_BROWSER
#include "DatabaseSettingsWidgetBrowser.h" #include "DatabaseSettingsWidgetBrowser.h"
#endif #endif
#include "core/Config.h" #include "core/Config.h"
#include "core/FilePath.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/FilePath.h"
#include "touchid/TouchID.h" #include "touchid/TouchID.h"
DatabaseSettingsDialog::DatabaseSettingsDialog(QWidget* parent) DatabaseSettingsDialog::DatabaseSettingsDialog(QWidget* parent)
@ -62,7 +63,8 @@ DatabaseSettingsDialog::DatabaseSettingsDialog(QWidget* parent)
connect(m_ui->advancedSettingsToggle, SIGNAL(toggled(bool)), SLOT(toggleAdvancedMode(bool))); connect(m_ui->advancedSettingsToggle, SIGNAL(toggled(bool)), SLOT(toggleAdvancedMode(bool)));
#ifdef WITH_XC_BROWSER #ifdef WITH_XC_BROWSER
m_ui->categoryList->addCategory(tr("Browser Integration"), FilePath::instance()->icon("apps", "internet-web-browser")); m_ui->categoryList->addCategory(tr("Browser Integration"),
FilePath::instance()->icon("apps", "internet-web-browser"));
m_ui->stackedWidget->addWidget(m_browserWidget); m_ui->stackedWidget->addWidget(m_browserWidget);
#endif #endif

View file

@ -18,8 +18,8 @@
#ifndef KEEPASSX_DATABASESETTINGSWIDGET_H #ifndef KEEPASSX_DATABASESETTINGSWIDGET_H
#define KEEPASSX_DATABASESETTINGSWIDGET_H #define KEEPASSX_DATABASESETTINGSWIDGET_H
#include "gui/DialogyWidget.h"
#include "config-keepassx.h" #include "config-keepassx.h"
#include "gui/DialogyWidget.h"
#include <QPointer> #include <QPointer>
#include <QScopedPointer> #include <QScopedPointer>

View file

@ -18,8 +18,8 @@
#include "DatabaseSettingsWidget.h" #include "DatabaseSettingsWidget.h"
#include "core/Database.h" #include "core/Database.h"
#include <QWidget>
#include <QTimer> #include <QTimer>
#include <QWidget>
DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent) DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent)
: SettingsWidget(parent) : SettingsWidget(parent)

View file

@ -17,18 +17,21 @@
*/ */
#include "DatabaseSettingsWidgetBrowser.h" #include "DatabaseSettingsWidgetBrowser.h"
#include "ui_DatabaseSettingsWidgetBrowser.h"
#include <QProgressDialog> #include <QProgressDialog>
#include "browser/BrowserSettings.h"
#include "core/Clock.h" #include "core/Clock.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/Entry.h" #include "core/Entry.h"
#include "core/Group.h" #include "core/Group.h"
#include "core/Metadata.h" #include "core/Metadata.h"
#include "gui/MessageBox.h" #include "gui/MessageBox.h"
#include "browser/BrowserSettings.h"
#include "ui_DatabaseSettingsWidgetBrowser.h"
DatabaseSettingsWidgetBrowser::DatabaseSettingsWidgetBrowser(QWidget* parent) DatabaseSettingsWidgetBrowser::DatabaseSettingsWidgetBrowser(QWidget* parent)
: DatabaseSettingsWidget(parent), m_ui(new Ui::DatabaseSettingsWidgetBrowser()) : DatabaseSettingsWidget(parent)
, m_ui(new Ui::DatabaseSettingsWidgetBrowser())
, m_customData(new CustomData(this)) , m_customData(new CustomData(this))
, m_customDataModel(new QStandardItemModel(this)) , m_customDataModel(new QStandardItemModel(this))
, m_browserService(nullptr) , m_browserService(nullptr)
@ -38,8 +41,13 @@ DatabaseSettingsWidgetBrowser::DatabaseSettingsWidgetBrowser(QWidget* parent)
m_ui->customDataTable->setModel(m_customDataModel); m_ui->customDataTable->setModel(m_customDataModel);
settingsWarning(); settingsWarning();
connect(m_ui->customDataTable->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
// clang-format off
connect(m_ui->customDataTable->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SLOT(toggleRemoveButton(QItemSelection))); SLOT(toggleRemoveButton(QItemSelection)));
// clang-format on
connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedKey())); connect(m_ui->removeCustomDataButton, SIGNAL(clicked()), SLOT(removeSelectedKey()));
connect(m_ui->convertToCustomData, SIGNAL(clicked()), this, SLOT(convertAttributesToCustomData())); connect(m_ui->convertToCustomData, SIGNAL(clicked()), this, SLOT(convertAttributesToCustomData()));
connect(m_ui->convertToCustomData, SIGNAL(clicked()), this, SLOT(updateSharedKeyList())); connect(m_ui->convertToCustomData, SIGNAL(clicked()), this, SLOT(updateSharedKeyList()));
@ -83,11 +91,13 @@ bool DatabaseSettingsWidgetBrowser::save()
void DatabaseSettingsWidgetBrowser::removeSelectedKey() void DatabaseSettingsWidgetBrowser::removeSelectedKey()
{ {
if (QMessageBox::Yes != MessageBox::question(this, if (QMessageBox::Yes
!= MessageBox::question(this,
tr("Delete the selected key?"), tr("Delete the selected key?"),
tr("Do you really want to delete the selected key?\n" tr("Do you really want to delete the selected key?\n"
"This may prevent connection to the browser plugin."), "This may prevent connection to the browser plugin."),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel)) { QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Cancel)) {
return; return;
} }
@ -116,8 +126,7 @@ void DatabaseSettingsWidgetBrowser::updateModel()
if (key.startsWith(BrowserService::ASSOCIATE_KEY_PREFIX)) { if (key.startsWith(BrowserService::ASSOCIATE_KEY_PREFIX)) {
QString strippedKey = key; QString strippedKey = key;
strippedKey.remove(BrowserService::ASSOCIATE_KEY_PREFIX); strippedKey.remove(BrowserService::ASSOCIATE_KEY_PREFIX);
m_customDataModel->appendRow(QList<QStandardItem*>() m_customDataModel->appendRow(QList<QStandardItem*>() << new QStandardItem(strippedKey)
<< new QStandardItem(strippedKey)
<< new QStandardItem(customData()->value(key))); << new QStandardItem(customData()->value(key)));
} }
} }
@ -132,7 +141,8 @@ void DatabaseSettingsWidgetBrowser::settingsWarning()
m_ui->removeSharedEncryptionKeys->setEnabled(false); m_ui->removeSharedEncryptionKeys->setEnabled(false);
m_ui->removeStoredPermissions->setEnabled(false); m_ui->removeStoredPermissions->setEnabled(false);
m_ui->customDataTable->setEnabled(false); m_ui->customDataTable->setEnabled(false);
m_ui->warningWidget->showMessage(tr("Enable Browser Integration to access these settings."), MessageWidget::Warning); m_ui->warningWidget->showMessage(tr("Enable Browser Integration to access these settings."),
MessageWidget::Warning);
m_ui->warningWidget->setCloseButtonVisible(false); m_ui->warningWidget->setCloseButtonVisible(false);
m_ui->warningWidget->setAutoHideTimeout(-1); m_ui->warningWidget->setAutoHideTimeout(-1);
} else { } else {
@ -146,11 +156,13 @@ void DatabaseSettingsWidgetBrowser::settingsWarning()
void DatabaseSettingsWidgetBrowser::removeSharedEncryptionKeys() void DatabaseSettingsWidgetBrowser::removeSharedEncryptionKeys()
{ {
if (QMessageBox::Yes != MessageBox::question(this, if (QMessageBox::Yes
!= MessageBox::question(this,
tr("Disconnect all browsers"), tr("Disconnect all browsers"),
tr("Do you really want to disconnect all browsers?\n" tr("Do you really want to disconnect all browsers?\n"
"This may prevent connection to the browser plugin."), "This may prevent connection to the browser plugin."),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel)) { QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Cancel)) {
return; return;
} }
@ -182,11 +194,13 @@ void DatabaseSettingsWidgetBrowser::removeSharedEncryptionKeys()
void DatabaseSettingsWidgetBrowser::removeStoredPermissions() void DatabaseSettingsWidgetBrowser::removeStoredPermissions()
{ {
if (QMessageBox::Yes != MessageBox::question(this, if (QMessageBox::Yes
!= MessageBox::question(this,
tr("Forget all site-specific settings on entries"), tr("Forget all site-specific settings on entries"),
tr("Do you really want forget all site-specific settings on every entry?\n" tr("Do you really want forget all site-specific settings on every entry?\n"
"Permissions to access entries will be revoked."), "Permissions to access entries will be revoked."),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel)) { QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Cancel)) {
return; return;
} }
@ -226,11 +240,14 @@ void DatabaseSettingsWidgetBrowser::removeStoredPermissions()
void DatabaseSettingsWidgetBrowser::convertAttributesToCustomData() void DatabaseSettingsWidgetBrowser::convertAttributesToCustomData()
{ {
if (QMessageBox::Yes != MessageBox::question(this, if (QMessageBox::Yes
!= MessageBox::question(
this,
tr("Move KeePassHTTP attributes to custom data"), tr("Move KeePassHTTP attributes to custom data"),
tr("Do you really want to move all legacy browser integration data to the latest standard?\n" tr("Do you really want to move all legacy browser integration data to the latest standard?\n"
"This is necessary to maintain compatibility with the browser plugin."), "This is necessary to maintain compatibility with the browser plugin."),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel)) { QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Cancel)) {
return; return;
} }
@ -242,4 +259,3 @@ void DatabaseSettingsWidgetBrowser::updateSharedKeyList()
{ {
updateModel(); updateModel();
} }

View file

@ -21,13 +21,14 @@
#include "DatabaseSettingsWidget.h" #include "DatabaseSettingsWidget.h"
#include "browser/BrowserService.h"
#include "core/CustomData.h"
#include "gui/DatabaseTabWidget.h"
#include <QItemSelection>
#include <QPointer> #include <QPointer>
#include <QScopedPointer> #include <QScopedPointer>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QItemSelection>
#include "core/CustomData.h"
#include "gui/DatabaseTabWidget.h"
#include "browser/BrowserService.h"
class Database; class Database;
namespace Ui namespace Ui
@ -45,7 +46,10 @@ public:
~DatabaseSettingsWidgetBrowser() override; ~DatabaseSettingsWidgetBrowser() override;
CustomData* customData() const; CustomData* customData() const;
inline bool hasAdvancedMode() const override { return false; } inline bool hasAdvancedMode() const override
{
return false;
}
public slots: public slots:
void initialize() override; void initialize() override;

View file

@ -17,13 +17,14 @@
#include "DatabaseSettingsWidgetEncryption.h" #include "DatabaseSettingsWidgetEncryption.h"
#include "ui_DatabaseSettingsWidgetEncryption.h" #include "ui_DatabaseSettingsWidgetEncryption.h"
#include "core/Database.h"
#include "core/Metadata.h"
#include "core/Global.h"
#include "core/AsyncTask.h" #include "core/AsyncTask.h"
#include "gui/MessageBox.h" #include "core/Database.h"
#include "core/Global.h"
#include "core/Metadata.h"
#include "crypto/kdf/Argon2Kdf.h" #include "crypto/kdf/Argon2Kdf.h"
#include "format/KeePass2.h" #include "format/KeePass2.h"
#include "gui/MessageBox.h"
#include <QApplication> #include <QApplication>
#include <QPushButton> #include <QPushButton>

View file

@ -38,7 +38,10 @@ public:
Q_DISABLE_COPY(DatabaseSettingsWidgetEncryption); Q_DISABLE_COPY(DatabaseSettingsWidgetEncryption);
~DatabaseSettingsWidgetEncryption() override; ~DatabaseSettingsWidgetEncryption() override;
inline bool hasAdvancedMode() const override { return true; } inline bool hasAdvancedMode() const override
{
return true;
}
void setAdvancedMode(bool advanced) override; void setAdvancedMode(bool advanced) override;
public slots: public slots:
@ -64,7 +67,11 @@ private slots:
void markDirty(); void markDirty();
private: private:
enum FormatSelection { KDBX4, KDBX3 }; enum FormatSelection
{
KDBX4,
KDBX3
};
static const char* CD_DECRYPTION_TIME_PREFERENCE_KEY; static const char* CD_DECRYPTION_TIME_PREFERENCE_KEY;
bool m_isDirty = false; bool m_isDirty = false;

View file

@ -17,6 +17,7 @@
#include "DatabaseSettingsWidgetGeneral.h" #include "DatabaseSettingsWidgetGeneral.h"
#include "ui_DatabaseSettingsWidgetGeneral.h" #include "ui_DatabaseSettingsWidgetGeneral.h"
#include "core/Clock.h" #include "core/Clock.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/Entry.h" #include "core/Entry.h"
@ -24,7 +25,8 @@
#include "core/Metadata.h" #include "core/Metadata.h"
DatabaseSettingsWidgetGeneral::DatabaseSettingsWidgetGeneral(QWidget* parent) DatabaseSettingsWidgetGeneral::DatabaseSettingsWidgetGeneral(QWidget* parent)
: DatabaseSettingsWidget(parent), m_ui(new Ui::DatabaseSettingsWidgetGeneral()) : DatabaseSettingsWidget(parent)
, m_ui(new Ui::DatabaseSettingsWidgetGeneral())
{ {
m_ui->setupUi(this); m_ui->setupUi(this);

View file

@ -38,7 +38,10 @@ public:
Q_DISABLE_COPY(DatabaseSettingsWidgetGeneral); Q_DISABLE_COPY(DatabaseSettingsWidgetGeneral);
~DatabaseSettingsWidgetGeneral() override; ~DatabaseSettingsWidgetGeneral() override;
inline bool hasAdvancedMode() const override { return false; } inline bool hasAdvancedMode() const override
{
return false;
}
public slots: public slots:
void initialize() override; void initialize() override;

View file

@ -16,18 +16,19 @@
*/ */
#include "DatabaseSettingsWidgetMasterKey.h" #include "DatabaseSettingsWidgetMasterKey.h"
#include "core/Database.h"
#include "keys/PasswordKey.h"
#include "keys/FileKey.h"
#include "keys/YkChallengeResponseKey.h"
#include "gui/MessageBox.h"
#include "gui/masterkey/PasswordEditWidget.h"
#include "gui/masterkey/KeyFileEditWidget.h"
#include "gui/masterkey/YubiKeyEditWidget.h"
#include <QVBoxLayout> #include "core/Database.h"
#include <QSpacerItem> #include "gui/MessageBox.h"
#include "gui/masterkey/KeyFileEditWidget.h"
#include "gui/masterkey/PasswordEditWidget.h"
#include "gui/masterkey/YubiKeyEditWidget.h"
#include "keys/FileKey.h"
#include "keys/PasswordKey.h"
#include "keys/YkChallengeResponseKey.h"
#include <QPushButton> #include <QPushButton>
#include <QSpacerItem>
#include <QVBoxLayout>
DatabaseSettingsWidgetMasterKey::DatabaseSettingsWidgetMasterKey(QWidget* parent) DatabaseSettingsWidgetMasterKey::DatabaseSettingsWidgetMasterKey(QWidget* parent)
: DatabaseSettingsWidget(parent) : DatabaseSettingsWidget(parent)
@ -168,18 +169,22 @@ bool DatabaseSettingsWidgetMasterKey::save()
#endif #endif
if (newKey->keys().isEmpty() && newKey->challengeResponseKeys().isEmpty()) { if (newKey->keys().isEmpty() && newKey->challengeResponseKeys().isEmpty()) {
MessageBox::critical(this, tr("No encryption key added"), MessageBox::critical(this,
tr("No encryption key added"),
tr("You must add at least one encryption key to secure your database!"), tr("You must add at least one encryption key to secure your database!"),
QMessageBox::Ok, QMessageBox::Ok); QMessageBox::Ok,
QMessageBox::Ok);
return false; return false;
} }
if (m_passwordEditWidget->visiblePage() == KeyComponentWidget::AddNew) { if (m_passwordEditWidget->visiblePage() == KeyComponentWidget::AddNew) {
auto answer = MessageBox::warning(this, tr("No password set"), auto answer = MessageBox::warning(this,
tr("No password set"),
tr("WARNING! You have not set a password. Using a database without " tr("WARNING! You have not set a password. Using a database without "
"a password is strongly discouraged!\n\n" "a password is strongly discouraged!\n\n"
"Are you sure you want to continue without a password?"), "Are you sure you want to continue without a password?"),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Cancel);
if (answer != QMessageBox::Yes) { if (answer != QMessageBox::Yes) {
return false; return false;
} }
@ -210,7 +215,8 @@ void DatabaseSettingsWidgetMasterKey::setAdditionalKeyOptionsVisible(bool show)
} }
bool DatabaseSettingsWidgetMasterKey::addToCompositeKey(KeyComponentWidget* widget, bool DatabaseSettingsWidgetMasterKey::addToCompositeKey(KeyComponentWidget* widget,
QSharedPointer<CompositeKey>& newKey, QSharedPointer<Key>& oldKey) QSharedPointer<CompositeKey>& newKey,
QSharedPointer<Key>& oldKey)
{ {
if (widget->visiblePage() == KeyComponentWidget::Edit) { if (widget->visiblePage() == KeyComponentWidget::Edit) {
QString error = tr("Unknown error"); QString error = tr("Unknown error");
@ -226,7 +232,8 @@ bool DatabaseSettingsWidgetMasterKey::addToCompositeKey(KeyComponentWidget* widg
} }
bool DatabaseSettingsWidgetMasterKey::addToCompositeKey(KeyComponentWidget* widget, bool DatabaseSettingsWidgetMasterKey::addToCompositeKey(KeyComponentWidget* widget,
QSharedPointer<CompositeKey>& newKey, QSharedPointer<ChallengeResponseKey>& oldKey) QSharedPointer<CompositeKey>& newKey,
QSharedPointer<ChallengeResponseKey>& oldKey)
{ {
if (widget->visiblePage() == KeyComponentWidget::Edit) { if (widget->visiblePage() == KeyComponentWidget::Edit) {
QString error = tr("Unknown error"); QString error = tr("Unknown error");

View file

@ -18,8 +18,9 @@
#ifndef KEEPASSXC_DATABASESETTINGSPAGECHANGEMASTERKEY_H #ifndef KEEPASSXC_DATABASESETTINGSPAGECHANGEMASTERKEY_H
#define KEEPASSXC_DATABASESETTINGSPAGECHANGEMASTERKEY_H #define KEEPASSXC_DATABASESETTINGSPAGECHANGEMASTERKEY_H
#include "config-keepassx.h"
#include "DatabaseSettingsWidget.h" #include "DatabaseSettingsWidget.h"
#include "config-keepassx.h"
#include <QPointer> #include <QPointer>
class Database; class Database;
@ -43,7 +44,10 @@ public:
void load(QSharedPointer<Database> db) override; void load(QSharedPointer<Database> db) override;
inline bool hasAdvancedMode() const override { return false; } inline bool hasAdvancedMode() const override
{
return false;
}
public slots: public slots:
void initialize() override; void initialize() override;
@ -58,9 +62,12 @@ private slots:
private: private:
void setAdditionalKeyOptionsVisible(bool show); void setAdditionalKeyOptionsVisible(bool show);
// clang-format off
bool addToCompositeKey(KeyComponentWidget* widget, bool addToCompositeKey(KeyComponentWidget* widget,
QSharedPointer<CompositeKey>& newKey, QSharedPointer<CompositeKey>& newKey,
QSharedPointer<Key>& oldKey); QSharedPointer<Key>& oldKey);
// clang-format on
bool addToCompositeKey(KeyComponentWidget* widget, bool addToCompositeKey(KeyComponentWidget* widget,
QSharedPointer<CompositeKey>& newKey, QSharedPointer<CompositeKey>& newKey,
QSharedPointer<ChallengeResponseKey>& oldKey); QSharedPointer<ChallengeResponseKey>& oldKey);

View file

@ -17,6 +17,7 @@
#include "DatabaseSettingsWidgetMetaDataSimple.h" #include "DatabaseSettingsWidgetMetaDataSimple.h"
#include "ui_DatabaseSettingsWidgetMetaDataSimple.h" #include "ui_DatabaseSettingsWidgetMetaDataSimple.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/Metadata.h" #include "core/Metadata.h"

View file

@ -38,7 +38,10 @@ public:
Q_DISABLE_COPY(DatabaseSettingWidgetMetaData); Q_DISABLE_COPY(DatabaseSettingWidgetMetaData);
~DatabaseSettingWidgetMetaData() override; ~DatabaseSettingWidgetMetaData() override;
inline bool hasAdvancedMode() const override { return false; } inline bool hasAdvancedMode() const override
{
return false;
}
public slots: public slots:
void initialize() override; void initialize() override;

View file

@ -18,11 +18,11 @@
#include "AutoTypeMatchView.h" #include "AutoTypeMatchView.h"
#include "gui/SortFilterHideProxyModel.h"
#include <QHeaderView> #include <QHeaderView>
#include <QKeyEvent> #include <QKeyEvent>
#include "gui/SortFilterHideProxyModel.h"
AutoTypeMatchView::AutoTypeMatchView(QWidget* parent) AutoTypeMatchView::AutoTypeMatchView(QWidget* parent)
: QTreeView(parent) : QTreeView(parent)
, m_model(new AutoTypeMatchModel(this)) , m_model(new AutoTypeMatchModel(this))
@ -43,8 +43,10 @@ AutoTypeMatchView::AutoTypeMatchView(QWidget* parent)
header()->setDefaultSectionSize(150); header()->setDefaultSectionSize(150);
connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex))); connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitMatchActivated(QModelIndex)));
// clang-format off
connect( connect(
selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(matchSelectionChanged())); selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(matchSelectionChanged()));
// clang-format on
} }
void AutoTypeMatchView::keyPressEvent(QKeyEvent* event) void AutoTypeMatchView::keyPressEvent(QKeyEvent* event)

View file

@ -102,9 +102,12 @@ EditEntryWidget::EditEntryWidget(QWidget* parent)
connect(this, SIGNAL(accepted()), SLOT(acceptEntry())); connect(this, SIGNAL(accepted()), SLOT(acceptEntry()));
connect(this, SIGNAL(rejected()), SLOT(cancel())); connect(this, SIGNAL(rejected()), SLOT(cancel()));
connect(this, SIGNAL(apply()), SLOT(commitEntry())); connect(this, SIGNAL(apply()), SLOT(commitEntry()));
// clang-format off
connect(m_iconsWidget, connect(m_iconsWidget,
SIGNAL(messageEditEntry(QString,MessageWidget::MessageType)), SIGNAL(messageEditEntry(QString,MessageWidget::MessageType)),
SLOT(showMessage(QString,MessageWidget::MessageType))); SLOT(showMessage(QString,MessageWidget::MessageType)));
// clang-format on
connect(m_iconsWidget, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage())); connect(m_iconsWidget, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage()));
m_mainUi->passwordGenerator->layout()->setContentsMargins(0, 0, 0, 0); m_mainUi->passwordGenerator->layout()->setContentsMargins(0, 0, 0, 0);
@ -166,6 +169,8 @@ void EditEntryWidget::setupAdvanced()
m_attributesModel->setEntryAttributes(m_entryAttributes); m_attributesModel->setEntryAttributes(m_entryAttributes);
m_advancedUi->attributesView->setModel(m_attributesModel); m_advancedUi->attributesView->setModel(m_attributesModel);
// clang-format off
connect(m_advancedUi->addAttributeButton, SIGNAL(clicked()), SLOT(insertAttribute())); connect(m_advancedUi->addAttributeButton, SIGNAL(clicked()), SLOT(insertAttribute()));
connect(m_advancedUi->editAttributeButton, SIGNAL(clicked()), SLOT(editCurrentAttribute())); connect(m_advancedUi->editAttributeButton, SIGNAL(clicked()), SLOT(editCurrentAttribute()));
connect(m_advancedUi->removeAttributeButton, SIGNAL(clicked()), SLOT(removeCurrentAttribute())); connect(m_advancedUi->removeAttributeButton, SIGNAL(clicked()), SLOT(removeCurrentAttribute()));
@ -176,6 +181,7 @@ void EditEntryWidget::setupAdvanced()
SLOT(updateCurrentAttribute())); SLOT(updateCurrentAttribute()));
connect(m_advancedUi->fgColorButton, SIGNAL(clicked()), SLOT(pickColor())); connect(m_advancedUi->fgColorButton, SIGNAL(clicked()), SLOT(pickColor()));
connect(m_advancedUi->bgColorButton, SIGNAL(clicked()), SLOT(pickColor())); connect(m_advancedUi->bgColorButton, SIGNAL(clicked()), SLOT(pickColor()));
// clang-format on
} }
void EditEntryWidget::setupIcon() void EditEntryWidget::setupIcon()
@ -193,26 +199,27 @@ void EditEntryWidget::setupAutoType()
m_autoTypeAssocModel->setAutoTypeAssociations(m_autoTypeAssoc); m_autoTypeAssocModel->setAutoTypeAssociations(m_autoTypeAssoc);
m_autoTypeUi->assocView->setModel(m_autoTypeAssocModel); m_autoTypeUi->assocView->setModel(m_autoTypeAssocModel);
m_autoTypeUi->assocView->setColumnHidden(1, true); m_autoTypeUi->assocView->setColumnHidden(1, true);
// clang-format off
connect(m_autoTypeUi->enableButton, SIGNAL(toggled(bool)), SLOT(updateAutoTypeEnabled())); connect(m_autoTypeUi->enableButton, SIGNAL(toggled(bool)), SLOT(updateAutoTypeEnabled()));
connect( connect(m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)),
m_autoTypeUi->customSequenceButton, SIGNAL(toggled(bool)), m_autoTypeUi->sequenceEdit, SLOT(setEnabled(bool))); m_autoTypeUi->sequenceEdit, SLOT(setEnabled(bool)));
connect(m_autoTypeUi->customWindowSequenceButton, connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(toggled(bool)),
SIGNAL(toggled(bool)), m_autoTypeUi->windowSequenceEdit, SLOT(setEnabled(bool)));
m_autoTypeUi->windowSequenceEdit,
SLOT(setEnabled(bool)));
connect(m_autoTypeUi->assocAddButton, SIGNAL(clicked()), SLOT(insertAutoTypeAssoc())); connect(m_autoTypeUi->assocAddButton, SIGNAL(clicked()), SLOT(insertAutoTypeAssoc()));
connect(m_autoTypeUi->assocRemoveButton, SIGNAL(clicked()), SLOT(removeAutoTypeAssoc())); connect(m_autoTypeUi->assocRemoveButton, SIGNAL(clicked()), SLOT(removeAutoTypeAssoc()));
connect(m_autoTypeUi->assocView->selectionModel(), connect(m_autoTypeUi->assocView->selectionModel(),
SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
SLOT(updateAutoTypeEnabled())); SLOT(updateAutoTypeEnabled()));
connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(updateAutoTypeEnabled()));
connect(m_autoTypeUi->assocView->selectionModel(), connect(m_autoTypeUi->assocView->selectionModel(),
SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
SLOT(loadCurrentAssoc(QModelIndex))); SLOT(loadCurrentAssoc(QModelIndex)));
connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(updateAutoTypeEnabled()));
connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(clearCurrentAssoc())); connect(m_autoTypeAssocModel, SIGNAL(modelReset()), SLOT(clearCurrentAssoc()));
connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), SLOT(applyCurrentAssoc())); connect(m_autoTypeUi->windowTitleCombo, SIGNAL(editTextChanged(QString)), SLOT(applyCurrentAssoc()));
connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(toggled(bool)), SLOT(applyCurrentAssoc())); connect(m_autoTypeUi->customWindowSequenceButton, SIGNAL(toggled(bool)), SLOT(applyCurrentAssoc()));
connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), SLOT(applyCurrentAssoc())); connect(m_autoTypeUi->windowSequenceEdit, SIGNAL(textChanged(QString)), SLOT(applyCurrentAssoc()));
// clang-format on
} }
void EditEntryWidget::setupProperties() void EditEntryWidget::setupProperties()
@ -234,14 +241,17 @@ void EditEntryWidget::setupHistory()
m_historyUi->historyView->setModel(m_sortModel); m_historyUi->historyView->setModel(m_sortModel);
m_historyUi->historyView->setRootIsDecorated(false); m_historyUi->historyView->setRootIsDecorated(false);
// clang-format off
connect(m_historyUi->historyView, SIGNAL(activated(QModelIndex)), SLOT(histEntryActivated(QModelIndex))); connect(m_historyUi->historyView, SIGNAL(activated(QModelIndex)), SLOT(histEntryActivated(QModelIndex)));
connect(m_historyUi->historyView->selectionModel(), connect(m_historyUi->historyView->selectionModel(),
SIGNAL(currentChanged(QModelIndex,QModelIndex)), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
SLOT(updateHistoryButtons(QModelIndex,QModelIndex))); SLOT(updateHistoryButtons(QModelIndex,QModelIndex)));
connect(m_historyUi->showButton, SIGNAL(clicked()), SLOT(showHistoryEntry())); connect(m_historyUi->showButton, SIGNAL(clicked()), SLOT(showHistoryEntry()));
connect(m_historyUi->restoreButton, SIGNAL(clicked()), SLOT(restoreHistoryEntry())); connect(m_historyUi->restoreButton, SIGNAL(clicked()), SLOT(restoreHistoryEntry()));
connect(m_historyUi->deleteButton, SIGNAL(clicked()), SLOT(deleteHistoryEntry())); connect(m_historyUi->deleteButton, SIGNAL(clicked()), SLOT(deleteHistoryEntry()));
connect(m_historyUi->deleteAllButton, SIGNAL(clicked()), SLOT(deleteAllHistoryEntries())); connect(m_historyUi->deleteAllButton, SIGNAL(clicked()), SLOT(deleteAllHistoryEntries()));
// clang-format on
} }
void EditEntryWidget::setupEntryUpdate() void EditEntryWidget::setupEntryUpdate()
@ -253,7 +263,7 @@ void EditEntryWidget::setupEntryUpdate()
connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges())); connect(m_mainUi->passwordRepeatEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges())); connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
#ifdef WITH_XC_NETWORKING #ifdef WITH_XC_NETWORKING
connect(m_mainUi->urlEdit, SIGNAL(textChanged(const QString&)), this, SLOT(updateFaviconButtonEnable(const QString&))); connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString&)), this, SLOT(updateFaviconButtonEnable(QString&)));
#endif #endif
connect(m_mainUi->expireCheck, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_mainUi->expireCheck, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_mainUi->notesEnabled, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_mainUi->notesEnabled, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
@ -288,13 +298,12 @@ void EditEntryWidget::setupEntryUpdate()
connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->attachmentRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->externalFileRadioButton, SIGNAL(toggled(bool)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->attachmentComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setUnsavedChanges()));
connect( connect(m_sshAgentUi->attachmentComboBox, SIGNAL(editTextChanged(QString)), this, SLOT(setUnsavedChanges()));
m_sshAgentUi->attachmentComboBox, SIGNAL(editTextChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->externalFileEdit, SIGNAL(textChanged(QString)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->addKeyToAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->addKeyToAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->removeKeyFromAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->removeKeyFromAgentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect( connect(m_sshAgentUi->requireUserConfirmationCheckBox, SIGNAL(stateChanged(int)),
m_sshAgentUi->requireUserConfirmationCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->lifetimeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->lifetimeCheckBox, SIGNAL(stateChanged(int)), this, SLOT(setUnsavedChanges()));
connect(m_sshAgentUi->lifetimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setUnsavedChanges())); connect(m_sshAgentUi->lifetimeSpinBox, SIGNAL(valueChanged(int)), this, SLOT(setUnsavedChanges()));
} }
@ -427,11 +436,8 @@ void EditEntryWidget::updateSSHAgentKeyInfo()
} }
if (!key.fingerprint().isEmpty()) { if (!key.fingerprint().isEmpty()) {
m_sshAgentUi->fingerprintTextLabel->setText( m_sshAgentUi->fingerprintTextLabel->setText(key.fingerprint(QCryptographicHash::Md5) + "\n"
key.fingerprint(QCryptographicHash::Md5) + + key.fingerprint(QCryptographicHash::Sha256));
"\n" +
key.fingerprint(QCryptographicHash::Sha256)
);
} else { } else {
m_sshAgentUi->fingerprintTextLabel->setText(tr("(encrypted)")); m_sshAgentUi->fingerprintTextLabel->setText(tr("(encrypted)"));
} }
@ -613,11 +619,8 @@ void EditEntryWidget::decryptPrivateKey()
m_sshAgentUi->commentTextLabel->setText(tr("n/a")); m_sshAgentUi->commentTextLabel->setText(tr("n/a"));
} }
m_sshAgentUi->fingerprintTextLabel->setText( m_sshAgentUi->fingerprintTextLabel->setText(key.fingerprint(QCryptographicHash::Md5) + "\n"
key.fingerprint(QCryptographicHash::Md5) + + key.fingerprint(QCryptographicHash::Sha256));
"\n" +
key.fingerprint(QCryptographicHash::Sha256)
);
m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey()); m_sshAgentUi->publicKeyEdit->document()->setPlainText(key.publicKey());
m_sshAgentUi->copyToClipboardButton->setEnabled(true); m_sshAgentUi->copyToClipboardButton->setEnabled(true);
} }

View file

@ -19,6 +19,7 @@
#ifndef KEEPASSX_EDITENTRYWIDGET_H #ifndef KEEPASSX_EDITENTRYWIDGET_H
#define KEEPASSX_EDITENTRYWIDGET_H #define KEEPASSX_EDITENTRYWIDGET_H
#include <QButtonGroup>
#include <QModelIndex> #include <QModelIndex>
#include <QScopedPointer> #include <QScopedPointer>
#include <QButtonGroup> #include <QButtonGroup>
@ -52,7 +53,7 @@ namespace Ui
class EditEntryWidgetMain; class EditEntryWidgetMain;
class EditEntryWidgetHistory; class EditEntryWidgetHistory;
class EditWidget; class EditWidget;
} } // namespace Ui
class EditEntryWidget : public EditWidget class EditEntryWidget : public EditWidget
{ {

View file

@ -43,9 +43,12 @@ EntryAttachmentsWidget::EntryAttachmentsWidget(QWidget* parent)
connect(this, SIGNAL(readOnlyChanged(bool)), SLOT(updateButtonsEnabled())); connect(this, SIGNAL(readOnlyChanged(bool)), SLOT(updateButtonsEnabled()));
connect(m_attachmentsModel, SIGNAL(modelReset()), SLOT(updateButtonsEnabled())); connect(m_attachmentsModel, SIGNAL(modelReset()), SLOT(updateButtonsEnabled()));
// clang-format off
connect(m_ui->attachmentsView->selectionModel(), connect(m_ui->attachmentsView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SLOT(updateButtonsEnabled())); SLOT(updateButtonsEnabled()));
// clang-format on
connect(m_ui->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex))); connect(m_ui->attachmentsView, SIGNAL(doubleClicked(QModelIndex)), SLOT(openAttachment(QModelIndex)));
connect(m_ui->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments())); connect(m_ui->saveAttachmentButton, SIGNAL(clicked()), SLOT(saveSelectedAttachments()));

View file

@ -46,9 +46,15 @@ void EntryAttributesModel::setEntryAttributes(EntryAttributes* entryAttributes)
connect(m_entryAttributes, SIGNAL(added(QString)), SLOT(attributeAdd())); connect(m_entryAttributes, SIGNAL(added(QString)), SLOT(attributeAdd()));
connect(m_entryAttributes, SIGNAL(aboutToBeRemoved(QString)), SLOT(attributeAboutToRemove(QString))); connect(m_entryAttributes, SIGNAL(aboutToBeRemoved(QString)), SLOT(attributeAboutToRemove(QString)));
connect(m_entryAttributes, SIGNAL(removed(QString)), SLOT(attributeRemove())); connect(m_entryAttributes, SIGNAL(removed(QString)), SLOT(attributeRemove()));
// clang-format off
connect( connect(
m_entryAttributes, SIGNAL(aboutToRename(QString,QString)), SLOT(attributeAboutToRename(QString,QString))); m_entryAttributes, SIGNAL(aboutToRename(QString,QString)), SLOT(attributeAboutToRename(QString,QString)));
// clang-format on
// clang-format off
connect(m_entryAttributes, SIGNAL(renamed(QString,QString)), SLOT(attributeRename(QString,QString))); connect(m_entryAttributes, SIGNAL(renamed(QString,QString)), SLOT(attributeRename(QString,QString)));
// clang-format on
connect(m_entryAttributes, SIGNAL(aboutToBeReset()), SLOT(aboutToReset())); connect(m_entryAttributes, SIGNAL(aboutToBeReset()), SLOT(aboutToReset()));
connect(m_entryAttributes, SIGNAL(reset()), SLOT(reset())); connect(m_entryAttributes, SIGNAL(reset()), SLOT(reset()));
} }

View file

@ -49,10 +49,12 @@ EntryView::EntryView(QWidget* parent)
// QAbstractItemView::startDrag() uses this property as the default drag action // QAbstractItemView::startDrag() uses this property as the default drag action
setDefaultDropAction(Qt::MoveAction); setDefaultDropAction(Qt::MoveAction);
// clang-format off
connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex))); connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(emitEntryActivated(QModelIndex)));
connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(emitEntrySelectionChanged())); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(emitEntrySelectionChanged()));
connect(m_model, SIGNAL(usernamesHiddenChanged()), SIGNAL(viewStateChanged())); connect(m_model, SIGNAL(usernamesHiddenChanged()), SIGNAL(viewStateChanged()));
connect(m_model, SIGNAL(passwordsHiddenChanged()), SIGNAL(viewStateChanged())); connect(m_model, SIGNAL(passwordsHiddenChanged()), SIGNAL(viewStateChanged()));
// clang-format on
m_headerMenu = new QMenu(this); m_headerMenu = new QMenu(this);
m_headerMenu->setTitle(tr("Customize View")); m_headerMenu->setTitle(tr("Customize View"));
@ -93,10 +95,21 @@ EntryView::EntryView(QWidget* parent)
header()->setContextMenuPolicy(Qt::CustomContextMenu); header()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(header(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(showHeaderMenu(QPoint))); connect(header(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(showHeaderMenu(QPoint)));
// clang-format off
connect(header(), SIGNAL(sectionCountChanged(int,int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sectionCountChanged(int,int)), SIGNAL(viewStateChanged()));
// clang-format on
// clang-format off
connect(header(), SIGNAL(sectionMoved(int,int,int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sectionMoved(int,int,int)), SIGNAL(viewStateChanged()));
// clang-format on
// clang-format off
connect(header(), SIGNAL(sectionResized(int,int,int)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sectionResized(int,int,int)), SIGNAL(viewStateChanged()));
// clang-format on
// clang-format off
connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), SIGNAL(viewStateChanged())); connect(header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), SIGNAL(viewStateChanged()));
// clang-format on
resetFixedColumns(); resetFixedColumns();

View file

@ -47,9 +47,12 @@ EditGroupWidget::EditGroupWidget(QWidget* parent)
connect(this, SIGNAL(accepted()), SLOT(save())); connect(this, SIGNAL(accepted()), SLOT(save()));
connect(this, SIGNAL(rejected()), SLOT(cancel())); connect(this, SIGNAL(rejected()), SLOT(cancel()));
// clang-format off
connect(m_editGroupWidgetIcons, connect(m_editGroupWidgetIcons,
SIGNAL(messageEditEntry(QString,MessageWidget::MessageType)), SIGNAL(messageEditEntry(QString,MessageWidget::MessageType)),
SLOT(showMessage(QString,MessageWidget::MessageType))); SLOT(showMessage(QString,MessageWidget::MessageType)));
// clang-format on
connect(m_editGroupWidgetIcons, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage())); connect(m_editGroupWidgetIcons, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage()));
} }

View file

@ -31,7 +31,7 @@ namespace Ui
{ {
class EditGroupWidgetMain; class EditGroupWidgetMain;
class EditWidget; class EditWidget;
} } // namespace Ui
class EditGroupWidget : public EditWidget class EditGroupWidget : public EditWidget
{ {

View file

@ -39,6 +39,7 @@ void GroupModel::changeDatabase(Database* newDb)
m_db = newDb; m_db = newDb;
// clang-format off
connect(m_db, SIGNAL(groupDataChanged(Group*)), SLOT(groupDataChanged(Group*))); connect(m_db, SIGNAL(groupDataChanged(Group*)), SLOT(groupDataChanged(Group*)));
connect(m_db, SIGNAL(groupAboutToAdd(Group*,int)), SLOT(groupAboutToAdd(Group*,int))); connect(m_db, SIGNAL(groupAboutToAdd(Group*,int)), SLOT(groupAboutToAdd(Group*,int)));
connect(m_db, SIGNAL(groupAdded()), SLOT(groupAdded())); connect(m_db, SIGNAL(groupAdded()), SLOT(groupAdded()));
@ -46,6 +47,7 @@ void GroupModel::changeDatabase(Database* newDb)
connect(m_db, SIGNAL(groupRemoved()), SLOT(groupRemoved())); connect(m_db, SIGNAL(groupRemoved()), SLOT(groupRemoved()));
connect(m_db, SIGNAL(groupAboutToMove(Group*,Group*,int)), SLOT(groupAboutToMove(Group*,Group*,int))); connect(m_db, SIGNAL(groupAboutToMove(Group*,Group*,int)), SLOT(groupAboutToMove(Group*,Group*,int)));
connect(m_db, SIGNAL(groupMoved()), SLOT(groupMoved())); connect(m_db, SIGNAL(groupMoved()), SLOT(groupMoved()));
// clang-format on
endResetModel(); endResetModel();
} }

View file

@ -34,11 +34,13 @@ GroupView::GroupView(Database* db, QWidget* parent)
setHeaderHidden(true); setHeaderHidden(true);
setUniformRowHeights(true); setUniformRowHeights(true);
// clang-format off
connect(this, SIGNAL(expanded(QModelIndex)), SLOT(expandedChanged(QModelIndex))); connect(this, SIGNAL(expanded(QModelIndex)), SLOT(expandedChanged(QModelIndex)));
connect(this, SIGNAL(collapsed(QModelIndex)), SLOT(expandedChanged(QModelIndex))); connect(this, SIGNAL(collapsed(QModelIndex)), SLOT(expandedChanged(QModelIndex)));
connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(syncExpandedState(QModelIndex,int,int))); connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(syncExpandedState(QModelIndex,int,int)));
connect(m_model, SIGNAL(modelReset()), SLOT(modelReset())); connect(m_model, SIGNAL(modelReset()), SLOT(modelReset()));
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(emitGroupChanged())); connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), SLOT(emitGroupChanged()));
// clang-format on
modelReset(); modelReset();

View file

@ -17,6 +17,7 @@
#include "KeyComponentWidget.h" #include "KeyComponentWidget.h"
#include "ui_KeyComponentWidget.h" #include "ui_KeyComponentWidget.h"
#include <QStackedWidget> #include <QStackedWidget>
#include <QTimer> #include <QTimer>
@ -124,7 +125,8 @@ void KeyComponentWidget::updateComponentName(const QString& name)
m_ui->addButton->setText(tr("Add %1", "Add a key component").arg(name)); m_ui->addButton->setText(tr("Add %1", "Add a key component").arg(name));
m_ui->changeButton->setText(tr("Change %1", "Change a key component").arg(name)); m_ui->changeButton->setText(tr("Change %1", "Change a key component").arg(name));
m_ui->removeButton->setText(tr("Remove %1", "Remove a key component").arg(name)); m_ui->removeButton->setText(tr("Remove %1", "Remove a key component").arg(name));
m_ui->changeOrRemoveLabel->setText(tr("%1 set, click to change or remove", "Change or remove a key component").arg(name)); m_ui->changeOrRemoveLabel->setText(
tr("%1 set, click to change or remove", "Change or remove a key component").arg(name));
} }
void KeyComponentWidget::updateComponentDescription(const QString& description) void KeyComponentWidget::updateComponentDescription(const QString& description)

View file

@ -18,8 +18,8 @@
#ifndef KEEPASSXC_KEYCOMPONENTWIDGET_H #ifndef KEEPASSXC_KEYCOMPONENTWIDGET_H
#define KEEPASSXC_KEYCOMPONENTWIDGET_H #define KEEPASSXC_KEYCOMPONENTWIDGET_H
#include <QWidget>
#include <QScopedPointer> #include <QScopedPointer>
#include <QWidget>
namespace Ui namespace Ui
{ {
@ -31,12 +31,14 @@ class QStackedWidget;
class KeyComponentWidget : public QWidget class KeyComponentWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
// clang-format off
Q_PROPERTY(QString componentName READ m_componentName READ componentName Q_PROPERTY(QString componentName READ m_componentName READ componentName
WRITE setComponentName NOTIFY nameChanged) WRITE setComponentName NOTIFY nameChanged)
Q_PROPERTY(QString componentDescription READ m_componentDescription READ componentDescription Q_PROPERTY(QString componentDescription READ m_componentDescription READ componentDescription
WRITE setComponentDescription NOTIFY descriptionChanged) WRITE setComponentDescription NOTIFY descriptionChanged)
Q_PROPERTY(bool componentAdded READ m_isComponentAdded READ componentAdded Q_PROPERTY(bool componentAdded READ m_isComponentAdded READ componentAdded
WRITE setComponentAdded NOTIFY componentAddChanged) WRITE setComponentAdded NOTIFY componentAddChanged)
// clang-format on
public: public:
enum Page enum Page

View file

@ -17,8 +17,9 @@
#include "KeyFileEditWidget.h" #include "KeyFileEditWidget.h"
#include "ui_KeyFileEditWidget.h" #include "ui_KeyFileEditWidget.h"
#include "gui/MainWindow.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
#include "gui/MainWindow.h"
#include "gui/MessageBox.h" #include "gui/MessageBox.h"
#include "keys/CompositeKey.h" #include "keys/CompositeKey.h"
#include "keys/FileKey.h" #include "keys/FileKey.h"
@ -100,8 +101,10 @@ void KeyFileEditWidget::createKeyFile()
QString errorMsg; QString errorMsg;
bool created = FileKey::create(fileName, &errorMsg); bool created = FileKey::create(fileName, &errorMsg);
if (!created) { if (!created) {
MessageBox::critical(getMainWindow(), tr("Error creating key file"), MessageBox::critical(getMainWindow(),
tr("Unable to create key file: %1").arg(errorMsg), QMessageBox::Button::Ok); tr("Error creating key file"),
tr("Unable to create key file: %1").arg(errorMsg),
QMessageBox::Button::Ok);
} else { } else {
m_compUi->keyFileCombo->setEditText(fileName); m_compUi->keyFileCombo->setEditText(fileName);
} }

View file

@ -17,10 +17,11 @@
#include "PasswordEditWidget.h" #include "PasswordEditWidget.h"
#include "ui_PasswordEditWidget.h" #include "ui_PasswordEditWidget.h"
#include "core/FilePath.h" #include "core/FilePath.h"
#include "gui/PasswordGeneratorWidget.h" #include "gui/PasswordGeneratorWidget.h"
#include "keys/PasswordKey.h"
#include "keys/CompositeKey.h" #include "keys/CompositeKey.h"
#include "keys/PasswordKey.h"
#include <QDialog> #include <QDialog>
@ -67,7 +68,10 @@ QWidget* PasswordEditWidget::componentEditWidget()
m_compUi->passwordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false)); m_compUi->passwordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false));
m_compUi->repeatPasswordEdit->enableVerifyMode(m_compUi->enterPasswordEdit); m_compUi->repeatPasswordEdit->enableVerifyMode(m_compUi->enterPasswordEdit);
connect(m_compUi->togglePasswordButton, SIGNAL(toggled(bool)), m_compUi->enterPasswordEdit, SLOT(setShowPassword(bool))); connect(m_compUi->togglePasswordButton,
SIGNAL(toggled(bool)),
m_compUi->enterPasswordEdit,
SLOT(setShowPassword(bool)));
connect(m_compUi->passwordGeneratorButton, SIGNAL(clicked(bool)), SLOT(showPasswordGenerator())); connect(m_compUi->passwordGeneratorButton, SIGNAL(clicked(bool)), SLOT(showPasswordGenerator()));
return m_compEditWidget; return m_compEditWidget;

View file

@ -17,11 +17,12 @@
#include "YubiKeyEditWidget.h" #include "YubiKeyEditWidget.h"
#include "ui_YubiKeyEditWidget.h" #include "ui_YubiKeyEditWidget.h"
#include "gui/MessageBox.h"
#include "config-keepassx.h"
#include "gui/MainWindow.h" #include "gui/MainWindow.h"
#include "gui/MessageBox.h"
#include "keys/CompositeKey.h" #include "keys/CompositeKey.h"
#include "keys/YkChallengeResponseKey.h" #include "keys/YkChallengeResponseKey.h"
#include "config-keepassx.h"
#include <QtConcurrent> #include <QtConcurrent>
@ -30,7 +31,8 @@ YubiKeyEditWidget::YubiKeyEditWidget(QWidget* parent)
, m_compUi(new Ui::YubiKeyEditWidget()) , m_compUi(new Ui::YubiKeyEditWidget())
{ {
setComponentName(tr("YubiKey Challenge-Response")); setComponentName(tr("YubiKey Challenge-Response"));
setComponentDescription(tr("<p>If you own a <a href=\"https://www.yubico.com/\">YubiKey</a>, you can use it " setComponentDescription(
tr("<p>If you own a <a href=\"https://www.yubico.com/\">YubiKey</a>, you can use it "
"for additional security.</p><p>The YubiKey requires one of its slots to be programmed as " "for additional security.</p><p>The YubiKey requires one of its slots to be programmed as "
"<a href=\"https://www.yubico.com/products/services-software/personalization-tools/challenge-response/\">" "<a href=\"https://www.yubico.com/products/services-software/personalization-tools/challenge-response/\">"
"HMAC-SHA1 Challenge-Response</a>.</p>")); "HMAC-SHA1 Challenge-Response</a>.</p>"));
@ -75,7 +77,10 @@ QWidget* YubiKeyEditWidget::componentEditWidget()
#ifdef WITH_XC_YUBIKEY #ifdef WITH_XC_YUBIKEY
connect(m_compUi->buttonRedetectYubikey, SIGNAL(clicked()), SLOT(pollYubikey())); connect(m_compUi->buttonRedetectYubikey, SIGNAL(clicked()), SLOT(pollYubikey()));
// clang-format off
connect(YubiKey::instance(), SIGNAL(detected(int,bool)), SLOT(yubikeyDetected(int,bool)), Qt::QueuedConnection); connect(YubiKey::instance(), SIGNAL(detected(int,bool)), SLOT(yubikeyDetected(int,bool)), Qt::QueuedConnection);
// clang-format on
connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection); connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection);
pollYubikey(); pollYubikey();

View file

@ -16,14 +16,14 @@
*/ */
#include "NewDatabaseWizard.h" #include "NewDatabaseWizard.h"
#include "NewDatabaseWizardPageMetaData.h"
#include "NewDatabaseWizardPageEncryption.h" #include "NewDatabaseWizardPageEncryption.h"
#include "NewDatabaseWizardPageMasterKey.h" #include "NewDatabaseWizardPageMasterKey.h"
#include "NewDatabaseWizardPageMetaData.h"
#include "core/Global.h"
#include "core/Database.h" #include "core/Database.h"
#include "core/Group.h"
#include "core/FilePath.h" #include "core/FilePath.h"
#include "core/Global.h"
#include "core/Group.h"
#include "format/KeePass2.h" #include "format/KeePass2.h"
#include <QVBoxLayout> #include <QVBoxLayout>
@ -35,9 +35,11 @@ NewDatabaseWizard::NewDatabaseWizard(QWidget* parent)
setWizardStyle(QWizard::MacStyle); setWizardStyle(QWizard::MacStyle);
setOption(QWizard::WizardOption::HaveHelpButton, false); setOption(QWizard::WizardOption::HaveHelpButton, false);
// clang-format off
m_pages << new NewDatabaseWizardPageMetaData() m_pages << new NewDatabaseWizardPageMetaData()
<< new NewDatabaseWizardPageEncryption() << new NewDatabaseWizardPageEncryption()
<< new NewDatabaseWizardPageMasterKey(); << new NewDatabaseWizardPageMasterKey();
// clang-format on
for (const auto& page : asConst(m_pages)) { for (const auto& page : asConst(m_pages)) {
addPage(page); addPage(page);

View file

@ -19,6 +19,7 @@
#include "NewDatabaseWizardPage.h" #include "NewDatabaseWizardPage.h"
#include "ui_NewDatabaseWizardPage.h" #include "ui_NewDatabaseWizardPage.h"
#include "core/Database.h" #include "core/Database.h"
#include "gui/dbsettings/DatabaseSettingsWidget.h" #include "gui/dbsettings/DatabaseSettingsWidget.h"

View file

@ -25,9 +25,14 @@
class ChallengeResponseKey class ChallengeResponseKey
{ {
public: public:
explicit ChallengeResponseKey(const QUuid& uuid) : m_uuid(uuid) {} explicit ChallengeResponseKey(const QUuid& uuid)
: m_uuid(uuid)
{
}
Q_DISABLE_COPY(ChallengeResponseKey); Q_DISABLE_COPY(ChallengeResponseKey);
virtual ~ChallengeResponseKey() {} virtual ~ChallengeResponseKey()
{
}
virtual QByteArray rawKey() const = 0; virtual QByteArray rawKey() const = 0;
virtual bool challenge(const QByteArray& challenge) = 0; virtual bool challenge(const QByteArray& challenge) = 0;
virtual QUuid uuid() const virtual QUuid uuid() const

View file

@ -45,7 +45,7 @@ public:
void addKey(const QSharedPointer<Key>& key); void addKey(const QSharedPointer<Key>& key);
const QList<QSharedPointer<Key>>& keys() const; const QList<QSharedPointer<Key>>& keys() const;
void addChallengeResponseKey(const QSharedPointer<ChallengeResponseKey>& key);\ void addChallengeResponseKey(const QSharedPointer<ChallengeResponseKey>& key);
const QList<QSharedPointer<ChallengeResponseKey>>& challengeResponseKeys() const; const QList<QSharedPointer<ChallengeResponseKey>>& challengeResponseKeys() const;
private: private:

View file

@ -25,7 +25,8 @@
class Key class Key
{ {
public: public:
explicit Key(const QUuid& uuid) : m_uuid(uuid) {}; explicit Key(const QUuid& uuid)
: m_uuid(uuid){};
Q_DISABLE_COPY(Key); Q_DISABLE_COPY(Key);
virtual ~Key() = default; virtual ~Key() = default;
virtual QByteArray rawKey() const = 0; virtual QByteArray rawKey() const = 0;

View file

@ -18,8 +18,8 @@
#ifndef KEEPASSX_PASSWORDKEY_H #ifndef KEEPASSX_PASSWORDKEY_H
#define KEEPASSX_PASSWORDKEY_H #define KEEPASSX_PASSWORDKEY_H
#include <QString>
#include <QSharedPointer> #include <QSharedPointer>
#include <QString>
#include "keys/Key.h" #include "keys/Key.h"
@ -34,6 +34,7 @@ public:
void setPassword(const QString& password); void setPassword(const QString& password);
static QSharedPointer<PasswordKey> fromRawKey(const QByteArray& rawKey); static QSharedPointer<PasswordKey> fromRawKey(const QByteArray& rawKey);
private: private:
QByteArray m_key; QByteArray m_key;
}; };

View file

@ -15,6 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "keys/YkChallengeResponseKey.h" #include "keys/YkChallengeResponseKey.h"
#include "keys/drivers/YubiKey.h" #include "keys/drivers/YubiKey.h"

Some files were not shown because too many files have changed in this diff Show more