diff --git a/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp b/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp --- a/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp +++ b/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp @@ -52,6 +52,16 @@ return QDir(dataLocation).absoluteFilePath("kservices5/ServiceMenus"); } +void startGUIProcess(QProcess &process, const QString &command, const QStringList &args, bool gui) +{ + const static bool konsoleAvailable = !QStandardPaths::findExecutable("konsole").isEmpty(); + if(!konsoleAvailable || !gui) { + process.start(command, args, QIODevice::NotOpen); + } else { + process.start("konsole", QStringList() << "-e" "bash" << "-c" << command << args, QIODevice::NotOpen); + } +} + struct UncompressCommand { QString command; @@ -126,12 +136,12 @@ return QString(); } -bool runScriptOnce(const QString &path, const QStringList &args) +bool runScriptOnce(const QString &path, const QStringList &args, bool gui = false) { QProcess process; process.setWorkingDirectory(QFileInfo(path).absolutePath()); - process.start(path, args, QIODevice::NotOpen); + startGUIProcess(process, path, args, gui); if (!process.waitForStarted()) { fail(i18n("Failed to run installer script %1", path)); } @@ -163,11 +173,11 @@ qInfo() << "[servicemenuinstaller]: Trying to run installer/uninstaller" << path; if (hasArgVariants) { for (const auto &arg : argVariants) { - if (runScriptOnce(path, {arg})) { + if (runScriptOnce(path, {arg}, false)) { return true; } } - } else if (runScriptOnce(path, {})) { + } else if (runScriptOnce(path, {}), true) { return true; } @@ -268,6 +278,15 @@ return false; } } else { + const QString mimeType = QMimeDatabase().mimeTypeForFile(archive).name(); + const QStringList binaryPackages = {"application/vnd.debian.binary-package", "application/x-rpm"}; + if (binaryPackages.contains(mimeType)) { + const QString errorMsg = i18n("Please uninstall binary packages with your package manager!\n" + "The filename is %1", archive); + QProcess::startDetached("kdialog", {"--error", errorMsg}); + QFile::remove(archive); + exit(1); + } const QString dir = generateDirPath(archive); // Try "deinstall" first