File indexing completed on 2025-03-23 12:49:53
0001 /* 0002 SPDX-FileCopyrightText: 2011 Ilia Kats <ilia-kats@gmx.net> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "secretagent.h" 0008 #include "manager_p.h" 0009 #include "nmdebug.h" 0010 #include "secretagent_p.h" 0011 0012 #undef signals 0013 #include <NetworkManager.h> 0014 #include <libnm/NetworkManager.h> 0015 0016 #define signals Q_SIGNALS 0017 0018 #include <QDBusConnection> 0019 #include <QDBusMetaType> 0020 0021 #include "agentmanagerinterface.h" 0022 #include "secretagentadaptor.h" 0023 0024 NetworkManager::SecretAgentPrivate::SecretAgentPrivate(const QString &id, 0025 const NetworkManager::SecretAgent::Capabilities capabilities, 0026 NetworkManager::SecretAgent *parent) 0027 : q_ptr(parent) 0028 , agent(parent) 0029 #ifdef NMQT_STATIC 0030 , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::sessionBus(), parent) 0031 , watcher(NetworkManagerPrivate::DBUS_SERVICE, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, parent) 0032 #else 0033 , agentManager(NetworkManagerPrivate::DBUS_SERVICE, QLatin1String(NM_DBUS_PATH_AGENT_MANAGER), QDBusConnection::systemBus(), parent) 0034 , watcher(NetworkManagerPrivate::DBUS_SERVICE, QDBusConnection::systemBus(), QDBusServiceWatcher::WatchForOwnerChange, parent) 0035 #endif 0036 , agentId(id) 0037 , capabilities(capabilities) 0038 { 0039 Q_Q(SecretAgent); 0040 0041 qRegisterMetaType<NMVariantMapMap>("NMVariantMapMap"); 0042 qDBusRegisterMetaType<NMVariantMapMap>(); 0043 0044 // Similarly to NetworkManagerPrivate(), we register two listeners here: 0045 // one for ServiceRegistered and one for InterfacesAdded. 0046 agentManager.connection().connect(NetworkManagerPrivate::DBUS_SERVICE, 0047 "/org/freedesktop", 0048 NetworkManagerPrivate::FDO_DBUS_OBJECT_MANAGER, 0049 QLatin1String("InterfacesAdded"), 0050 q, 0051 SLOT(dbusInterfacesAdded(QDBusObjectPath, QVariantMap))); 0052 0053 QObject::connect(&watcher, &QDBusServiceWatcher::serviceRegistered, parent, [this] { this->daemonRegistered(); }); 0054 0055 agentManager.connection().registerObject(QLatin1String(NM_DBUS_PATH_SECRET_AGENT), &agent, QDBusConnection::ExportAllSlots); 0056 0057 registerAgent(capabilities); 0058 } 0059 0060 NetworkManager::SecretAgentPrivate::~SecretAgentPrivate() 0061 { 0062 agentManager.Unregister(); 0063 } 0064 0065 void NetworkManager::SecretAgentPrivate::dbusInterfacesAdded(const QDBusObjectPath &path, const QVariantMap &interfaces) 0066 { 0067 Q_UNUSED(path); 0068 if (!interfaces.contains(QString::fromLatin1(agentManager.staticInterfaceName()))) { 0069 return; 0070 } 0071 0072 registerAgent(capabilities); 0073 } 0074 0075 void NetworkManager::SecretAgentPrivate::daemonRegistered() 0076 { 0077 registerAgent(capabilities); 0078 } 0079 0080 void NetworkManager::SecretAgentPrivate::registerAgent() 0081 { 0082 registerAgent(NetworkManager::SecretAgent::Capability::NoCapability); 0083 } 0084 0085 void NetworkManager::SecretAgentPrivate::registerAgent(NetworkManager::SecretAgent::Capabilities capabilities) 0086 { 0087 agentManager.RegisterWithCapabilities(agentId, capabilities); 0088 } 0089 0090 NetworkManager::SecretAgent::SecretAgent(const QString &id, QObject *parent) 0091 : QObject(parent) 0092 , QDBusContext() 0093 , d_ptr(new NetworkManager::SecretAgentPrivate(id, NetworkManager::SecretAgent::Capability::NoCapability, this)) 0094 { 0095 } 0096 0097 NetworkManager::SecretAgent::SecretAgent(const QString &id, NetworkManager::SecretAgent::Capabilities capabilities, QObject *parent) 0098 : QObject(parent) 0099 , QDBusContext() 0100 , d_ptr(new NetworkManager::SecretAgentPrivate(id, capabilities, this)) 0101 { 0102 } 0103 0104 NetworkManager::SecretAgent::~SecretAgent() 0105 { 0106 Q_D(SecretAgent); 0107 delete d; 0108 } 0109 0110 void NetworkManager::SecretAgent::sendError(NetworkManager::SecretAgent::Error error, const QString &explanation, const QDBusMessage &callMessage) const 0111 { 0112 Q_D(const SecretAgent); 0113 0114 QString errorString; 0115 switch (error) { 0116 case NotAuthorized: 0117 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".NotAuthorized"); 0118 break; 0119 case InvalidConnection: 0120 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".InvalidConnection"); 0121 break; 0122 case UserCanceled: 0123 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".UserCanceled"); 0124 break; 0125 case AgentCanceled: 0126 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".AgentCanceled"); 0127 break; 0128 case InternalError: 0129 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".InternalError"); 0130 break; 0131 case NoSecrets: 0132 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".NoSecrets"); 0133 break; 0134 default: 0135 errorString = QStringLiteral(NM_DBUS_INTERFACE_SECRET_AGENT) % QStringLiteral(".Unknown"); 0136 break; 0137 } 0138 0139 QDBusMessage reply; 0140 if (callMessage.type() == QDBusMessage::InvalidMessage) { 0141 reply = message().createErrorReply(errorString, explanation); 0142 } else { 0143 reply = callMessage.createErrorReply(errorString, explanation); 0144 } 0145 0146 if (!d->agentManager.connection().send(reply)) { 0147 qCDebug(NMQT) << "Failed to put error message on DBus queue" << errorString << explanation; 0148 } 0149 } 0150 0151 #include "moc_secretagent.cpp"