This commit is contained in:
Bark 2025-07-04 23:49:46 +08:00 committed by GitHub
commit a4a7700c11
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 50 additions and 23 deletions

View file

@ -425,6 +425,18 @@ void Preferences::setPreventFromSuspendWhenSeeding(const bool b)
setValue(u"Preferences/General/PreventFromSuspendWhenSeeding"_s, 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 #ifdef Q_OS_WIN
bool Preferences::WinStartup() const bool Preferences::WinStartup() const
{ {

View file

@ -274,6 +274,8 @@ public:
void setAutoRunOnTorrentFinishedEnabled(bool enabled); void setAutoRunOnTorrentFinishedEnabled(bool enabled);
QString getAutoRunOnTorrentFinishedProgram() const; QString getAutoRunOnTorrentFinishedProgram() const;
void setAutoRunOnTorrentFinishedProgram(const QString &program); void setAutoRunOnTorrentFinishedProgram(const QString &program);
bool isDownloadTrackerFavicon() const;
void setDownloadTrackerFavicon(bool enabled);
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
bool isAutoRunConsoleEnabled() const; bool isAutoRunConsoleEnabled() const;
void setAutoRunConsoleEnabled(bool enabled); void setAutoRunConsoleEnabled(bool enabled);

View file

@ -328,7 +328,7 @@ void AdvancedSettings::saveAdvancedSettings() const
// Reannounce to all trackers when ip/port changed // Reannounce to all trackers when ip/port changed
session->setReannounceWhenAddressChangedEnabled(m_checkBoxReannounceWhenAddressChanged.isChecked()); session->setReannounceWhenAddressChangedEnabled(m_checkBoxReannounceWhenAddressChanged.isChecked());
// Misc GUI properties // Misc GUI properties
app()->mainWindow()->setDownloadTrackerFavicon(m_checkBoxTrackerFavicon.isChecked()); pref->setDownloadTrackerFavicon(m_checkBoxTrackerFavicon.isChecked());
pref->setAddNewTorrentDialogSavePathHistoryLength(m_spinBoxSavePathHistoryLength.value()); pref->setAddNewTorrentDialogSavePathHistoryLength(m_spinBoxSavePathHistoryLength.value());
pref->setSpeedWidgetEnabled(m_checkBoxSpeedWidgetEnabled.isChecked()); pref->setSpeedWidgetEnabled(m_checkBoxSpeedWidgetEnabled.isChecked());
#ifndef Q_OS_MACOS #ifndef Q_OS_MACOS
@ -854,7 +854,7 @@ void AdvancedSettings::loadAdvancedSettings()
m_checkBoxReannounceWhenAddressChanged.setChecked(session->isReannounceWhenAddressChangedEnabled()); m_checkBoxReannounceWhenAddressChanged.setChecked(session->isReannounceWhenAddressChangedEnabled());
addRow(REANNOUNCE_WHEN_ADDRESS_CHANGED, tr("Reannounce to all trackers when IP or port changed"), &m_checkBoxReannounceWhenAddressChanged); addRow(REANNOUNCE_WHEN_ADDRESS_CHANGED, tr("Reannounce to all trackers when IP or port changed"), &m_checkBoxReannounceWhenAddressChanged);
// Download tracker's favicon // 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); addRow(DOWNLOAD_TRACKER_FAVICON, tr("Download tracker's favicon"), &m_checkBoxTrackerFavicon);
// Save path history length // Save path history length
m_spinBoxSavePathHistoryLength.setRange(0, 99); m_spinBoxSavePathHistoryLength.setRange(0, 99);

View file

@ -134,7 +134,6 @@ MainWindow::MainWindow(IGUIApplication *app, const WindowState initialState, con
, m_pwr {new PowerManagement} , m_pwr {new PowerManagement}
, m_preventTimer {new QTimer(this)} , m_preventTimer {new QTimer(this)}
, m_storeExecutionLogEnabled {EXECUTIONLOG_SETTINGS_KEY(u"Enabled"_s)} , 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} , m_storeExecutionLogTypes {EXECUTIONLOG_SETTINGS_KEY(u"Types"_s), Log::MsgType::ALL}
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
, m_badger {std::make_unique<MacUtils::Badger>()} , m_badger {std::make_unique<MacUtils::Badger>()}
@ -477,7 +476,7 @@ MainWindow::MainWindow(IGUIApplication *app, const WindowState initialState, con
m_ui->actionShowFiltersSidebar->setChecked(isFiltersSidebarVisible); m_ui->actionShowFiltersSidebar->setChecked(isFiltersSidebarVisible);
if (isFiltersSidebarVisible) if (isFiltersSidebarVisible)
{ {
showFiltersSidebar(true); showFiltersSidebar(true, pref->isDownloadTrackerFavicon());
} }
else else
{ {
@ -530,18 +529,6 @@ void MainWindow::setExecutionLogMsgTypes(const Log::MsgTypes value)
m_storeExecutionLogTypes = 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) void MainWindow::setTitleSuffix(const QString &suffix)
{ {
const auto emDash = QChar(0x2014); 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) 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::trackersAdded, m_transferListFiltersWidget, &TransferListFiltersWidget::addTrackers);
connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers);
connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersChanged, m_transferListFiltersWidget, &TransferListFiltersWidget::refreshTrackers); 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(); Preferences *const pref = Preferences::instance();
pref->setFiltersSidebarVisible(checked); pref->setFiltersSidebarVisible(checked);
showFiltersSidebar(checked); showFiltersSidebar(checked, pref->isDownloadTrackerFavicon());
} }
void MainWindow::on_actionSpeedInTitleBar_triggered() void MainWindow::on_actionSpeedInTitleBar_triggered()

View file

@ -196,7 +196,7 @@ private:
void displaySearchTab(bool enable); void displaySearchTab(bool enable);
void createTorrentTriggered(const Path &path); void createTorrentTriggered(const Path &path);
void showStatusBar(bool show); void showStatusBar(bool show);
void showFiltersSidebar(bool show); void showFiltersSidebar(bool show, bool showTrackerFavicon);
void applyTransferListFilter(); void applyTransferListFilter();
void refreshWindowTitle(); void refreshWindowTitle();
void refreshTrayIconTooltip(); void refreshTrayIconTooltip();
@ -250,7 +250,6 @@ private:
QMenu *m_toolbarMenu = nullptr; QMenu *m_toolbarMenu = nullptr;
SettingValue<bool> m_storeExecutionLogEnabled; SettingValue<bool> m_storeExecutionLogEnabled;
SettingValue<bool> m_storeDownloadTrackerFavicon;
CachedSettingValue<Log::MsgTypes> m_storeExecutionLogTypes; CachedSettingValue<Log::MsgTypes> m_storeExecutionLogTypes;
#if defined(Q_OS_WIN) || defined(Q_OS_MACOS) #if defined(Q_OS_WIN) || defined(Q_OS_MACOS)

View file

@ -410,6 +410,8 @@ void AppController::preferencesAction()
data[u"ignore_ssl_errors"_s] = pref->isIgnoreSSLErrors(); data[u"ignore_ssl_errors"_s] = pref->isIgnoreSSLErrors();
// Python executable path // Python executable path
data[u"python_executable_path"_s] = pref->getPythonExecutablePath().toString(); 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 // libtorrent preferences
// Bdecode depth limit // Bdecode depth limit
@ -1023,6 +1025,8 @@ void AppController::setPreferencesAction()
// Reannounce to all trackers when ip/port changed // Reannounce to all trackers when ip/port changed
if (hasKey(u"reannounce_when_address_changed"_s)) if (hasKey(u"reannounce_when_address_changed"_s))
session->setReannounceWhenAddressChangedEnabled(it.value().toBool()); session->setReannounceWhenAddressChangedEnabled(it.value().toBool());
if (hasKey(u"show_tracker_favicon"_s))
pref->setDownloadTrackerFavicon(it.value().toBool());
// Embedded tracker // Embedded tracker
if (hasKey(u"embedded_tracker_port"_s)) if (hasKey(u"embedded_tracker_port"_s))
pref->setTrackerPort(it.value().toInt()); pref->setTrackerPort(it.value().toInt());

View file

@ -487,7 +487,7 @@ void WebApplication::configure()
const QString contentSecurityPolicy = const QString contentSecurityPolicy =
(m_isAltUIUsed (m_isAltUIUsed
? QString() ? 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()) + (isClickjackingProtectionEnabled ? u" frame-ancestors 'self';"_s : QString())
+ (m_isHttpsEnabled ? u" upgrade-insecure-requests;"_s : QString()); + (m_isHttpsEnabled ? u" upgrade-insecure-requests;"_s : QString());
if (!contentSecurityPolicy.isEmpty()) if (!contentSecurityPolicy.isEmpty())

View file

@ -702,6 +702,18 @@ window.addEventListener("DOMContentLoaded", (event) => {
case TRACKERS_WARNING: case TRACKERS_WARNING:
span.lastElementChild.src = "images/tracker-warning.svg"; span.lastElementChild.src = "images/tracker-warning.svg";
break; 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; return trackerFilterItem;

View file

@ -60,7 +60,7 @@
<template id="trackerFilterItem"> <template id="trackerFilterItem">
<li class="trackersFilterContextMenuTarget"> <li class="trackersFilterContextMenuTarget">
<span class="link"> <span class="link">
<img src="images/trackers.svg" alt=""> <img src="images/trackers.svg" alt="" referrerpolicy="no-referrer">
</span> </span>
</li> </li>
</template> </template>

View file

@ -1262,6 +1262,14 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD
<input type="checkbox" id="reannounceWhenAddressChanged"> <input type="checkbox" id="reannounceWhenAddressChanged">
</td> </td>
</tr> </tr>
<tr>
<td>
<label for="showTrackerFavicon">QBT_TR(Show tracker favicon in torrent list:)QBT_TR[CONTEXT=OptionsDialog]</label>
</td>
<td>
<input type="checkbox" id="showTrackerFavicon">
</td>
</tr>
<tr> <tr>
<td> <td>
<label for="enableEmbeddedTracker">QBT_TR(Enable embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label> <label for="enableEmbeddedTracker">QBT_TR(Enable embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
@ -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("markOfTheWeb").checked = pref.mark_of_the_web;
document.getElementById("ignoreSSLErrors").checked = pref.ignore_ssl_errors; document.getElementById("ignoreSSLErrors").checked = pref.ignore_ssl_errors;
document.getElementById("pythonExecutablePath").value = pref.python_executable_path; document.getElementById("pythonExecutablePath").value = pref.python_executable_path;
document.getElementById("showTrackerFavicon").checked = pref.show_tracker_favicon;
// libtorrent section // libtorrent section
document.getElementById("bdecodeDepthLimit").value = pref.bdecode_depth_limit; document.getElementById("bdecodeDepthLimit").value = pref.bdecode_depth_limit;
document.getElementById("bdecodeTokenLimit").value = pref.bdecode_token_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["refresh_interval"] = Number(document.getElementById("refreshInterval").value);
settings["resolve_peer_countries"] = document.getElementById("resolvePeerCountries").checked; settings["resolve_peer_countries"] = document.getElementById("resolvePeerCountries").checked;
settings["reannounce_when_address_changed"] = document.getElementById("reannounceWhenAddressChanged").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["enable_embedded_tracker"] = document.getElementById("enableEmbeddedTracker").checked;
settings["embedded_tracker_port"] = Number(document.getElementById("embeddedTrackerPort").value); settings["embedded_tracker_port"] = Number(document.getElementById("embeddedTrackerPort").value);
settings["embedded_tracker_port_forwarding"] = document.getElementById("embeddedTrackerPortForwarding").checked; settings["embedded_tracker_port_forwarding"] = document.getElementById("embeddedTrackerPortForwarding").checked;