File indexing completed on 2025-04-20 04:33:21
0001 /** 0002 * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "runcommandplugin.h" 0008 0009 #include <KPluginFactory> 0010 0011 #include <QDBusConnection> 0012 #include <QDir> 0013 #include <QJsonDocument> 0014 #include <QProcess> 0015 #include <QSettings> 0016 0017 #include <KShell> 0018 #include <kcmutils_version.h> 0019 0020 #include <core/daemon.h> 0021 #include <core/device.h> 0022 #include <core/networkpacket.h> 0023 #include <core/openconfig.h> 0024 0025 #include "plugin_runcommand_debug.h" 0026 0027 #define PACKET_TYPE_RUNCOMMAND QStringLiteral("kdeconnect.runcommand") 0028 0029 #define COMMAND "/bin/sh" 0030 #define ARGS "-c" 0031 0032 K_PLUGIN_CLASS_WITH_JSON(RunCommandPlugin, "kdeconnect_runcommand.json") 0033 0034 RunCommandPlugin::RunCommandPlugin(QObject *parent, const QVariantList &args) 0035 : KdeConnectPlugin(parent, args) 0036 { 0037 connect(config(), &KdeConnectPluginConfig::configChanged, this, &RunCommandPlugin::sendConfig); 0038 } 0039 0040 void RunCommandPlugin::receivePacket(const NetworkPacket &np) 0041 { 0042 if (np.get<bool>(QStringLiteral("requestCommandList"), false)) { 0043 sendConfig(); 0044 return; 0045 } 0046 0047 if (np.has(QStringLiteral("key"))) { 0048 QJsonDocument commandsDocument = QJsonDocument::fromJson(config()->getByteArray(QStringLiteral("commands"), "{}")); 0049 QJsonObject commands = commandsDocument.object(); 0050 QString key = np.get<QString>(QStringLiteral("key")); 0051 QJsonValue value = commands[key]; 0052 if (value == QJsonValue::Undefined) { 0053 qCWarning(KDECONNECT_PLUGIN_RUNCOMMAND) << key << "is not a configured command"; 0054 } 0055 const QJsonObject commandJson = value.toObject(); 0056 qCInfo(KDECONNECT_PLUGIN_RUNCOMMAND) << "Running:" << COMMAND << ARGS << commandJson[QStringLiteral("command")].toString(); 0057 #ifdef Q_OS_WIN 0058 QProcess::startDetached(commandJson[QStringLiteral("command")].toString(), QStringList()); 0059 #else 0060 QProcess::startDetached(QStringLiteral(COMMAND), QStringList{QStringLiteral(ARGS), commandJson[QStringLiteral("command")].toString()}); 0061 #endif 0062 } else if (np.has(QStringLiteral("setup"))) { 0063 OpenConfig oc; 0064 oc.openConfiguration(device()->id(), QStringLiteral("kdeconnect_runcommand")); 0065 } 0066 } 0067 0068 void RunCommandPlugin::connected() 0069 { 0070 sendConfig(); 0071 } 0072 0073 void RunCommandPlugin::sendConfig() 0074 { 0075 QString commands = config()->getString(QStringLiteral("commands"), QStringLiteral("{}")); 0076 NetworkPacket np(PACKET_TYPE_RUNCOMMAND, {{QStringLiteral("commandList"), commands}}); 0077 np.set<bool>(QStringLiteral("canAddCommand"), true); 0078 0079 sendPacket(np); 0080 } 0081 0082 #include "moc_runcommandplugin.cpp" 0083 #include "runcommandplugin.moc"