diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index de5845fe3..dcf5136e4 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -425,6 +425,18 @@ void Preferences::setPreventFromSuspendWhenSeeding(const bool b) setValue(u"Preferences/General/PreventFromSuspendWhenSeeding"_s, b); } +bool Preferences::isDownloadTrackerFavicon() const +{ + return value(u"Preferences/General/DownloadTrackerFavicon"_s, true); +} + +void Preferences::setDownloadTrackerFavicon(const bool value) +{ + if (value == isDownloadTrackerFavicon()) + return; + setValue(u"Preferences/General/DownloadTrackerFavicon"_s, value); +} + #ifdef Q_OS_WIN bool Preferences::WinStartup() const { diff --git a/src/base/preferences.h b/src/base/preferences.h index bfe53d150..866c03667 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -274,6 +274,8 @@ public: void setAutoRunOnTorrentFinishedEnabled(bool enabled); QString getAutoRunOnTorrentFinishedProgram() const; void setAutoRunOnTorrentFinishedProgram(const QString &program); + bool isDownloadTrackerFavicon() const; + void setDownloadTrackerFavicon(bool enabled); #if defined(Q_OS_WIN) bool isAutoRunConsoleEnabled() const; void setAutoRunConsoleEnabled(bool enabled); diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index ba620e027..4fe93c135 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -328,7 +328,7 @@ void AdvancedSettings::saveAdvancedSettings() const // Reannounce to all trackers when ip/port changed session->setReannounceWhenAddressChangedEnabled(m_checkBoxReannounceWhenAddressChanged.isChecked()); // Misc GUI properties - app()->mainWindow()->setDownloadTrackerFavicon(m_checkBoxTrackerFavicon.isChecked()); + pref->setDownloadTrackerFavicon(m_checkBoxTrackerFavicon.isChecked()); pref->setAddNewTorrentDialogSavePathHistoryLength(m_spinBoxSavePathHistoryLength.value()); pref->setSpeedWidgetEnabled(m_checkBoxSpeedWidgetEnabled.isChecked()); #ifndef Q_OS_MACOS @@ -854,7 +854,7 @@ void AdvancedSettings::loadAdvancedSettings() m_checkBoxReannounceWhenAddressChanged.setChecked(session->isReannounceWhenAddressChangedEnabled()); addRow(REANNOUNCE_WHEN_ADDRESS_CHANGED, tr("Reannounce to all trackers when IP or port changed"), &m_checkBoxReannounceWhenAddressChanged); // Download tracker's favicon - m_checkBoxTrackerFavicon.setChecked(app()->mainWindow()->isDownloadTrackerFavicon()); + m_checkBoxTrackerFavicon.setChecked(pref->isDownloadTrackerFavicon()); addRow(DOWNLOAD_TRACKER_FAVICON, tr("Download tracker's favicon"), &m_checkBoxTrackerFavicon); // Save path history length m_spinBoxSavePathHistoryLength.setRange(0, 99); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 271932fbc..7fd60a904 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -134,7 +134,6 @@ MainWindow::MainWindow(IGUIApplication *app, const WindowState initialState, con , m_pwr {new PowerManagement} , m_preventTimer {new QTimer(this)} , m_storeExecutionLogEnabled {EXECUTIONLOG_SETTINGS_KEY(u"Enabled"_s)} - , m_storeDownloadTrackerFavicon {SETTINGS_KEY(u"DownloadTrackerFavicon"_s)} , m_storeExecutionLogTypes {EXECUTIONLOG_SETTINGS_KEY(u"Types"_s), Log::MsgType::ALL} #ifdef Q_OS_MACOS , m_badger {std::make_unique()} @@ -477,7 +476,7 @@ MainWindow::MainWindow(IGUIApplication *app, const WindowState initialState, con m_ui->actionShowFiltersSidebar->setChecked(isFiltersSidebarVisible); if (isFiltersSidebarVisible) { - showFiltersSidebar(true); + showFiltersSidebar(true, pref->isDownloadTrackerFavicon()); } else { @@ -530,18 +529,6 @@ void MainWindow::setExecutionLogMsgTypes(const Log::MsgTypes value) m_storeExecutionLogTypes = value; } -bool MainWindow::isDownloadTrackerFavicon() const -{ - return m_storeDownloadTrackerFavicon; -} - -void MainWindow::setDownloadTrackerFavicon(const bool value) -{ - if (m_transferListFiltersWidget) - m_transferListFiltersWidget->setDownloadTrackerFavicon(value); - m_storeDownloadTrackerFavicon = value; -} - void MainWindow::setTitleSuffix(const QString &suffix) { const auto emDash = QChar(0x2014); @@ -1348,11 +1335,11 @@ void MainWindow::showStatusBar(bool show) } } -void MainWindow::showFiltersSidebar(const bool show) +void MainWindow::showFiltersSidebar(const bool show, const bool showTrackerFavicon) { if (show && !m_transferListFiltersWidget) { - m_transferListFiltersWidget = new TransferListFiltersWidget(m_splitter, m_transferListWidget, isDownloadTrackerFavicon()); + m_transferListFiltersWidget = new TransferListFiltersWidget(m_splitter, m_transferListWidget, showTrackerFavicon); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersAdded, m_transferListFiltersWidget, &TransferListFiltersWidget::addTrackers); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersChanged, m_transferListFiltersWidget, &TransferListFiltersWidget::refreshTrackers); @@ -1566,7 +1553,7 @@ void MainWindow::on_actionShowFiltersSidebar_triggered(const bool checked) { Preferences *const pref = Preferences::instance(); pref->setFiltersSidebarVisible(checked); - showFiltersSidebar(checked); + showFiltersSidebar(checked, pref->isDownloadTrackerFavicon()); } void MainWindow::on_actionSpeedInTitleBar_triggered() diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 99b0989a5..b9dbda95a 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -196,7 +196,7 @@ private: void displaySearchTab(bool enable); void createTorrentTriggered(const Path &path); void showStatusBar(bool show); - void showFiltersSidebar(bool show); + void showFiltersSidebar(bool show, bool showTrackerFavicon); void applyTransferListFilter(); void refreshWindowTitle(); void refreshTrayIconTooltip(); @@ -250,7 +250,6 @@ private: QMenu *m_toolbarMenu = nullptr; SettingValue m_storeExecutionLogEnabled; - SettingValue m_storeDownloadTrackerFavicon; CachedSettingValue m_storeExecutionLogTypes; #if defined(Q_OS_WIN) || defined(Q_OS_MACOS) diff --git a/src/webui/api/appcontroller.cpp b/src/webui/api/appcontroller.cpp index e2e465acd..af3a8530a 100644 --- a/src/webui/api/appcontroller.cpp +++ b/src/webui/api/appcontroller.cpp @@ -410,6 +410,8 @@ void AppController::preferencesAction() data[u"ignore_ssl_errors"_s] = pref->isIgnoreSSLErrors(); // Python executable path data[u"python_executable_path"_s] = pref->getPythonExecutablePath().toString(); + // Should we show Tracker's Favicon + data[u"show_tracker_favicon"_s] = pref->isDownloadTrackerFavicon(); // libtorrent preferences // Bdecode depth limit @@ -1023,6 +1025,8 @@ void AppController::setPreferencesAction() // Reannounce to all trackers when ip/port changed if (hasKey(u"reannounce_when_address_changed"_s)) session->setReannounceWhenAddressChangedEnabled(it.value().toBool()); + if (hasKey(u"show_tracker_favicon"_s)) + pref->setDownloadTrackerFavicon(it.value().toBool()); // Embedded tracker if (hasKey(u"embedded_tracker_port"_s)) pref->setTrackerPort(it.value().toInt()); diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp index a28e002b5..db5cd66b7 100644 --- a/src/webui/webapplication.cpp +++ b/src/webui/webapplication.cpp @@ -487,7 +487,7 @@ void WebApplication::configure() const QString contentSecurityPolicy = (m_isAltUIUsed ? QString() - : u"default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; script-src 'self' 'unsafe-inline'; object-src 'none'; form-action 'self'; frame-src 'self' blob:;"_s) + : u"default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; script-src 'self' 'unsafe-inline'; object-src 'none'; form-action 'self'; frame-src 'self' blob:;"_s) + (isClickjackingProtectionEnabled ? u" frame-ancestors 'self';"_s : QString()) + (m_isHttpsEnabled ? u" upgrade-insecure-requests;"_s : QString()); if (!contentSecurityPolicy.isEmpty()) diff --git a/src/webui/www/private/scripts/client.js b/src/webui/www/private/scripts/client.js index 01f29e25f..1a5e80103 100644 --- a/src/webui/www/private/scripts/client.js +++ b/src/webui/www/private/scripts/client.js @@ -702,6 +702,18 @@ window.addEventListener("DOMContentLoaded", (event) => { case TRACKERS_WARNING: span.lastElementChild.src = "images/tracker-warning.svg"; break; + default: { + if (LocalPreferences.get("show_tracker_favicon", "false") === "false") + break; + const link = host.split(".").slice(1).join("."); + const img = trackerFilterItem.getElementsByTagName("img")[0]; + + img.src = `https://${link}/favicon.ico`; + img.onerror = () => { + img.src = "images/trackers.svg"; + }; + break; + } } return trackerFilterItem; diff --git a/src/webui/www/private/views/filters.html b/src/webui/www/private/views/filters.html index 623990c1a..9992bc963 100644 --- a/src/webui/www/private/views/filters.html +++ b/src/webui/www/private/views/filters.html @@ -60,7 +60,7 @@ diff --git a/src/webui/www/private/views/preferences.html b/src/webui/www/private/views/preferences.html index 26a5389ac..6d0269013 100644 --- a/src/webui/www/private/views/preferences.html +++ b/src/webui/www/private/views/preferences.html @@ -1262,6 +1262,14 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD + + + + + + + + @@ -2597,6 +2605,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD document.getElementById("markOfTheWeb").checked = pref.mark_of_the_web; document.getElementById("ignoreSSLErrors").checked = pref.ignore_ssl_errors; document.getElementById("pythonExecutablePath").value = pref.python_executable_path; + document.getElementById("showTrackerFavicon").checked = pref.show_tracker_favicon; // libtorrent section document.getElementById("bdecodeDepthLimit").value = pref.bdecode_depth_limit; document.getElementById("bdecodeTokenLimit").value = pref.bdecode_token_limit; @@ -3069,6 +3078,8 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD settings["refresh_interval"] = Number(document.getElementById("refreshInterval").value); settings["resolve_peer_countries"] = document.getElementById("resolvePeerCountries").checked; settings["reannounce_when_address_changed"] = document.getElementById("reannounceWhenAddressChanged").checked; + settings["show_tracker_favicon"] = document.getElementById("showTrackerFavicon").checked; + LocalPreferences.set("show_tracker_favicon", settings["show_tracker_favicon"].toString()); settings["enable_embedded_tracker"] = document.getElementById("enableEmbeddedTracker").checked; settings["embedded_tracker_port"] = Number(document.getElementById("embeddedTrackerPort").value); settings["embedded_tracker_port_forwarding"] = document.getElementById("embeddedTrackerPortForwarding").checked;