feat: allow overriding URL for downloading legacy FML libs

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
This commit is contained in:
Octol1ttle 2026-01-25 17:04:47 +05:00
parent f0a17d82d9
commit caec4ef96c
No known key found for this signature in database
GPG key ID: B77C34313AEE1FFF
5 changed files with 76 additions and 34 deletions

View file

@ -862,23 +862,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);

View file

@ -61,9 +61,10 @@ void LegacyFMLLibrariesTask::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.LEGACY_FMLLIBS_BASE_URL + lib.filename;
QString urlString = base + lib.filename;
dljob->addNetAction(Net::ApiDownload::makeCached(QUrl(urlString), entry, options));
}
@ -123,3 +124,12 @@ bool LegacyFMLLibrariesTask::abort()
}
return true;
}
QString LegacyFMLLibrariesTask::baseUrl()
{
if (const QString urlOverride = APPLICATION->settings()->get("LegacyFMLLibsURLOverride").toString(); !urlOverride.isEmpty()) {
return urlOverride;
}
return BuildConfig.LEGACY_FMLLIBS_BASE_URL;
}

View file

@ -22,6 +22,9 @@ class LegacyFMLLibrariesTask : public Task {
public slots:
bool abort() override;
private:
static QString baseUrl();
private:
MinecraftInstance* m_inst;
NetJob::Ptr downloadJob;

View file

@ -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();

View file

@ -161,6 +161,34 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_fmllibs">
<property name="title">
<string>Legacy FML Libraries Server</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>You can set this to another server if you have problems with downloading legacy FML libraries (Minecraft 1.5.2 and earlier).</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="legacyFMLLibsURL"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_ua">
<property name="minimumSize">