File indexing completed on 2024-03-24 17:13:50
0001 /* 0002 * SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org> 0003 * SPDX-FileCopyrightText: 2016 David Edmundson <davidedmundson@kde.org> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-or-later 0006 * 0007 */ 0008 #include <QApplication> 0009 #include <QCommandLineOption> 0010 #include <QCommandLineParser> 0011 #include <QDebug> 0012 #include <QDir> 0013 #include <QFile> 0014 #include <QProcess> 0015 0016 #include <KAuth/Action> 0017 #include <KAuth/ExecuteJob> 0018 0019 #include <KConfigGroup> 0020 #include <KLocalizedString> 0021 #include <KMessageBox> 0022 #include <KSharedConfig> 0023 0024 int main(int argc, char **argv) 0025 { 0026 QCommandLineParser parser; 0027 QApplication app(argc, argv); // because GHNS doesn't do it's own error reporting on installation failing.. 0028 0029 const QString description = i18n("SDDM theme installer"); 0030 const char version[] = "1.0"; 0031 0032 app.setApplicationVersion(QString::fromLatin1(version)); 0033 parser.addVersionOption(); 0034 parser.addHelpOption(); 0035 parser.setApplicationDescription(description); 0036 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("i") << QStringLiteral("install"), i18n("Install a theme."))); 0037 parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("u") << QStringLiteral("uninstall"), i18n("Uninstall a theme."))); 0038 0039 parser.addPositionalArgument(QStringLiteral("themefile"), i18n("The theme to install, must be an existing archive file.")); 0040 0041 parser.process(app); 0042 0043 const QStringList args = parser.positionalArguments(); 0044 if (args.isEmpty()) { 0045 qWarning() << "No theme file specified."; 0046 return 0; 0047 } 0048 0049 if (parser.isSet(QStringLiteral("install"))) { 0050 const QFileInfo themefile(args.first()); 0051 if (!themefile.exists()) { 0052 qWarning() << "Specified theme file does not exist"; 0053 return 0; 0054 } 0055 0056 KAuth::Action action(QStringLiteral("org.kde.kcontrol.kcmsddm.installtheme")); 0057 action.setHelperId(QStringLiteral("org.kde.kcontrol.kcmsddm")); 0058 action.addArgument(QStringLiteral("filePath"), themefile.absoluteFilePath()); 0059 0060 KAuth::ExecuteJob *job = action.execute(); 0061 bool rc = job->exec(); 0062 if (!rc) { 0063 QString errorString = job->errorString(); 0064 if (!errorString.isEmpty()) { 0065 KMessageBox::error(nullptr, errorString, i18n("Unable to install theme")); 0066 } 0067 return -1; 0068 } 0069 0070 KConfigGroup cg(KSharedConfig::openConfig(QStringLiteral("sddmthemeinstallerrc"), KConfig::SimpleConfig), "DownloadedThemes"); 0071 cg.writeEntry(themefile.absoluteFilePath(), job->data().value(QStringLiteral("installedPaths")).toStringList()); 0072 return 0; 0073 } 0074 if (parser.isSet(QStringLiteral("uninstall"))) { 0075 KConfigGroup cg(KSharedConfig::openConfig(QStringLiteral("sddmthemeinstallerrc"), KConfig::SimpleConfig), "DownloadedThemes"); 0076 const QStringList installed = cg.readEntry(args.first(), QStringList()); 0077 for (const QString &installedTheme : installed) { 0078 KAuth::Action action(QStringLiteral("org.kde.kcontrol.kcmsddm.uninstalltheme")); 0079 action.setHelperId(QStringLiteral("org.kde.kcontrol.kcmsddm")); 0080 action.addArgument(QStringLiteral("filePath"), installedTheme); 0081 KAuth::ExecuteJob *job = action.execute(); 0082 // We want KNS to be able to tell if the entry was manually deleted, see BUG: 416255 0083 if (job->exec()) { 0084 QFile::remove(args.first()); 0085 cg.deleteEntry(args.first()); 0086 } 0087 } 0088 return 0; 0089 } 0090 qWarning() << "either install or uninstall must be passed as an argument"; 0091 return -1; 0092 }