diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index 0171e2a7b3..7cffe4d683 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -262,6 +262,13 @@ void AndroidConfig::SavePathValues() { } EndArray(); + BeginArray(std::string("blocked_domains")); + for (size_t i = 0; i < Settings::values.blocked_domains.size(); ++i) { + SetArrayIndex(i); + WriteStringSetting(std::string("domain"), Settings::values.blocked_domains[i]); + } + EndArray(); + // Save custom NAND directory const auto nand_path = Common::FS::GetEdenPathString(Common::FS::EdenPath::NANDDir); WriteStringSetting(std::string("nand_directory"), nand_path, diff --git a/src/common/settings.h b/src/common/settings.h index a03c6e1a2c..ab49c53de8 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -803,9 +803,16 @@ struct Values { Setting first_launch{linkage, true, "first_launch", Category::Miscellaneous}; // Network - Setting network_interface{linkage, std::string(), "network_interface", - Category::Network}; + Setting network_interface{linkage, std::string(), "network_interface", Category::Network}; SwitchableSetting airplane_mode{linkage, false, "airplane_mode", Category::Network}; + std::vector blocked_domains = { + "srv.nintendo.net", + "battle.net", + "microsoft.com", + "mojang.com", + "xboxlive.com", + "minecraftservices.com" + }; // WebService Setting web_api_url{linkage, "api.ynet-fun.xyz", "web_api_url", diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index 68d73f0a59..82ff62cdbf 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -8,6 +8,7 @@ #include #include +#include "common/settings.h" #include "common/string_util.h" #include "common/swap.h" #include "core/core.h" @@ -53,17 +54,11 @@ enum class NetDbError : s32 { NoData = 4, }; -static const constexpr std::array blockedDomains = {"srv.nintendo.net", - "battle.net", - "microsoft.com", - "mojang.com", - "xboxlive.com", - "minecraftservices.com"}; - static bool IsBlockedHost(const std::string& host) { - return std::any_of( - blockedDomains.begin(), blockedDomains.end(), - [&host](const std::string& domain) { return host.find(domain) != std::string::npos; }); + auto const& v = Settings::values.blocked_domains; + return std::any_of(v.begin(), v.end(), [&host](const std::string& domain) { + return host.find(domain) != std::string::npos; + }); } static NetDbError GetAddrInfoErrorToNetDbError(GetAddrInfoError result) { @@ -163,7 +158,17 @@ static std::pair GetHostByNameRequestImpl(HLERequestConte parameters.use_nsd_resolve, parameters.cancel_handle, parameters.process_id); const auto host_buffer = ctx.ReadBuffer(0); - const std::string host = Common::StringFromBuffer(host_buffer); + + std::string host = Common::StringFromBuffer(host_buffer); + if (parameters.use_nsd_resolve) { + // TODO: how its actually done? + if (auto const pos = host.find('%'); pos != std::string::npos) { + host[pos] = 'l'; + host.insert(pos, "p1"); + } + LOG_WARNING(Service, "nsd resolve={}", host); + } + // For now, ignore options, which are in input buffer 1 for GetHostByNameRequestWithOptions. // Prevent resolution of Nintendo servers diff --git a/src/qt_common/config/qt_config.cpp b/src/qt_common/config/qt_config.cpp index c5a8f62745..fb4edc10de 100644 --- a/src/qt_common/config/qt_config.cpp +++ b/src/qt_common/config/qt_config.cpp @@ -241,6 +241,16 @@ void QtConfig::ReadPathValues() { } EndArray(); + Settings::values.blocked_domains.clear(); + const int blocked_domains_size = BeginArray(std::string("blocked_domains")); + for (int i = 0; i < blocked_domains_size; ++i) { + SetArrayIndex(i); + if (auto s = ReadStringSetting(std::string("domain")); !s.empty()) { + Settings::values.blocked_domains.push_back(s); + } + } + EndArray(); + ReadCategory(Settings::Category::Paths); EndGroup(); @@ -463,6 +473,13 @@ void QtConfig::SavePathValues() { } EndArray(); + BeginArray(std::string("blocked_domains")); + for (int i = 0; i < static_cast(Settings::values.blocked_domains.size()); ++i) { + SetArrayIndex(i); + WriteStringSetting(std::string("domain"), Settings::values.blocked_domains[i]); + } + EndArray(); + EndGroup(); } diff --git a/src/yuzu/configuration/configure_network.cpp b/src/yuzu/configuration/configure_network.cpp index 7df5e51a7f..56e135d710 100644 --- a/src/yuzu/configuration/configure_network.cpp +++ b/src/yuzu/configuration/configure_network.cpp @@ -10,6 +10,7 @@ #include "core/internal_network/network_interface.h" #include "ui_configure_network.h" #include "yuzu/configuration/configure_network.h" +#include "yuzu/util/limitable_input_dialog.h" ConfigureNetwork::ConfigureNetwork(const Core::System& system_, QWidget* parent) : QWidget(parent), ui(std::make_unique()), system{system_} { @@ -20,6 +21,26 @@ ConfigureNetwork::ConfigureNetwork(const Core::System& system_, QWidget* parent) ui->network_interface->addItem(QString::fromStdString(iface.name)); } + ui->blocked_domains_list->clear(); + for (const auto& s : Settings::values.blocked_domains) { + ui->blocked_domains_list->addItem(QString::fromStdString(s)); + } + + connect(ui->add_blocked_domains_button, &QPushButton::pressed, this, [this, parent] { + if (const QString s = LimitableInputDialog::GetText(parent, tr("Add blocked domain"), tr("Input DNS match rule"), 0, 64); !s.isEmpty()) { + ui->blocked_domains_list->addItem(s); + } + }); + connect(ui->remove_blocked_domains_button, &QPushButton::pressed, this, [this] { + auto selected = ui->blocked_domains_list->selectedItems(); + if (!selected.isEmpty()) { + qDeleteAll(ui->blocked_domains_list->selectedItems()); + } + }); + connect(ui->blocked_domains_list, &QListWidget::itemSelectionChanged, this, [this] { + ui->remove_blocked_domains_button->setEnabled(!ui->blocked_domains_list->selectedItems().isEmpty()); + }); + this->SetConfiguration(); } @@ -28,8 +49,24 @@ ConfigureNetwork::~ConfigureNetwork() = default; void ConfigureNetwork::ApplyConfiguration() { Settings::values.network_interface = ui->network_interface->currentText().toStdString(); Settings::values.airplane_mode = ui->airplane_mode->isChecked(); + + std::vector new_dirs; + new_dirs.reserve(ui->blocked_domains_list->count()); + for (int i = 0; i < ui->blocked_domains_list->count(); ++i) { + new_dirs.push_back(ui->blocked_domains_list->item(i)->text().toStdString()); + } + if (new_dirs != Settings::values.blocked_domains) { + Settings::values.blocked_domains = std::move(new_dirs); + } } +// void ConfigureGeneral::UpdateExternalContentList() { +// ui->blocked_domains_list->clear(); +// for (const auto& dir : Settings::values.blocked_domains) { +// ui->blocked_domains_list->addItem(QString::fromStdString(dir)); +// } +// } + void ConfigureNetwork::changeEvent(QEvent* event) { if (event->type() == QEvent::LanguageChange) { RetranslateUI(); diff --git a/src/yuzu/configuration/configure_network.ui b/src/yuzu/configuration/configure_network.ui index 1a515ccd16..68eb87bb56 100644 --- a/src/yuzu/configuration/configure_network.ui +++ b/src/yuzu/configuration/configure_network.ui @@ -45,6 +45,66 @@ + + + + Blocked Domains Content + + + + + + Add domains to filter out on DNS resolutions + + + true + + + + + + + QAbstractItemView::SingleSelection + + + + + + + + + Add Domain + + + + + + + Remove Selected + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + +