summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--application/MainWindow.cpp13
-rw-r--r--application/pages/InstanceSettingsPage.cpp17
-rw-r--r--application/pages/global/JavaPage.cpp17
-rw-r--r--depends/util/include/pathutils.h14
-rw-r--r--depends/util/src/pathutils.cpp18
-rw-r--r--logic/launch/steps/CheckJava.cpp3
-rw-r--r--logic/launch/steps/LaunchMinecraft.cpp3
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());