diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2021-12-28 09:48:56 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2021-12-28 09:59:28 +0900 |
commit | eb684d7fa3c107977074672615c957086e7e9088 (patch) | |
tree | 60a255e522fa34a81aab3a701b2859454f09175e /src/polkit-listener.cpp | |
parent | ab12cfe230b06ba2a4505e681d7b8ce6ea35fb34 (diff) | |
download | polkit-agent-tde-eb684d7fa3c107977074672615c957086e7e9088.tar.gz polkit-agent-tde-eb684d7fa3c107977074672615c957086e7e9088.zip |
Conversion of package functionality.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'src/polkit-listener.cpp')
-rw-r--r-- | src/polkit-listener.cpp | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/polkit-listener.cpp b/src/polkit-listener.cpp new file mode 100644 index 0000000..efd5261 --- /dev/null +++ b/src/polkit-listener.cpp @@ -0,0 +1,226 @@ +/* This file is part of the KDE project + Copyright (C) 2009 Jaroslav Reznik <jreznik@redhat.com> + + 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 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 "polkit-listener.h" +#include "AuthDialog.h" + +#include <kdebug.h> +#include <tdelocale.h> + +#include <PolkitTQt/Agent/Listener> +#include <PolkitTQt/Agent/Session> +#include <PolkitTQt/Subject> +#include <PolkitTQt/Identity> +#include <PolkitTQt/Details> + +using namespace PolkitTQt; +using namespace PolkitTQt::Agent; + +PolkitListener::PolkitListener(TQObject *parent) : Listener(parent), m_inProgress(false), + m_selectedUser(0), m_result(nullptr), m_session(nullptr) +{ + PolkitTQt::UnixSessionSubject session(getpid()); + if (!registerListener(session, "/org/trinitydesktop/PolKit1AuthAgent")) + { + kdWarning() << "Could not initiate DBus listener!" << endl; + } + kdDebug() << "Listener online" << endl; +} + +void PolkitListener::clearSession() +{ + if (m_session) + { + m_session->deleteLater(); + m_session = nullptr; + } +} + +void PolkitListener::initiateAuthentication(const TQString &actionId, const TQString &message, + const TQString &iconName, const PolkitTQt::Details &details, + const TQString &cookie, const Identity::List &identities, AsyncResult* result) +{ + kdDebug() << "Initiating authentication" << endl; + + if (m_inProgress) + { + result->setError(i18n("Another client is already authenticating, please try again later.")); + result->setCompleted(); + kdDebug() << "Another client is already authenticating, please try again later." << endl; + return; + } + + m_identities = identities; + m_cookie = cookie; + m_result = result; + clearSession(); + + m_inProgress = true; + + m_dialog = new AuthDialog(actionId, message, iconName, details, identities); + connect(m_dialog, TQT_SIGNAL(okClicked()), TQT_SLOT(dialogAccepted())); + connect(m_dialog, TQT_SIGNAL(cancelClicked()), TQT_SLOT(dialogCanceled())); + connect(m_dialog, TQT_SIGNAL(adminUserSelected(const PolkitTQt::Identity&)), + TQT_SLOT(userSelected(const PolkitTQt::Identity&))); + + m_dialog->setOptions(); + m_dialog->show(); + + if (identities.count() == 1) + { + m_selectedUser = identities[0]; + } + else + { + m_selectedUser = m_dialog->adminUserSelected(); + } + + m_numTries = 0; + tryAgain(); +} + +void PolkitListener::tryAgain() +{ + kdDebug() << "Trying again" << endl; + // test!!! + m_wasCancelled = false; + + // We will create new session only when some user is selected + if (m_selectedUser.isValid()) + { + m_session = new Session(m_selectedUser, m_cookie, m_result); + connect(m_session, TQT_SIGNAL(request(const TQString&, bool)), this, + TQT_SLOT(request(const TQString&, bool))); + connect(m_session, TQT_SIGNAL(completed(bool)), this, TQT_SLOT(completed(bool))); + connect(m_session, TQT_SIGNAL(showError(const TQString&)), this, + TQT_SLOT(showError(const TQString&))); + m_session->initiate(); + } +} + +void PolkitListener::finishObtainPrivilege() +{ + kdDebug() << "Finishing obtaining privileges" << endl; + + // Number of tries increase only when some user is selected + if (m_selectedUser.isValid()) + { + m_numTries++; + } + + if (!m_gainedAuthorization && !m_wasCancelled && m_dialog) + { + m_dialog->authenticationFailure(); + + if (m_numTries < 3) + { + clearSession(); + tryAgain(); + return; + } + } + + if (m_session) + { + m_session->result()->setCompleted(); + } + else + { + m_result->setCompleted(); + } + clearSession(); + + if (m_dialog) + { + m_dialog->hide(); + m_dialog->deleteLater(); + m_dialog = nullptr; + } + + m_inProgress = false; + + kdDebug() << "Finish obtain authorization:" << m_gainedAuthorization << endl; +} + +bool PolkitListener::initiateAuthenticationFinish() +{ + kdDebug() << "Finishing authentication" << endl; + return true; +} + +void PolkitListener::cancelAuthentication() +{ + kdDebug() << "Cancelling authentication" << endl; + m_wasCancelled = true; + finishObtainPrivilege(); +} + +void PolkitListener::request(const TQString &request, bool _) +{ + kdDebug() << "Request: " << request << endl; + if (m_dialog) + { + m_dialog->setRequest(request, m_selectedUser.isValid() && + m_selectedUser.toString() == "unix-user:root"); + } +} + +void PolkitListener::completed(bool gainedAuthorization) +{ + kdDebug() << "Completed: " << gainedAuthorization << endl; + m_gainedAuthorization = gainedAuthorization; + finishObtainPrivilege(); +} + +void PolkitListener::showError(const TQString &text) +{ + kdDebug() << "Error: " << text << endl; +} + +void PolkitListener::dialogAccepted() +{ + kdDebug() << "Dialog accepted" << endl; + if (m_session) + { + m_session->setResponse(m_dialog->password()); + } +} + +void PolkitListener::dialogCanceled() +{ + kdDebug() << "Dialog cancelled" << endl; + m_wasCancelled = true; + if (m_session) + { + m_session->cancel(); + } + finishObtainPrivilege(); +} + +void PolkitListener::userSelected(const PolkitTQt::Identity &identity) +{ + m_selectedUser = identity; + // If some user is selected we must destroy existing session + clearSession(); + tryAgain(); +} + +#include "polkit-listener.moc" + |