diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bd00bb53..6346bfd2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,7 +174,7 @@ set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") set(Launcher_LOGIN_CALLBACK_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user successfully logins.") -set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") +set(Launcher_LEGACY_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for legacy (<=1.5.2) FML Libraries.") ######## Set version numbers ######## set(Launcher_VERSION_MAJOR 10) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index 0a1ac334d..3c5c74e9f 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -111,7 +111,7 @@ Config::Config() MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@"; FLAME_API_KEY = "@Launcher_CURSEFORGE_API_KEY@"; META_URL = "@Launcher_META_URL@"; - FMLLIBS_BASE_URL = "@Launcher_FMLLIBS_BASE_URL@"; + LEGACY_FMLLIBS_BASE_URL = "@Launcher_LEGACY_FMLLIBS_BASE_URL@"; GLFW_LIBRARY_NAME = "@Launcher_GLFW_LIBRARY_NAME@"; OPENAL_LIBRARY_NAME = "@Launcher_OPENAL_LIBRARY_NAME@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 045d987d4..1a03c7761 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -169,7 +169,7 @@ class Config { QString DEFAULT_RESOURCE_BASE = "https://resources.download.minecraft.net/"; QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; - QString FMLLIBS_BASE_URL; + QString LEGACY_FMLLIBS_BASE_URL; QString TRANSLATION_FILES_URL; QString MODPACKSCH_API_BASE_URL = "https://api.modpacks.ch/"; diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ca39bcc4f..1c80f1e49 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -849,23 +849,20 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) } } { + auto resetIfInvalid = [this](const Setting* setting) { + if (const QUrl url(setting->get().toString()); !url.isValid() || (url.scheme() != "http" && url.scheme() != "https")) { + m_settings->reset(setting->id()); + } + }; + // Meta URL - m_settings->registerSetting("MetaURLOverride", ""); - - QUrl metaUrl(m_settings->get("MetaURLOverride").toString()); - - // get rid of invalid meta urls - if (!metaUrl.isValid() || (metaUrl.scheme() != "http" && metaUrl.scheme() != "https")) - m_settings->reset("MetaURLOverride"); + resetIfInvalid(m_settings->registerSetting("MetaURLOverride", "").get()); // Resource URL - m_settings->registerSetting({ "ResourceURLOverride", "ResourceURL" }, ""); + resetIfInvalid(m_settings->registerSetting({ "ResourceURLOverride", "ResourceURL" }, "").get()); - QUrl resourceUrl(m_settings->get("ResourceURLOverride").toString()); - - // get rid of invalid resource urls - if (!resourceUrl.isValid() || (resourceUrl.scheme() != "http" && resourceUrl.scheme() != "https")) - m_settings->reset("ResourceURLOverride"); + // Legacy FML libs URL + resetIfInvalid(m_settings->registerSetting("LegacyFMLLibsURLOverride", "").get()); } m_settings->registerSetting("CloseAfterLaunch", false); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 11e507d1b..dea725c88 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -254,8 +254,8 @@ set(MINECRAFT_SOURCES minecraft/update/AssetUpdateTask.h minecraft/update/AssetUpdateTask.cpp - minecraft/update/FMLLibrariesTask.cpp - minecraft/update/FMLLibrariesTask.h + minecraft/update/LegacyFMLLibrariesTask.cpp + minecraft/update/LegacyFMLLibrariesTask.h minecraft/update/FoldersTask.cpp minecraft/update/FoldersTask.h minecraft/update/LibrariesTask.cpp diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 46e9e5355..cd02ec4dc 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -69,7 +69,7 @@ #include "minecraft/launch/VerifyJavaInstall.h" #include "minecraft/update/AssetUpdateTask.h" -#include "minecraft/update/FMLLibrariesTask.h" +#include "minecraft/update/LegacyFMLLibrariesTask.h" #include "minecraft/update/FoldersTask.h" #include "minecraft/update/LibrariesTask.h" @@ -1107,7 +1107,7 @@ QList MinecraftInstance::createUpdateTask() // libraries download makeShared(this), // FML libraries download and copy into the instance - makeShared(this), + makeShared(this), // assets update makeShared(this), }; diff --git a/launcher/minecraft/update/FMLLibrariesTask.cpp b/launcher/minecraft/update/LegacyFMLLibrariesTask.cpp similarity index 75% rename from launcher/minecraft/update/FMLLibrariesTask.cpp rename to launcher/minecraft/update/LegacyFMLLibrariesTask.cpp index ce0c9a723..bd817a572 100644 --- a/launcher/minecraft/update/FMLLibrariesTask.cpp +++ b/launcher/minecraft/update/LegacyFMLLibrariesTask.cpp @@ -1,4 +1,4 @@ -#include "FMLLibrariesTask.h" +#include "LegacyFMLLibrariesTask.h" #include "FileSystem.h" #include "minecraft/MinecraftInstance.h" @@ -10,11 +10,11 @@ #include "net/ApiDownload.h" -FMLLibrariesTask::FMLLibrariesTask(MinecraftInstance* inst) +LegacyFMLLibrariesTask::LegacyFMLLibrariesTask(MinecraftInstance* inst) { m_inst = inst; } -void FMLLibrariesTask::executeTask() +void LegacyFMLLibrariesTask::executeTask() { // Get the mod list MinecraftInstance* inst = (MinecraftInstance*)m_inst; @@ -61,27 +61,28 @@ void FMLLibrariesTask::executeTask() NetJob::Ptr dljob{ new NetJob("FML libraries", APPLICATION->network()) }; auto metacache = APPLICATION->metacache(); Net::Download::Options options = Net::Download::Option::MakeEternal; + const QString base = baseUrl(); for (auto& lib : fmlLibsToProcess) { auto entry = metacache->resolveEntry("fmllibs", lib.filename); - QString urlString = BuildConfig.FMLLIBS_BASE_URL + lib.filename; + QString urlString = base + lib.filename; dljob->addNetAction(Net::ApiDownload::makeCached(QUrl(urlString), entry, options)); } - connect(dljob.get(), &NetJob::succeeded, this, &FMLLibrariesTask::fmllibsFinished); - connect(dljob.get(), &NetJob::failed, this, &FMLLibrariesTask::fmllibsFailed); + connect(dljob.get(), &NetJob::succeeded, this, &LegacyFMLLibrariesTask::fmllibsFinished); + connect(dljob.get(), &NetJob::failed, this, &LegacyFMLLibrariesTask::fmllibsFailed); connect(dljob.get(), &NetJob::aborted, this, [this] { emitFailed(tr("Aborted")); }); - connect(dljob.get(), &NetJob::progress, this, &FMLLibrariesTask::progress); - connect(dljob.get(), &NetJob::stepProgress, this, &FMLLibrariesTask::propagateStepProgress); + connect(dljob.get(), &NetJob::progress, this, &LegacyFMLLibrariesTask::progress); + connect(dljob.get(), &NetJob::stepProgress, this, &LegacyFMLLibrariesTask::propagateStepProgress); downloadJob.reset(dljob); downloadJob->start(); } -bool FMLLibrariesTask::canAbort() const +bool LegacyFMLLibrariesTask::canAbort() const { return true; } -void FMLLibrariesTask::fmllibsFinished() +void LegacyFMLLibrariesTask::fmllibsFinished() { downloadJob.reset(); if (!fmlLibsToProcess.isEmpty()) { @@ -107,19 +108,28 @@ void FMLLibrariesTask::fmllibsFinished() } emitSucceeded(); } -void FMLLibrariesTask::fmllibsFailed(QString reason) +void LegacyFMLLibrariesTask::fmllibsFailed(QString reason) { QStringList failed = downloadJob->getFailedFiles(); QString failed_all = failed.join("\n"); emitFailed(tr("Failed to download the following files:\n%1\n\nReason:%2\nPlease try again.").arg(failed_all, reason)); } -bool FMLLibrariesTask::abort() +bool LegacyFMLLibrariesTask::abort() { if (downloadJob) { return downloadJob->abort(); } else { - qWarning() << "Prematurely aborted FMLLibrariesTask"; + qWarning() << "Prematurely aborted LegacyFMLLibrariesTask"; } return true; } + +QString LegacyFMLLibrariesTask::baseUrl() +{ + if (const QString urlOverride = APPLICATION->settings()->get("LegacyFMLLibsURLOverride").toString(); !urlOverride.isEmpty()) { + return urlOverride; + } + + return BuildConfig.LEGACY_FMLLIBS_BASE_URL; +} diff --git a/launcher/minecraft/update/FMLLibrariesTask.h b/launcher/minecraft/update/LegacyFMLLibrariesTask.h similarity index 71% rename from launcher/minecraft/update/FMLLibrariesTask.h rename to launcher/minecraft/update/LegacyFMLLibrariesTask.h index 4fe2648e8..2591f7c9f 100644 --- a/launcher/minecraft/update/FMLLibrariesTask.h +++ b/launcher/minecraft/update/LegacyFMLLibrariesTask.h @@ -5,11 +5,11 @@ class MinecraftInstance; -class FMLLibrariesTask : public Task { +class LegacyFMLLibrariesTask : public Task { Q_OBJECT public: - FMLLibrariesTask(MinecraftInstance* inst); - virtual ~FMLLibrariesTask() = default; + LegacyFMLLibrariesTask(MinecraftInstance* inst); + virtual ~LegacyFMLLibrariesTask() = default; void executeTask() override; @@ -22,6 +22,9 @@ class FMLLibrariesTask : public Task { public slots: bool abort() override; + private: + static QString baseUrl(); + private: MinecraftInstance* m_inst; NetJob::Ptr downloadJob; diff --git a/launcher/ui/pages/global/APIPage.cpp b/launcher/ui/pages/global/APIPage.cpp index adc779daf..0cfe0c3b0 100644 --- a/launcher/ui/pages/global/APIPage.cpp +++ b/launcher/ui/pages/global/APIPage.cpp @@ -77,10 +77,12 @@ APIPage::APIPage(QWidget* parent) : QWidget(parent), ui(new Ui::APIPage) ui->metaURL->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->metaURL)); ui->resourceURL->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->resourceURL)); ui->baseURLEntry->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->baseURLEntry)); + ui->legacyFMLLibsURL->setValidator(new QRegularExpressionValidator(s_validUrlRegExp, ui->legacyFMLLibsURL)); ui->msaClientID->setValidator(new QRegularExpressionValidator(s_validMSAClientID, ui->msaClientID)); ui->metaURL->setPlaceholderText(BuildConfig.META_URL); ui->resourceURL->setPlaceholderText(BuildConfig.DEFAULT_RESOURCE_BASE); + ui->legacyFMLLibsURL->setPlaceholderText(BuildConfig.LEGACY_FMLLIBS_BASE_URL); ui->userAgentLineEdit->setPlaceholderText(BuildConfig.USER_AGENT); loadSettings(); @@ -139,6 +141,8 @@ void APIPage::loadSettings() ui->metaURL->setText(metaURL); QString resourceURL = s->get("ResourceURLOverride").toString(); ui->resourceURL->setText(resourceURL); + QString fmlLibsURL = s->get("LegacyFMLLibsURLOverride").toString(); + ui->legacyFMLLibsURL->setText(fmlLibsURL); QString flameKey = s->get("FlameKeyOverride").toString(); ui->flameKey->setText(flameKey); QString modrinthToken = s->get("ModrinthToken").toString(); @@ -159,34 +163,34 @@ void APIPage::applySettings() s->set("MSAClientIDOverride", msaClientID); QUrl metaURL(ui->metaURL->text()); QUrl resourceURL(ui->resourceURL->text()); - // Add required trailing slash - if (!metaURL.isEmpty() && !metaURL.path().endsWith('/')) { - QString path = metaURL.path(); - path.append('/'); - metaURL.setPath(path); - } + QUrl fmlLibsURL(ui->legacyFMLLibsURL->text()); - if (!resourceURL.isEmpty() && !resourceURL.path().endsWith('/')) { - QString path = resourceURL.path(); - path.append('/'); - resourceURL.setPath(path); - } + auto addRequiredTrailingSlash = [](QUrl& url) { + if (!url.isEmpty() && !url.path().endsWith('/')) { + QString path = url.path(); + path.append('/'); + url.setPath(path); + } + }; + addRequiredTrailingSlash(metaURL); + addRequiredTrailingSlash(resourceURL); + addRequiredTrailingSlash(fmlLibsURL); auto isLocalhost = [](const QUrl& url) { return url.host() == "localhost" || url.host() == "127.0.0.1" || url.host() == "::1"; }; auto isUnsafe = [isLocalhost](const QUrl& url) { return !url.isEmpty() && url.scheme() == "http" && !isLocalhost(url); }; + auto upgradeToHTTPS = [isUnsafe](QUrl& url) { + if (isUnsafe(url)) { + url.setScheme("https"); + } + }; - // Don't allow HTTP, since meta is basically RCE with all the jar files. - if (isUnsafe(metaURL)) { - metaURL.setScheme("https"); - } - - // Also don't allow HTTP - if (isUnsafe(resourceURL)) { - resourceURL.setScheme("https"); - } + upgradeToHTTPS(metaURL); + upgradeToHTTPS(resourceURL); + upgradeToHTTPS(fmlLibsURL); s->set("MetaURLOverride", metaURL.toString()); s->set("ResourceURLOverride", resourceURL.toString()); + s->set("LegacyFMLLibsURLOverride", fmlLibsURL.toString()); QString flameKey = ui->flameKey->text(); s->set("FlameKeyOverride", flameKey); QString modrinthToken = ui->modrinthToken->text(); diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index 834eebb96..5b46cd6d7 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -161,6 +161,34 @@ + + + + Legacy FML Libraries Server + + + + + + You can set this to another server if you have problems with downloading legacy FML libraries (Minecraft 1.5.2 and earlier). + + + Qt::RichText + + + true + + + true + + + + + + + + +