diff --git a/CMakeLists.txt b/CMakeLists.txt index e6d4270ca..3708667a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (C) 2010 Felix Geyer # Copyright (C) 2017 KeePassXC Team +# Copyright (C) 2010 Felix Geyer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -41,10 +41,17 @@ option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) -option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) +option(WITH_XC_NETWORKING "Include networking code (e.g. for downlading website icons)." OFF) +option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) +option(WITH_XC_HTTP "Include KeePassHTTP-compatible browser integration (deprecated, implies WITH_NETWORKING)." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) -option(WITH_XC_BROWSER "Include browser extension support." OFF) + +if(WITH_XC_HTTP) + message(WARNING "KeePassHTTP support has been deprecated and will be removed in a future version. Please use WITH_XC_BROWSER instead!\n" + "For enabling / disabling network access code, WITH_XC_HTTP has been replaced by WITH_XC_NETWORKING.") + set(WITH_XC_NETWORKING ON CACHE BOOL "Include networking code (e.g. for downlading website icons)." FORCE) +endif() # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6a9638959..7abbfc823 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -187,15 +187,21 @@ set(keepassx_SOURCES_MAINEXE main.cpp ) -add_feature_info(AutoType WITH_XC_AUTOTYPE "Automatic password typing") -add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox") -add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") +add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing") +add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)") +add_feature_info(keepassxc-browser WITH_XC_BROWSER "Browser integration with keepassxc-browser") +add_feature_info(KeePassHTTP WITH_XC_HTTP "Browser integration compatible with ChromeIPass and PassIFox (deprecated, implies Networking)") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") -add_feature_info(keepassxc-browser WITH_XC_BROWSER "KeePassXC browser support with keepassxc-browser") +add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") + -add_subdirectory(http) if(WITH_XC_HTTP) - set(keepasshttp_LIB keepasshttp qhttp Qt5::Network) + add_subdirectory(http) + set(keepasshttp_LIB keepasshttp) +endif() +if(WITH_XC_NETWORKING) + add_subdirectory(http/qhttp) + set(keepassxcnetwork_LIB qhttp Qt5::Network) endif() set(BROWSER_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/browser) @@ -247,8 +253,9 @@ add_library(keepassx_core STATIC ${keepassx_SOURCES}) set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE) target_link_libraries(keepassx_core - ${keepasshttp_LIB} ${keepassxcbrowser_LIB} + ${keepasshttp_LIB} + ${keepassxcnetwork_LIB} ${autotype_LIB} ${sshagent_LIB} ${YUBIKEY_LIBRARIES} diff --git a/src/browser/BrowserOptionDialog.cpp b/src/browser/BrowserOptionDialog.cpp index 2040bef66..859afc8cf 100755 --- a/src/browser/BrowserOptionDialog.cpp +++ b/src/browser/BrowserOptionDialog.cpp @@ -23,7 +23,7 @@ #include "core/FilePath.h" #include -#include +#include BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : QWidget(parent), @@ -36,6 +36,7 @@ BrowserOptionDialog::BrowserOptionDialog(QWidget* parent) : m_ui->warningWidget->showMessage(tr("The following options can be dangerous!\nChange them only if you know what you are doing."), MessageWidget::Warning); m_ui->warningWidget->setIcon(FilePath::instance()->icon("status", "dialog-warning")); m_ui->warningWidget->setCloseButtonVisible(false); + m_ui->warningWidget->setAutoHideTimeout(-1); m_ui->tabWidget->setEnabled(m_ui->enableBrowserSupport->isChecked()); connect(m_ui->enableBrowserSupport, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake index 5a00a5dba..e98830b09 100644 --- a/src/config-keepassx.h.cmake +++ b/src/config-keepassx.h.cmake @@ -12,11 +12,12 @@ #define KEEPASSX_PLUGIN_DIR "${PLUGIN_INSTALL_DIR}" #define KEEPASSX_DATA_DIR "${DATA_INSTALL_DIR}" -#cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_AUTOTYPE +#cmakedefine WITH_XC_NETWORKING +#cmakedefine WITH_XC_BROWSER +#cmakedefine WITH_XC_HTTP #cmakedefine WITH_XC_YUBIKEY #cmakedefine WITH_XC_SSHAGENT -#cmakedefine WITH_XC_BROWSER #cmakedefine KEEPASSXC_DIST #cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@" diff --git a/src/gui/AboutDialog.cpp b/src/gui/AboutDialog.cpp index 44ab895e8..9ce3eda5d 100644 --- a/src/gui/AboutDialog.cpp +++ b/src/gui/AboutDialog.cpp @@ -78,20 +78,20 @@ AboutDialog::AboutDialog(QWidget* parent) #endif QString extensions; -#ifdef WITH_XC_HTTP - extensions += "\n- KeePassHTTP"; -#endif #ifdef WITH_XC_AUTOTYPE extensions += "\n- Auto-Type"; #endif -#ifdef WITH_XC_YUBIKEY - extensions += "\n- YubiKey"; +#ifdef WITH_XC_BROWSER + extensions += "\n- Browser Integration"; +#endif +#ifdef WITH_XC_HTTP + extensions += "\n- Legacy Browser Integration (KeePassHTTP)"; #endif #ifdef WITH_XC_SSHAGENT extensions += "\n- SSH Agent"; #endif -#ifdef WITH_XC_BROWSER - extensions += "\n- Native messaging browser extension"; +#ifdef WITH_XC_YUBIKEY + extensions += "\n- YubiKey"; #endif if (extensions.isEmpty()) diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp index 7c01b31f1..3ff036e35 100644 --- a/src/gui/EditWidgetIcons.cpp +++ b/src/gui/EditWidgetIcons.cpp @@ -30,7 +30,7 @@ #include "gui/IconModels.h" #include "gui/MessageBox.h" -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING #include "http/qhttp/qhttpclient.hpp" #include "http/qhttp/qhttpclientresponse.hpp" @@ -49,11 +49,13 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent) , m_database(nullptr) , m_defaultIconModel(new DefaultIconModel(this)) , m_customIconModel(new CustomIconModel(this)) - #ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING , m_fallbackToGoogle(true) , m_redirectCount(0) +#endif +#ifdef WITH_XC_HTTP , m_httpClient(nullptr) - #endif +#endif { m_ui->setupUi(this); @@ -146,7 +148,7 @@ void EditWidgetIcons::load(const Uuid& currentUuid, Database* database, const Ic void EditWidgetIcons::setUrl(const QString& url) { -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING m_url = url; m_ui->faviconButton->setVisible(!url.isEmpty()); resetFaviconDownload(); @@ -158,14 +160,14 @@ void EditWidgetIcons::setUrl(const QString& url) void EditWidgetIcons::downloadFavicon() { -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING QUrl url = QUrl(m_url); url.setPath("/favicon.ico"); fetchFavicon(url); #endif } -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING void EditWidgetIcons::fetchFavicon(const QUrl& url) { if (nullptr == m_httpClient) { diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h index 5c27ffe29..0c155f7d9 100644 --- a/src/gui/EditWidgetIcons.h +++ b/src/gui/EditWidgetIcons.h @@ -32,7 +32,7 @@ class Database; class DefaultIconModel; class CustomIconModel; -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING namespace qhttp { namespace client { class QHttpClient; @@ -73,7 +73,7 @@ signals: private slots: void downloadFavicon(); -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING void fetchFavicon(const QUrl& url); void fetchFaviconFromGoogle(const QString& domain); void resetFaviconDownload(bool clearRedirect = true); @@ -93,7 +93,7 @@ private: QString m_url; DefaultIconModel* const m_defaultIconModel; CustomIconModel* const m_customIconModel; -#ifdef WITH_XC_HTTP +#ifdef WITH_XC_NETWORKING QUrl m_redirectUrl; bool m_fallbackToGoogle; unsigned short m_redirectCount; diff --git a/src/gui/KMessageWidget.cpp b/src/gui/KMessageWidget.cpp index 7f4cb94f4..fe9d46605 100644 --- a/src/gui/KMessageWidget.cpp +++ b/src/gui/KMessageWidget.cpp @@ -287,7 +287,7 @@ void KMessageWidget::setMessageType(KMessageWidget::MessageType type) bg1 = palette().highlight().color(); break; case Warning: - bg1.setRgb(181, 102, 0); // values taken from kcolorscheme.cpp (Neutral) + bg1.setRgb(191, 126, 7); // values taken from kcolorscheme.cpp (Neutral) break; case Error: bg1.setRgb(191, 3, 3); // values taken from kcolorscheme.cpp (Negative) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index a3e713426..fcb112426 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(QT_NO_DBUS) #include @@ -195,6 +196,9 @@ MainWindow::MainWindow() setWindowIcon(filePath()->applicationIcon()); m_ui->globalMessageWidget->setHidden(true); + connect(m_ui->globalMessageWidget, SIGNAL(linkActivated(const QString&)), this, SLOT(openLink(const QString&))); + connect(m_ui->globalMessageWidget, SIGNAL(showAnimationStarted()), m_ui->globalMessageWidgetContainer, SLOT(show())); + connect(m_ui->globalMessageWidget, SIGNAL(hideAnimationFinished()), m_ui->globalMessageWidgetContainer, SLOT(hide())); m_clearHistoryAction = new QAction(tr("Clear history"), m_ui->menuFile); m_lastDatabasesActions = new QActionGroup(m_ui->menuRecentDatabases); @@ -407,13 +411,44 @@ MainWindow::MainWindow() m_ui->globalMessageWidget->showMessage( tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error); } - +#ifdef WITH_XC_HTTP + if (config()->get("Http/Enabled", false).toBool() && !config()->get("Http/DeprecationNoticeShown", false).toBool()) { + // show message after tab widget dismissed all messages + connect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); + } +#endif } MainWindow::~MainWindow() { } +void MainWindow::showKeePassHTTPDeprecationNotice() +{ + displayGlobalMessage(tr("

It looks like you are using KeePassHTTP for browser integration.
" + "This feature has been deprecated and will be removed in the future.
" + "Please switch to keepassxc-browser instead! For help with migration,
" + "visit our " + "keepassxc-browser migration guide.

"), + MessageWidget::Warning, true, -1); + + config()->set("Http/DeprecationNoticeShown", true); + disconnect(m_ui->tabWidget, SIGNAL(messageDismissGlobal()), this, SLOT(showKeePassHTTPDeprecationNotice())); +} + +/** + * Open a link using the system's default handler. + * Links that are not HTTP(s) links are ignored. + * + * @param link link URL + */ +void MainWindow::openLink(const QString& link) +{ + if (link.startsWith("http://") || link.startsWith("https://")) { + QDesktopServices::openUrl(QUrl(link)); + } +} + void MainWindow::appExit() { m_appExitCalled = true; diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index b70dd9072..cfec5e3f5 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -97,6 +97,8 @@ private slots: void repairDatabase(); void hideTabMessage(); void handleScreenLock(); + void showKeePassHTTPDeprecationNotice(); + void openLink(const QString& link); private: static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index c4d782f08..0b39d0b3d 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -21,6 +21,9 @@ true + + 0 + 0 @@ -34,13 +37,28 @@ 0 - - - - 0 - 0 - - + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + MessageWidget {margin: 90px} + + + + diff --git a/src/gui/MessageWidget.cpp b/src/gui/MessageWidget.cpp index 2be298055..4f722ed6b 100644 --- a/src/gui/MessageWidget.cpp +++ b/src/gui/MessageWidget.cpp @@ -47,6 +47,7 @@ void MessageWidget::showMessage(const QString &text, KMessageWidget::MessageType { setMessageType(type); setText(text); + emit showAnimationStarted(); animatedShow(); if (autoHideTimeout > 0) { m_autoHideTimer->start(autoHideTimeout); diff --git a/src/gui/MessageWidget.h b/src/gui/MessageWidget.h index c29c320bf..0eb7a20fa 100644 --- a/src/gui/MessageWidget.h +++ b/src/gui/MessageWidget.h @@ -35,6 +35,9 @@ public: static const int DefaultAutoHideTimeout; static const int DisableAutoHide; +signals: + void showAnimationStarted(); + public slots: void showMessage(const QString& text, MessageWidget::MessageType type); void showMessage(const QString& text, MessageWidget::MessageType type, int autoHideTimeout); diff --git a/src/gui/SettingsWidget.cpp b/src/gui/SettingsWidget.cpp index ce3df3338..7d3f65f81 100644 --- a/src/gui/SettingsWidget.cpp +++ b/src/gui/SettingsWidget.cpp @@ -82,7 +82,7 @@ SettingsWidget::SettingsWidget(QWidget* parent) connect(m_secUi->lockDatabaseIdleCheckBox, SIGNAL(toggled(bool)), m_secUi->lockDatabaseIdleSpinBox, SLOT(setEnabled(bool))); -#ifndef WITH_XC_HTTP +#ifndef WITH_XC_NETWORKING m_secUi->privacy->setVisible(false); #endif } diff --git a/src/http/CMakeLists.txt b/src/http/CMakeLists.txt index 8a3b197ab..db9f5dfb3 100644 --- a/src/http/CMakeLists.txt +++ b/src/http/CMakeLists.txt @@ -1,5 +1,3 @@ -add_subdirectory(qhttp) - if(WITH_XC_HTTP) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/src/http/OptionDialog.cpp b/src/http/OptionDialog.cpp index 03ae6e9ce..f7f27433c 100644 --- a/src/http/OptionDialog.cpp +++ b/src/http/OptionDialog.cpp @@ -39,6 +39,8 @@ OptionDialog::OptionDialog(QWidget *parent) : m_ui->tabWidget->setEnabled(m_ui->enableHttpServer->isChecked()); connect(m_ui->enableHttpServer, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool))); + + m_ui->deprecationNotice->setOpenExternalLinks(true); } OptionDialog::~OptionDialog() diff --git a/src/http/OptionDialog.ui b/src/http/OptionDialog.ui index abe994772..39b0ce403 100644 --- a/src/http/OptionDialog.ui +++ b/src/http/OptionDialog.ui @@ -6,8 +6,8 @@ 0 0 - 577 - 404 + 803 + 433 @@ -26,6 +26,13 @@ 0 + + + + <p><b>NOTE:</b> KeePassHTTP has been deprecated and will be removed in the future.<br>Please switch to keepassxc-browser instead! For help with migration, visit our <a href="https://keepassxc.org/docs/keepassxc-browser-migration">keepassxc-browser migration guide</a>.</p> + + +