24 #include <QtCore/qplugin.h>
25 #include <QtCore/QCoreApplication>
26 #include <QtCore/QTimer>
28 #include <QtGui/QApplication>
29 #include <QtGui/QWidget>
31 #include <QtDBus/QDBusConnection>
32 #include <QtDBus/QDBusConnectionInterface>
36 #include <PolkitQt1/Authority>
37 #include <PolkitQt1/Subject>
64 , m_flyingActions(false)
69 connect(PolkitQt1::Authority::instance(), SIGNAL(configChanged()),
70 this, SLOT(checkForResultChanged()));
71 connect(PolkitQt1::Authority::instance(), SIGNAL(consoleKitDBChanged()),
72 this, SLOT(checkForResultChanged()));
77 m_flyingActions =
true;
78 PolkitQt1::Authority::instance()->enumerateActions();
91 kDebug() <<
"Parent widget does not exist, skipping";
96 if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String(
"org.kde.Polkit1AuthAgent"))) {
98 if (qApp == 0 || QApplication::type() == QApplication::Tty) {
99 kDebug() <<
"Not streaming parent as we are on a TTY application";
103 qulonglong wId = parent->effectiveWinId();
106 QDBusMessage methodCall =
107 QDBusMessage::createMethodCall(QLatin1String(
"org.kde.Polkit1AuthAgent"), QLatin1String(
"/org/kde/Polkit1AuthAgent"), QLatin1String(
"org.kde.Polkit1AuthAgent"),
108 QLatin1String(
"setWIdForAction"));
110 methodCall << action;
113 QDBusPendingCall call = QDBusConnection::sessionBus().asyncCall(methodCall);
114 call.waitForFinished();
116 if (call.isError()) {
117 kWarning() <<
"ERROR while streaming the parent!!" << call.error();
120 kDebug() <<
"KDE polkit agent appears too old or not registered on the bus";
126 m_knownActions.clear();
127 foreach (
const PolkitQt1::ActionDescription& action, actions) {
128 m_knownActions << action.actionId();
130 m_flyingActions =
false;
147 PolkitQt1::UnixProcessSubject subject(QCoreApplication::applicationPid());
148 PolkitQt1::Authority::Result r = PolkitQt1::Authority::instance()->checkAuthorizationSync(action, subject,
151 case PolkitQt1::Authority::Yes:
153 case PolkitQt1::Authority::No:
164 QDataStream s(&a, QIODevice::WriteOnly);
165 s << QCoreApplication::applicationPid();
172 QDataStream s(&callerID, QIODevice::ReadOnly);
177 PolkitQt1::UnixProcessSubject subject(pid);
178 PolkitQt1::Authority *authority = PolkitQt1::Authority::instance();
181 connect(authority, SIGNAL(checkAuthorizationFinished(PolkitQt1::Authority::Result)),
182 &e, SLOT(requestQuit(PolkitQt1::Authority::Result)));
183 authority->checkAuthorization(action, subject, PolkitQt1::Authority::AllowUserInteraction);
187 case PolkitQt1::Authority::Yes:
196 void Polkit1Backend::checkForResultChanged()
198 foreach(
const QString &action, m_cachedResults.keys()) {
206 PolkitQt1::Authority::instance()->enumerateActions();
207 m_flyingActions =
true;
213 if (m_flyingActions) {
215 while (m_flyingActions && tries < 10) {
218 QTimer::singleShot(200, &e, SLOT(quit()));
224 return m_knownActions.contains(action);