File indexing completed on 2024-03-24 04:03:01

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"