diff options
-rw-r--r-- | application/MainWindow.cpp | 13 | ||||
-rw-r--r-- | application/pages/InstanceSettingsPage.cpp | 17 | ||||
-rw-r--r-- | application/pages/global/JavaPage.cpp | 17 | ||||
-rw-r--r-- | depends/util/include/pathutils.h | 14 | ||||
-rw-r--r-- | depends/util/src/pathutils.cpp | 18 | ||||
-rw-r--r-- | logic/launch/steps/CheckJava.cpp | 3 | ||||
-rw-r--r-- | logic/launch/steps/LaunchMinecraft.cpp | 3 |
7 files changed, 65 insertions, 20 deletions
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index ecf0f371..1562efc5 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -1677,17 +1677,8 @@ void MainWindow::checkSetDefaultJava() break; } QString currentJavaPath = MMC->settings()->get("JavaPath").toString(); - if (currentJavaPath.isEmpty()) - { - askForJava = true; - break; - } - if(!currentJavaPath.contains('/')) - { - currentJavaPath = QStandardPaths::findExecutable(currentJavaPath); - } - QFile currentJavaBin(currentJavaPath); - if(!currentJavaBin.exists()) + QString actualPath = ResolveExecutable(currentJavaPath); + if (currentJavaPath.isNull()) { askForJava = true; break; diff --git a/application/pages/InstanceSettingsPage.cpp b/application/pages/InstanceSettingsPage.cpp index 91b997d6..35cbefe5 100644 --- a/application/pages/InstanceSettingsPage.cpp +++ b/application/pages/InstanceSettingsPage.cpp @@ -10,6 +10,7 @@ #include "MultiMC.h" #include <java/JavaVersionList.h> +#include <pathutils.h> InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent) : QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst) @@ -184,11 +185,21 @@ void InstanceSettingsPage::on_javaDetectBtn_clicked() void InstanceSettingsPage::on_javaBrowseBtn_clicked() { - QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable")); - if (!dir.isNull()) + QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable")); + QString cooked_path = NormalizePath(raw_path); + + // do not allow current dir - it's dirty. Do not allow dirs that don't exist + if(cooked_path.isEmpty()) + { + return; + } + + QFileInfo javaInfo(cooked_path);; + if(!javaInfo.exists() || !javaInfo.isExecutable()) { - ui->javaPathTextBox->setText(dir); + return; } + ui->javaPathTextBox->setText(cooked_path); } void InstanceSettingsPage::on_javaTestBtn_clicked() diff --git a/application/pages/global/JavaPage.cpp b/application/pages/global/JavaPage.cpp index 9b35d1f3..18882ad9 100644 --- a/application/pages/global/JavaPage.cpp +++ b/application/pages/global/JavaPage.cpp @@ -105,13 +105,24 @@ void JavaPage::on_javaDetectBtn_clicked() ui->javaPathTextBox->setText(java->path); } } + void JavaPage::on_javaBrowseBtn_clicked() { - QString dir = QFileDialog::getOpenFileName(this, tr("Find Java executable")); - if (!dir.isNull()) + QString raw_path = QFileDialog::getOpenFileName(this, tr("Find Java executable")); + QString cooked_path = NormalizePath(raw_path); + + // do not allow current dir - it's dirty. Do not allow dirs that don't exist + if(cooked_path.isEmpty()) { - ui->javaPathTextBox->setText(dir); + return; + } + + QFileInfo javaInfo(cooked_path);; + if(!javaInfo.exists() || !javaInfo.isExecutable()) + { + return; } + ui->javaPathTextBox->setText(cooked_path); } void JavaPage::on_javaTestBtn_clicked() diff --git a/depends/util/include/pathutils.h b/depends/util/include/pathutils.h index 6d52097f..ff23fa5d 100644 --- a/depends/util/include/pathutils.h +++ b/depends/util/include/pathutils.h @@ -26,6 +26,18 @@ MULTIMC_UTIL_EXPORT QString PathCombine(QString path1, QString path2, QString pa MULTIMC_UTIL_EXPORT QString AbsolutePath(QString path); /** + * Resolve an executable + * + * Will resolve: + * single executable (by name) + * relative path + * absolute path + * + * @return absolute path to executable or null string + */ +MULTIMC_UTIL_EXPORT QString ResolveExecutable(QString path); + +/** * Normalize path * * Any paths inside the current directory will be normalized to relative paths (to current) @@ -33,7 +45,7 @@ MULTIMC_UTIL_EXPORT QString AbsolutePath(QString path); * * Returns false if the path logic somehow filed (and normalizedPath in invalid) */ -QString NormalizePath(QString path); +MULTIMC_UTIL_EXPORT QString NormalizePath(QString path); MULTIMC_UTIL_EXPORT QString RemoveInvalidFilenameChars(QString string, QChar replaceWith = '-'); diff --git a/depends/util/src/pathutils.cpp b/depends/util/src/pathutils.cpp index 35c7f901..af1843ba 100644 --- a/depends/util/src/pathutils.cpp +++ b/depends/util/src/pathutils.cpp @@ -40,6 +40,24 @@ QString AbsolutePath(QString path) return QFileInfo(path).absolutePath(); } +QString ResolveExecutable(QString path) +{ + if (path.isEmpty()) + { + return QString(); + } + if(!path.contains('/')) + { + path = QStandardPaths::findExecutable(path); + } + QFileInfo pathInfo(path); + if(!pathInfo.exists() || !pathInfo.isExecutable()) + { + return QString(); + } + return pathInfo.absoluteFilePath(); +} + /** * Normalize path * diff --git a/logic/launch/steps/CheckJava.cpp b/logic/launch/steps/CheckJava.cpp index 9c5fd404..7482624f 100644 --- a/logic/launch/steps/CheckJava.cpp +++ b/logic/launch/steps/CheckJava.cpp @@ -15,6 +15,7 @@ #include "CheckJava.h" #include <launch/LaunchTask.h> +#include <pathutils.h> #include <QStandardPaths> #include <QFileInfo> @@ -22,7 +23,7 @@ void CheckJava::executeTask() { auto instance = m_parent->instance(); auto settings = instance->settings(); - m_javaPath = settings->get("JavaPath").toString(); + m_javaPath = ResolveExecutable(settings->get("JavaPath").toString()); bool perInstance = settings->get("OverrideJava").toBool() || settings->get("OverrideJavaLocation").toBool(); auto realJavaPath = QStandardPaths::findExecutable(m_javaPath); diff --git a/logic/launch/steps/LaunchMinecraft.cpp b/logic/launch/steps/LaunchMinecraft.cpp index 95438003..84abb375 100644 --- a/logic/launch/steps/LaunchMinecraft.cpp +++ b/logic/launch/steps/LaunchMinecraft.cpp @@ -16,6 +16,7 @@ #include "LaunchMinecraft.h" #include <launch/LaunchTask.h> #include <minecraft/OneSixInstance.h> +#include <pathutils.h> #include <QStandardPaths> LaunchMinecraft::LaunchMinecraft(LaunchTask *parent) : LaunchStep(parent) @@ -33,7 +34,7 @@ void LaunchMinecraft::executeTask() QString allArgs = args.join(", "); emit logLine("Java Arguments:\n[" + m_parent->censorPrivateInfo(allArgs) + "]\n\n", MessageLevel::MultiMC); - auto javaPath = instance->settings()->get("JavaPath").toString(); + auto javaPath = ResolveExecutable(instance->settings()->get("JavaPath").toString()); m_process.setProcessEnvironment(instance->createEnvironment()); |