You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxqt-policykit-packaging/src/policykitagent.cpp

153 lines
4.4 KiB

/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* LXDE-Qt - a lightweight, Qt based, desktop toolset
* http://razor-qt.org
*
* Copyright: 2011-2012 Razor team
* Authors:
* Petr Vanek <petr@scribus.info>
*
* This program or library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* END_COMMON_COPYRIGHT_HEADER */
#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1
#include <polkitagent/polkitagent.h>
#include <PolkitQt1/Subject>
#include <QMessageBox>
#include "policykitagent.h"
#include "policykitagentgui.h"
namespace LXQtPolicykit
{
PolicykitAgent::PolicykitAgent(QObject *parent)
: PolkitQt1::Agent::Listener(parent),
m_inProgress(false),
m_gui(0)
{
PolkitQt1::UnixSessionSubject session(getpid());
registerListener(session, "/org/lxqt/PolicyKit1/AuthenticationAgent");
}
PolicykitAgent::~PolicykitAgent()
{
if (m_gui)
{
m_gui->blockSignals(true);
m_gui->deleteLater();
}
}
void PolicykitAgent::initiateAuthentication(const QString &actionId,
const QString &message,
const QString &iconName,
const PolkitQt1::Details &details,
const QString &cookie,
const PolkitQt1::Identity::List &identities,
PolkitQt1::Agent::AsyncResult *result)
{
if (m_inProgress)
{
QMessageBox::information(0, tr("PolicyKit Information"), tr("Another authentization in progress. Please try it again later."));
return;
}
m_inProgress = true;
m_SessionIdentity.clear();
if (m_gui)
{
delete m_gui;
m_gui = 0;
}
m_gui = new PolicykitAgentGUI(actionId, message, iconName, details, identities);
foreach (PolkitQt1::Identity i, identities)
{
PolkitQt1::Agent::Session *session;
session = new PolkitQt1::Agent::Session(i, cookie, result);
Q_ASSERT(session);
m_SessionIdentity[session] = i;
connect(session, SIGNAL(request(QString, bool)), this, SLOT(request(QString, bool)));
connect(session, SIGNAL(completed(bool)), this, SLOT(completed(bool)));
connect(session, SIGNAL(showError(QString)), this, SLOT(showError(QString)));
connect(session, SIGNAL(showInfo(QString)), this, SLOT(showInfo(QString)));
session->initiate();
}
}
bool PolicykitAgent::initiateAuthenticationFinish()
{
// dunno what are those for...
m_inProgress = false;
return true;
}
void PolicykitAgent::cancelAuthentication()
{
// dunno what are those for...
m_inProgress = false;
}
void PolicykitAgent::request(const QString &request, bool echo)
{
PolkitQt1::Agent::Session *session = qobject_cast<PolkitQt1::Agent::Session *>(sender());
Q_ASSERT(session);
Q_ASSERT(m_gui);
PolkitQt1::Identity identity = m_SessionIdentity[session];
m_gui->setPrompt(identity, request, echo);
if (m_gui->exec())
session->setResponse(m_gui->response());
else
session->setResponse("");
}
void PolicykitAgent::completed(bool gainedAuthorization)
{
PolkitQt1::Agent::Session * session = qobject_cast<PolkitQt1::Agent::Session *>(sender());
Q_ASSERT(session);
if (!gainedAuthorization)
{
QMessageBox::information(0, tr("Authorization Failed"), tr("Authorization failed for some reason"));
}
session->result()->setCompleted();
delete session;
m_inProgress = false;
}
void PolicykitAgent::showError(const QString &text)
{
QMessageBox::warning(0, tr("PolicyKit Error"), text);
}
void PolicykitAgent::showInfo(const QString &text)
{
QMessageBox::information(0, tr("PolicyKit Information"), text);
}
} //namespace