Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/browser/BrowserSettingsWidget.cpp')
-rw-r--r--src/browser/BrowserSettingsWidget.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/src/browser/BrowserSettingsWidget.cpp b/src/browser/BrowserSettingsWidget.cpp
new file mode 100644
index 000000000..d0bdad1f1
--- /dev/null
+++ b/src/browser/BrowserSettingsWidget.cpp
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "BrowserSettingsWidget.h"
+#include "ui_BrowserSettingsWidget.h"
+
+#include "BrowserSettings.h"
+#include "config-keepassx.h"
+#include "core/Resources.h"
+
+#include <QFileDialog>
+
+BrowserSettingsWidget::BrowserSettingsWidget(QWidget* parent)
+ : QWidget(parent)
+ , m_ui(new Ui::BrowserSettingsWidget())
+{
+ m_ui->setupUi(this);
+
+ // clang-format off
+ QString snapInstructions;
+#if defined(KEEPASSXC_DIST_SNAP)
+ snapInstructions = "<br /><br />" +
+ tr("Due to Snap sandboxing, you must run a script to enable browser integration."
+ "<br />"
+ "You can obtain this script from %1")
+ .arg("<a href=\"https://keepassxc.org/download#linux\">https://keepassxc.org</a>");
+#endif
+
+ 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 and %3. %4")
+ .arg("<a href=\"https://addons.mozilla.org/firefox/addon/keepassxc-browser/\">Firefox</a>",
+ "<a href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\">"
+ "Google Chrome / Chromium / Vivaldi / Brave</a>",
+ "<a href=\"https://microsoftedge.microsoft.com/addons/detail/pdffhmdngciaglkoonimfcmckehcpafo\">Microsoft Edge</a>",
+ snapInstructions));
+ // clang-format on
+
+ m_ui->warningWidget->setCloseButtonVisible(false);
+ m_ui->warningWidget->setAutoHideTimeout(-1);
+ m_ui->warningWidget->setAnimate(false);
+
+ m_ui->tabWidget->setEnabled(m_ui->enableBrowserSupport->isChecked());
+ connect(m_ui->enableBrowserSupport, SIGNAL(toggled(bool)), m_ui->tabWidget, SLOT(setEnabled(bool)));
+
+ // Custom Browser option
+#ifdef Q_OS_WIN
+ // TODO: Custom browser is disabled on Windows
+ m_ui->customBrowserSupport->setVisible(false);
+ m_ui->customBrowserGroupBox->setVisible(false);
+#else
+ connect(m_ui->customBrowserLocationBrowseButton, SIGNAL(clicked()), SLOT(showCustomBrowserLocationFileDialog()));
+ connect(m_ui->customBrowserSupport, SIGNAL(toggled(bool)), m_ui->customBrowserGroupBox, SLOT(setEnabled(bool)));
+#endif
+
+ // Custom Proxy option
+ m_ui->customProxyLocation->setEnabled(m_ui->useCustomProxy->isChecked());
+ m_ui->customProxyLocationBrowseButton->setEnabled(m_ui->useCustomProxy->isChecked());
+
+ connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocation, SLOT(setEnabled(bool)));
+ connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), m_ui->customProxyLocationBrowseButton, SLOT(setEnabled(bool)));
+ connect(m_ui->useCustomProxy, SIGNAL(toggled(bool)), SLOT(validateCustomProxyLocation()));
+ connect(m_ui->customProxyLocation, SIGNAL(editingFinished()), SLOT(validateCustomProxyLocation()));
+ connect(m_ui->customProxyLocationBrowseButton, SIGNAL(clicked()), this, SLOT(showProxyLocationFileDialog()));
+
+#ifndef Q_OS_LINUX
+ m_ui->snapWarningLabel->setVisible(false);
+#endif
+
+#ifdef Q_OS_WIN
+ // Brave uses Chrome's registry settings
+ m_ui->braveSupport->setHidden(true);
+ // Vivaldi uses Chrome's registry settings
+ m_ui->vivaldiSupport->setHidden(true);
+ m_ui->chromeSupport->setText("Chrome, Vivaldi, and Brave");
+ // Tor Browser uses Firefox's registry settings
+ m_ui->torBrowserSupport->setHidden(true);
+ m_ui->firefoxSupport->setText("Firefox and Tor Browser");
+#endif
+ m_ui->browserGlobalWarningWidget->setVisible(false);
+
+#ifndef QT_DEBUG
+ m_ui->customExtensionId->setVisible(false);
+ m_ui->customExtensionLabel->setVisible(false);
+#endif
+}
+
+BrowserSettingsWidget::~BrowserSettingsWidget()
+{
+}
+
+void BrowserSettingsWidget::loadSettings()
+{
+ auto settings = browserSettings();
+ m_ui->enableBrowserSupport->setChecked(settings->isEnabled());
+
+ m_ui->showNotification->setChecked(settings->showNotification());
+ m_ui->bestMatchOnly->setChecked(settings->bestMatchOnly());
+ m_ui->unlockDatabase->setChecked(settings->unlockDatabase());
+ m_ui->matchUrlScheme->setChecked(settings->matchUrlScheme());
+
+ // hide unimplemented options
+ // TODO: fix this
+ m_ui->showNotification->hide();
+
+ if (settings->sortByUsername()) {
+ m_ui->sortByUsername->setChecked(true);
+ } else {
+ m_ui->sortByTitle->setChecked(true);
+ }
+
+ m_ui->alwaysAllowAccess->setChecked(settings->alwaysAllowAccess());
+ m_ui->alwaysAllowUpdate->setChecked(settings->alwaysAllowUpdate());
+ m_ui->httpAuthPermission->setChecked(settings->httpAuthPermission());
+ m_ui->searchInAllDatabases->setChecked(settings->searchInAllDatabases());
+ m_ui->supportKphFields->setChecked(settings->supportKphFields());
+ m_ui->noMigrationPrompt->setChecked(settings->noMigrationPrompt());
+ m_ui->useCustomProxy->setChecked(settings->useCustomProxy());
+ m_ui->customProxyLocation->setText(settings->customProxyLocation());
+ m_ui->updateBinaryPath->setChecked(settings->updateBinaryPath());
+ m_ui->allowExpiredCredentials->setChecked(settings->allowExpiredCredentials());
+ m_ui->chromeSupport->setChecked(settings->browserSupport(BrowserShared::CHROME));
+ m_ui->chromiumSupport->setChecked(settings->browserSupport(BrowserShared::CHROMIUM));
+ m_ui->firefoxSupport->setChecked(settings->browserSupport(BrowserShared::FIREFOX));
+ m_ui->edgeSupport->setChecked(settings->browserSupport(BrowserShared::EDGE));
+#ifndef Q_OS_WIN
+ m_ui->braveSupport->setChecked(settings->browserSupport(BrowserShared::BRAVE));
+ m_ui->vivaldiSupport->setChecked(settings->browserSupport(BrowserShared::VIVALDI));
+ m_ui->torBrowserSupport->setChecked(settings->browserSupport(BrowserShared::TOR_BROWSER));
+#endif
+#ifndef Q_OS_LINUX
+ m_ui->snapWarningLabel->setVisible(false);
+#endif
+
+// TODO: Enable Edge support when Linux version is released
+#ifdef Q_OS_LINUX
+ m_ui->edgeSupport->setChecked(false);
+ m_ui->edgeSupport->setEnabled(false);
+#endif
+
+#ifdef KEEPASSXC_DIST_SNAP
+ // Disable settings that will not work
+ m_ui->useCustomProxy->setChecked(false);
+ m_ui->useCustomProxy->setVisible(false);
+ m_ui->customProxyLocation->setVisible(false);
+ m_ui->customProxyLocationBrowseButton->setVisible(false);
+ m_ui->browsersGroupBox->setVisible(false);
+ m_ui->browsersGroupBox->setEnabled(false);
+ m_ui->updateBinaryPath->setChecked(false);
+ m_ui->updateBinaryPath->setVisible(false);
+ // No custom browser for snaps
+ m_ui->customBrowserSupport->setVisible(false);
+ m_ui->customBrowserGroupBox->setVisible(false);
+ // Show notice to user
+ m_ui->browserGlobalWarningWidget->showMessage(tr("Please see special instructions for browser extension use below"),
+ MessageWidget::Warning);
+ m_ui->browserGlobalWarningWidget->setCloseButtonVisible(false);
+ m_ui->browserGlobalWarningWidget->setAutoHideTimeout(-1);
+#endif
+
+ const auto customBrowserSet = settings->customBrowserSupport();
+ m_ui->customBrowserSupport->setChecked(customBrowserSet);
+ m_ui->customBrowserGroupBox->setEnabled(customBrowserSet);
+ m_ui->browserTypeComboBox->clear();
+ m_ui->browserTypeComboBox->addItem(tr("Firefox"), BrowserShared::SupportedBrowsers::FIREFOX);
+ m_ui->browserTypeComboBox->addItem(tr("Chromium"), BrowserShared::SupportedBrowsers::CHROMIUM);
+ auto typeIndex = m_ui->browserTypeComboBox->findData(settings->customBrowserType());
+ if (typeIndex >= 0) {
+ m_ui->browserTypeComboBox->setCurrentIndex(typeIndex);
+ }
+ m_ui->customBrowserLocation->setText(settings->customBrowserLocation());
+
+#ifdef QT_DEBUG
+ m_ui->customExtensionId->setText(settings->customExtensionId());
+#endif
+
+ validateCustomProxyLocation();
+}
+
+void BrowserSettingsWidget::validateCustomProxyLocation()
+{
+ auto path = m_ui->customProxyLocation->text();
+ if (m_ui->useCustomProxy->isChecked() && !QFile::exists(path)) {
+ m_ui->warningWidget->showMessage(tr("<b>Error:</b> The custom proxy location cannot be found!"
+ "<br/>Browser integration WILL NOT WORK without the proxy application."),
+ MessageWidget::Error);
+ } else {
+ m_ui->warningWidget->showMessage(tr("<b>Warning:</b> The following options can be dangerous!"),
+ MessageWidget::Warning);
+ }
+}
+
+void BrowserSettingsWidget::saveSettings()
+{
+ auto settings = browserSettings();
+ settings->setEnabled(m_ui->enableBrowserSupport->isChecked());
+ settings->setShowNotification(m_ui->showNotification->isChecked());
+ settings->setBestMatchOnly(m_ui->bestMatchOnly->isChecked());
+ settings->setUnlockDatabase(m_ui->unlockDatabase->isChecked());
+ settings->setMatchUrlScheme(m_ui->matchUrlScheme->isChecked());
+ settings->setSortByUsername(m_ui->sortByUsername->isChecked());
+
+ settings->setUseCustomProxy(m_ui->useCustomProxy->isChecked());
+ settings->setCustomProxyLocation(m_ui->customProxyLocation->text());
+
+ settings->setUpdateBinaryPath(m_ui->updateBinaryPath->isChecked());
+ settings->setAllowExpiredCredentials(m_ui->allowExpiredCredentials->isChecked());
+ settings->setAlwaysAllowAccess(m_ui->alwaysAllowAccess->isChecked());
+ settings->setAlwaysAllowUpdate(m_ui->alwaysAllowUpdate->isChecked());
+ settings->setHttpAuthPermission(m_ui->httpAuthPermission->isChecked());
+ settings->setSearchInAllDatabases(m_ui->searchInAllDatabases->isChecked());
+ settings->setSupportKphFields(m_ui->supportKphFields->isChecked());
+ settings->setNoMigrationPrompt(m_ui->noMigrationPrompt->isChecked());
+
+#ifdef QT_DEBUG
+ settings->setCustomExtensionId(m_ui->customExtensionId->text());
+#endif
+
+ settings->setBrowserSupport(BrowserShared::CHROME, m_ui->chromeSupport->isChecked());
+ settings->setBrowserSupport(BrowserShared::CHROMIUM, m_ui->chromiumSupport->isChecked());
+ settings->setBrowserSupport(BrowserShared::FIREFOX, m_ui->firefoxSupport->isChecked());
+ settings->setBrowserSupport(BrowserShared::EDGE, m_ui->edgeSupport->isChecked());
+#ifndef Q_OS_WIN
+ settings->setBrowserSupport(BrowserShared::BRAVE, m_ui->braveSupport->isChecked());
+ settings->setBrowserSupport(BrowserShared::VIVALDI, m_ui->vivaldiSupport->isChecked());
+ settings->setBrowserSupport(BrowserShared::TOR_BROWSER, m_ui->torBrowserSupport->isChecked());
+
+ // Custom browser settings
+ bool customBrowserEnabled = m_ui->customBrowserSupport->isChecked();
+ settings->setCustomBrowserType(m_ui->browserTypeComboBox->currentData().toInt());
+ settings->setCustomBrowserLocation(m_ui->customBrowserLocation->text());
+ settings->setCustomBrowserSupport(customBrowserEnabled);
+ settings->setBrowserSupport(BrowserShared::CUSTOM, customBrowserEnabled);
+
+ // If we disabled the custom browser support make sure to clear variables
+ if (!customBrowserEnabled) {
+ settings->setCustomBrowserLocation("");
+ }
+#endif
+}
+
+void BrowserSettingsWidget::showProxyLocationFileDialog()
+{
+#ifdef Q_OS_WIN
+ QString fileTypeFilter(QString("%1 (*.exe);;%2 (*.*)").arg(tr("Executable Files"), tr("All Files")));
+#else
+ QString fileTypeFilter(QString("%1 (*)").arg(tr("Executable Files")));
+#endif
+ auto proxyLocation = QFileDialog::getOpenFileName(this,
+ tr("Select custom proxy location"),
+ QFileInfo(QCoreApplication::applicationDirPath()).filePath(),
+ fileTypeFilter);
+ m_ui->customProxyLocation->setText(proxyLocation);
+ validateCustomProxyLocation();
+}
+
+void BrowserSettingsWidget::showCustomBrowserLocationFileDialog()
+{
+ auto location = QFileDialog::getExistingDirectory(this,
+ tr("Select native messaging host folder location"),
+ QFileInfo(QCoreApplication::applicationDirPath()).filePath());
+ if (!location.isEmpty()) {
+ m_ui->customBrowserLocation->setText(location);
+ }
+}