/* * This file is part of the Polkit-tqt project * Copyright (C) 2009 Daniel Nicoletti * Copyright (C) 2009 Dario Freddi * Copyright (C) 2009 Jaroslav Reznik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "polkittqt1-gui-action.h" #include "polkittqt1-authority.h" #include "polkittqt1-subject.h" #include namespace PolkitTQt1 { namespace Gui { /** * \internal */ class Action::Private { public: Private(Action *p); Action *parent; TQString actionId; Authority::Result pkResult; TQ_LONG targetPID; void updateAction(); bool computePkResult(); void configChanged(); bool initiallyChecked; // states data bool selfBlockedVisible; bool selfBlockedEnabled; TQString selfBlockedText; TQString selfBlockedWhatsThis; TQString selfBlockedToolTip; TQIcon selfBlockedIcon; bool noVisible; bool noEnabled; TQString noText; TQString noWhatsThis; TQString noToolTip; TQIcon noIcon; bool authVisible; bool authEnabled; TQString authText; TQString authWhatsThis; TQString authToolTip; TQIcon authIcon; bool yesVisible; bool yesEnabled; TQString yesText; TQString yesWhatsThis; TQString yesToolTip; TQIcon yesIcon; }; Action::Private::Private(Action *p) : parent(p) , targetPID(getpid()) { initiallyChecked = false; // Set the default values selfBlockedVisible = true; selfBlockedEnabled = false; noVisible = true; noEnabled = false; authVisible = true; authEnabled = true; yesVisible = true; yesEnabled = true; } Action::Action(const TQString &actionId, TQObject *parent) : TQAction(parent) , d(new Private(this)) { // this must be called AFTER the values initialization setPolkitAction(actionId); // track the config changes to update the action connect(Authority::instance(), SIGNAL(configChanged()), this, SLOT(configChanged())); // for now we call config changed.. connect(Authority::instance(), SIGNAL(consoleKitDBChanged()), this, SLOT(configChanged())); } Action::~Action() { delete d; } bool Action::activate() { switch (d->pkResult) { case Authority::Yes: case Authority::Challenge: // just Q_EMIT the 'activated' signal TQ_EMIT authorized(); return true; break; default: case Authority::No: if (d->noEnabled) { /* If PolicyKit says no... and we got here.. it means * that the user set the property "no-enabled" to * TRUE.. * * Hence, they probably have a good reason for doing * this so do let the 'activate' signal propagate.. */ TQ_EMIT authorized(); return true; } break; } return false; } void Action::setChecked(bool checked) { // We store this as initiallyChecked // to be able to undo changes in case the auth fails d->initiallyChecked = checked; TQAction::setChecked(checked); } void Action::Private::updateAction() { if (Authority::instance()->hasError()) { return; } switch (pkResult) { default: case Authority::Unknown: case Authority::No: qobject_cast(parent)->setVisible(noVisible); qobject_cast(parent)->setEnabled(noEnabled); qobject_cast(parent)->setText(noText); if (!noWhatsThis.isNull()) { qobject_cast(parent)->setWhatsThis(noWhatsThis); } if (!noToolTip.isNull()) { qobject_cast(parent)->setToolTip(noToolTip); } qobject_cast(parent)->setIcon(noIcon); break; case Authority::Challenge: qobject_cast(parent)->setVisible(authVisible); qobject_cast(parent)->setEnabled(authEnabled); qobject_cast(parent)->setText(authText); if (!authWhatsThis.isNull()) { qobject_cast(parent)->setWhatsThis(authWhatsThis); } if (!authToolTip.isNull()) { qobject_cast(parent)->setToolTip(authToolTip); } qobject_cast(parent)->setIcon(authIcon); break; case Authority::Yes: qobject_cast(parent)->setVisible(yesVisible); qobject_cast(parent)->setEnabled(yesEnabled); qobject_cast(parent)->setText(yesText); if (!yesWhatsThis.isNull()) { qobject_cast(parent)->setWhatsThis(yesWhatsThis); } if (!yesToolTip.isNull()) { qobject_cast(parent)->setToolTip(yesToolTip); } qobject_cast(parent)->setIcon(yesIcon); if (parent->isCheckable()) { qobject_cast(parent)->setChecked(!initiallyChecked); } break; } TQ_EMIT parent->dataChanged(); } void Action::Private::configChanged() { bool result_changed; result_changed = computePkResult(); if (result_changed) { updateAction(); } } bool Action::Private::computePkResult() { Authority::Result old_result; UnixProcessSubject subject(parent->targetPID()); old_result = pkResult; pkResult = Authority::Unknown; pkResult = Authority::instance()->checkAuthorizationSync(actionId, subject, Authority::None); return old_result != pkResult; } TQ_LONG Action::targetPID() const { if (d->targetPID != 0) { return d->targetPID; } else { return TQCoreApplication::applicationPid(); } } void Action::setTargetPID(TQ_LONG pid) { d->targetPID = pid; d->computePkResult(); d->updateAction(); } bool Action::isAllowed() const { return d->pkResult == Authority::Yes; } bool Action::is(const TQString &other) const { return d->actionId == other; } void Action::revoke() { /*TODO: implement it? no negative authorizations available, no authorization db*/ } void Action::setText(const TQString &text, States states) { if (states & All) { d->selfBlockedText = text; d->noText = text; d->authText = text; d->yesText = text; } else if (states & Auth) { d->authText = text; } else if (states & No) { d->noText = text; } else if (states & SelfBlocked) { d->selfBlockedText = text; } else if (states & Yes) { d->yesText = text; } d->updateAction(); } TQString Action::text(Action::State state) const { switch (state) { case Yes: return d->yesText; case No: return d->noText; case Auth: return d->authText; case SelfBlocked: return d->selfBlockedText; case None: return TQAction::text(); default: return TQString(); } } void Action::setToolTip(const TQString &toolTip, States states) { if (states & All) { d->selfBlockedToolTip = toolTip; d->noToolTip = toolTip; d->authToolTip = toolTip; d->yesToolTip = toolTip; } else if (states & Auth) { d->authToolTip = toolTip; } else if (states & No) { d->noToolTip = toolTip; } else if (states & SelfBlocked) { d->selfBlockedToolTip = toolTip; } else if (states & Yes) { d->yesToolTip = toolTip; } d->updateAction(); } TQString Action::toolTip(Action::State state) const { switch (state) { case Yes: return d->yesToolTip; case No: return d->noToolTip; case Auth: return d->authToolTip; case SelfBlocked: return d->selfBlockedToolTip; case None: return TQAction::toolTip(); default: return TQString(); } } void Action::setWhatsThis(const TQString &whatsThis, States states) { if (states & All) { d->selfBlockedWhatsThis = whatsThis; d->noWhatsThis = whatsThis; d->authWhatsThis = whatsThis; d->yesWhatsThis = whatsThis; } else if (states & Auth) { d->authWhatsThis = whatsThis; } else if (states & No) { d->noWhatsThis = whatsThis; } else if (states & SelfBlocked) { d->selfBlockedWhatsThis = whatsThis; } else if (states & Yes) { d->yesWhatsThis = whatsThis; } d->updateAction(); } TQString Action::whatsThis(Action::State state) const { switch (state) { case Yes: return d->yesWhatsThis; case No: return d->noWhatsThis; case Auth: return d->authWhatsThis; case SelfBlocked: return d->selfBlockedWhatsThis; case None: return TQAction::whatsThis(); default: return TQString(); } } void Action::setIcon(const TQIcon &icon, States states) { if (states & All) { d->selfBlockedIcon = icon; d->noIcon = icon; d->authIcon = icon; d->yesIcon = icon; } else if (states & Auth) { d->authIcon = icon; } else if (states & No) { d->noIcon = icon; } else if (states & SelfBlocked) { d->selfBlockedIcon = icon; } else if (states & Yes) { d->yesIcon = icon; } d->updateAction(); } TQIcon Action::icon(Action::State state) const { switch (state) { case Yes: return d->yesIcon; case No: return d->noIcon; case Auth: return d->authIcon; case SelfBlocked: return d->selfBlockedIcon; case None: return TQAction::icon(); default: return TQIcon(); } } void Action::setEnabled(bool enabled, States states) { if (states & All) { d->selfBlockedEnabled = enabled; d->noEnabled = enabled; d->authEnabled = enabled; d->yesEnabled = enabled; } else if (states & Auth) { d->authEnabled = enabled; } else if (states & No) { d->noEnabled = enabled; } else if (states & SelfBlocked) { d->selfBlockedEnabled = enabled; } else if (states & Yes) { d->yesEnabled = enabled; } d->updateAction(); } bool Action::isEnabled(Action::State state) const { switch (state) { case Yes: return d->yesEnabled; case No: return d->noEnabled; case Auth: return d->authEnabled; case SelfBlocked: return d->selfBlockedEnabled; case None: return TQAction::isEnabled(); default: return false; } } void Action::setVisible(bool visible, States states) { if (states & All) { d->selfBlockedVisible = visible; d->noVisible = visible; d->authVisible = visible; d->yesVisible = visible; } else if (states & Auth) { d->authVisible = visible; } else if (states & No) { d->noVisible = visible; } else if (states & SelfBlocked) { d->selfBlockedVisible = visible; } else if (states & Yes) { d->yesVisible = visible; } d->updateAction(); } bool Action::isVisible(Action::State state) const { switch (state) { case Yes: return d->yesVisible; case No: return d->noVisible; case Auth: return d->authVisible; case SelfBlocked: return d->selfBlockedVisible; case None: return TQAction::isVisible(); default: return false; } } void Action::setPolkitAction(const TQString &actionId) { //TODO: d->actionId = actionId; d->computePkResult(); d->updateAction(); } //-------------------------------------------------- TQString Action::actionId() const { return d->actionId; } } } #include "polkittqt1-gui-action.moc"