diff options
Diffstat (limited to 'examples/PkExampleHelper.cpp')
-rw-r--r-- | examples/PkExampleHelper.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/examples/PkExampleHelper.cpp b/examples/PkExampleHelper.cpp new file mode 100644 index 000000000..0258e700f --- /dev/null +++ b/examples/PkExampleHelper.cpp @@ -0,0 +1,110 @@ +// This is an example not a library +/*************************************************************************** + * Copyright (C) 2008 Daniel Nicoletti <[email protected]> * + * Copyright (C) 2009 Radek Novacek <[email protected]> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * + ***************************************************************************/ + +#include "PkExampleHelper.h" +#include "examplesadaptor.h" + +#include "polkitqt1-authority.h" + +#include <QtDBus/QDBusConnection> +#include <QtCore/QTimer> +#include <QtCore/QDebug> +#include <QtXml/QDomDocument> + +#define MINUTE 60000 + +using namespace PolkitQt1; + +PkExampleHelper::PkExampleHelper(int &argc, char **argv) + : QCoreApplication(argc, argv) +{ + qDebug() << "Creating Helper"; + (void) new ExamplesAdaptor(this); + // Register the DBus service + if (!QDBusConnection::systemBus().registerService("org.qt.policykit.examples")) { + qDebug() << QDBusConnection::systemBus().lastError().message();; + QTimer::singleShot(0, this, SLOT(quit())); + return; + } + + if (!QDBusConnection::systemBus().registerObject("/", this)) { + qDebug() << "unable to register service interface to dbus"; + QTimer::singleShot(0, this, SLOT(quit())); + return; + } + // Normally you will set a timeout so your application can + // free some resources of the poor client machine ;) + QTimer::singleShot(MINUTE, this, SLOT(quit())); +} + +PkExampleHelper::~PkExampleHelper() +{ + qDebug() << "Destroying Helper"; +} + +bool PkExampleHelper::set(const QString &action) +{ + qDebug() << "PkExampleHelper::set" << action; + // message().service() is the service name of the caller + // We can check if the caller is authorized to the following action + Authority::Result result; + SystemBusNameSubject subject(message().service()); + + result = Authority::instance()->checkAuthorizationSync("org.qt.policykit.examples.set", + subject , Authority::AllowUserInteraction); + if (result == Authority::Yes) { + qDebug() << message().service() << QString("Implicit authorization set to") << action; + // Caller is authorized so we can perform the action + return setValue(action); + } else { + qDebug() << message().service() << QString("Can't set the implicit authorization"); + // Caller is not authorized so the action can't be performed + return false; + } +} + +bool PkExampleHelper::setValue(const QString &action) +{ + // This action must be authorized first. It will set the implicit + // authorization for the Shout action by editing the .policy file + QDomDocument doc = QDomDocument("policy"); + QFile file("/usr/share/polkit-1/actions/org.qt.policykit.examples.policy"); + if (!file.open(QIODevice::ReadOnly)) + return false; + doc.setContent(&file); + file.close(); + QDomElement el = doc.firstChildElement("policyconfig"). + firstChildElement("action"); + while (!el.isNull() && el.attribute("id", QString()) != "org.qt.policykit.examples.shout") { + el = el.nextSiblingElement("action"); + } + el = el.firstChildElement("defaults"); + el = el.firstChildElement("allow_active"); + if (el.isNull()) + return false; + el.firstChild().toText().setData(action); + if (!file.open(QIODevice::WriteOnly)) + return false; + QTextStream stream(&file); + doc.save(stream, 2); + file.close(); + return true; +} |