File indexing completed on 2024-04-21 04:43:21

0001 /*
0002     This file is part of the Polkit-qt project
0003     SPDX-FileCopyrightText: 2009 Jaroslav Reznik <jreznik@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "listeneradapter_p.h"
0009 #include <QDebug>
0010 #define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1
0011 #include <polkitagent/polkitagent.h>
0012 
0013 namespace PolkitQt1
0014 {
0015 
0016 namespace Agent
0017 {
0018 
0019 class ListenerAdapterHelper
0020 {
0021 public:
0022     ListenerAdapterHelper() : q(nullptr) {}
0023     ~ListenerAdapterHelper() {
0024         delete q;
0025     }
0026     ListenerAdapter *q;
0027 };
0028 
0029 Q_GLOBAL_STATIC(ListenerAdapterHelper, s_globalListenerAdapter)
0030 
0031 ListenerAdapter *ListenerAdapter::instance()
0032 {
0033     if (!s_globalListenerAdapter()->q) {
0034         new ListenerAdapter();
0035     }
0036 
0037     return s_globalListenerAdapter()->q;
0038 }
0039 
0040 ListenerAdapter::ListenerAdapter(QObject *parent)
0041         : QObject(parent)
0042 {
0043     Q_ASSERT(!s_globalListenerAdapter()->q);
0044     s_globalListenerAdapter()->q = this;
0045 }
0046 
0047 Listener* ListenerAdapter::findListener(PolkitAgentListener *listener)
0048 {
0049     Listener *listItem;
0050 
0051     Q_FOREACH(listItem, m_listeners) {
0052         Q_ASSERT(listItem);
0053 
0054         if (listItem->listener() == listener) {
0055             return listItem;
0056         }
0057     }
0058 
0059     return nullptr;
0060 }
0061 
0062 void ListenerAdapter::polkit_qt_listener_initiate_authentication(PolkitAgentListener  *listener,
0063         const gchar          *action_id,
0064         const gchar          *message,
0065         const gchar          *icon_name,
0066         PolkitDetails        *details,
0067         const gchar          *cookie,
0068         GList                *identities,
0069         GCancellable         *cancellable,
0070         GSimpleAsyncResult *result)
0071 {
0072     qDebug() << "polkit_qt_listener_initiate_authentication callback for " << listener;
0073 
0074     PolkitQt1::Identity::List idents;
0075     PolkitQt1::Details dets(details);
0076 
0077     Listener *list = findListener(listener);
0078 
0079     for (GList *identity = g_list_first(identities); identity != nullptr; identity = g_list_next(identity)) {
0080          idents.append(PolkitQt1::Identity((PolkitIdentity *)identity->data));
0081     }
0082 
0083     list->initiateAuthentication(QString::fromUtf8(action_id),
0084                                  QString::fromUtf8(message),
0085                                  QString::fromUtf8(icon_name),
0086                                  dets,
0087                                  QString::fromUtf8(cookie),
0088                                  idents,
0089                                  new AsyncResult(result));
0090 }
0091 
0092 gboolean ListenerAdapter::polkit_qt_listener_initiate_authentication_finish(PolkitAgentListener  *listener,
0093         GAsyncResult         *res,
0094         GError              **error)
0095 {
0096     qDebug() << "polkit_qt_listener_initiate_authentication_finish callback for " << listener;
0097 
0098     GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
0099     if (g_simple_async_result_propagate_error(simple, error)) {
0100         return false;
0101     }
0102     return true;
0103 }
0104 
0105 void ListenerAdapter::cancelled_cb(PolkitAgentListener *listener)
0106 {
0107     qDebug() << "cancelled_cb for " << listener;
0108 
0109     Listener *list = findListener(listener);
0110 
0111     list->cancelAuthentication();
0112 }
0113 
0114 void ListenerAdapter::addListener(Listener *listener)
0115 {
0116     qDebug() << "Adding new listener " << listener << "for " << listener->listener();
0117 
0118     m_listeners.append(listener);
0119 }
0120 
0121 void ListenerAdapter::removeListener(Listener *listener)
0122 {
0123     qDebug() << "Removing listener " << listener;
0124 
0125     // should be safe as we don't have more than one same listener registered in one time
0126     m_listeners.removeOne(listener);
0127 }
0128 
0129 }
0130 
0131 }