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 }