Skip to content

Commit

Permalink
feat(plugin): support option widgets
Browse files Browse the repository at this point in the history
Change-Id: I3084c995cd4158af773c8ea7a70fd632b4ba1ffb
  • Loading branch information
hualet committed Jan 31, 2018
1 parent 3ca6157 commit ceffd7b
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 16 deletions.
16 changes: 11 additions & 5 deletions AuthDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <QVBoxLayout>
#include <QUrl>
#include <QAbstractButton>
#include <QButtonGroup>

#include <DHiDPIHelper>

Expand Down Expand Up @@ -102,12 +103,17 @@ void AuthDialog::setRequest(const QString &request, bool requiresAdmin)
m_passwordInput->setPlaceholderText(QString(dgettext("Linux-PAM", request.toUtf8().data())));
}

void AuthDialog::setOptions()
void AuthDialog::addOptions(QButtonGroup *bg)
{
/*
lblContent->setText(tr("An application is attempting to perform an action that requires privileges."
" Authentication is required to perform this action."));
*/
QList<QAbstractButton*> btns = bg->buttons();

if (btns.length() > 0) {
addSpacing(10);
}

for (QAbstractButton *btn : btns) {
addContent(btn);
}
}

void AuthDialog::createUserCB(const PolkitQt1::Identity::List &identities)
Expand Down
3 changes: 2 additions & 1 deletion AuthDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ class AuthDialog : public DDialog
void setError(const QString &error);
void setRequest(const QString &request, bool requiresAdmin);

void setOptions();
void addOptions(QButtonGroup *bg);

QString password() const;
void authenticationFailure();

Expand Down
6 changes: 6 additions & 0 deletions agent-extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define AGENTEXTENSION_H

#include <QtCore>
#include <QButtonGroup>

namespace dpa {

Expand Down Expand Up @@ -34,6 +35,11 @@ class AgentExtension {
*/
virtual QString description() const = 0;

/**
* @brief options returns options left to user to choose.
*/
virtual QButtonGroup* options() = 0;

/**
* @brief extendedDo is where extension actually do the dirty work.
*/
Expand Down
26 changes: 22 additions & 4 deletions pluginmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ PluginManager::PluginManager(QObject *parent)
load();
}

QList<QButtonGroup*> PluginManager::reduceGetOptions(const QString &actionID)
{
QList<QButtonGroup*> ret;

for (AgentExtension *plugin : m_plugins) {
if (plugin->interestedActions().contains(actionID) || plugin->interestedActions().isEmpty()) {
ret << plugin->options();
}
}

return ret;
}

void PluginManager::load()
{

Expand Down Expand Up @@ -48,6 +61,8 @@ AgentExtension *PluginManager::loadFile(const QString &filePath)

if (ret) ret->initialize(this);

qDebug() << "done loading plugin: " << filePath;

return ret;
} else {
qWarning() << "failed to load plugin file: " << loader->errorString();
Expand All @@ -59,19 +74,22 @@ AgentExtension *PluginManager::loadFile(const QString &filePath)

}

void PluginManager::reduce(const QString &actionID, const QString &username, const QString passwd)
void PluginManager::reduce(const QString &username, const QString passwd)
{
m_actionID = actionID;
m_username = username;
m_password = passwd;

for (AgentExtension *plugin : m_plugins) {
if (plugin->interestedActions().contains(actionID) || plugin->interestedActions().isEmpty()) {
if (plugin->interestedActions().contains(m_actionID) || plugin->interestedActions().isEmpty()) {
plugin->extendedDo();
}
}

m_actionID = "";
m_username = "";
m_password = "";
}

void PluginManager::setActionID(const QString &actionID)
{
m_actionID = actionID;
}
7 changes: 6 additions & 1 deletion pluginmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,29 @@

#include <QObject>
#include <QMap>
#include <QList>

#include "agent-extension.h"
#include "agent-extension-proxy.h"

using namespace dpa;

class QButtonGroup;
class PluginManager : public QObject, AgentExtensionProxy
{
Q_OBJECT
public:
explicit PluginManager(QObject *parent = nullptr);

void reduce(const QString &actionID, const QString &username, const QString passwd);
QList<QButtonGroup*> reduceGetOptions(const QString &actionID);
void reduce(const QString &username, const QString passwd);

const QString & actionID() const Q_DECL_OVERRIDE { return m_actionID; }
const QString & username() const Q_DECL_OVERRIDE { return m_username; }
const QString & password() const Q_DECL_OVERRIDE { return m_password; }

void setActionID(const QString &actionID);

private:
QList<AgentExtension*> m_plugins;
QString m_actionID;
Expand Down
12 changes: 8 additions & 4 deletions policykitlistener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,22 +85,27 @@ void PolicyKitListener::initiateAuthentication(const QString &actionId,
m_session.clear();

m_inProgress = true;
m_actionID = actionId;

WId parentId = 0;
if (m_actionsToWID.contains(actionId)) {
parentId = m_actionsToWID[actionId];
}

m_pluginManager.data()->setActionID(actionId);

m_dialog = new AuthDialog(actionId, message, iconName, details, identities, parentId);
connect(m_dialog.data(), SIGNAL(okClicked()), SLOT(dialogAccepted()));
connect(m_dialog.data(), SIGNAL(rejected()), SLOT(dialogCanceled()));
connect(m_dialog.data(), SIGNAL(adminUserSelected(PolkitQt1::Identity)), SLOT(userSelected(PolkitQt1::Identity)));

// TODO(hualet): show extended action information.

QList<QButtonGroup*> optionsList = m_pluginManager.data()->reduceGetOptions(actionId);
for (QButtonGroup *bg : optionsList) {
m_dialog.data()->addOptions(bg);
}

qDebug() << "WinId of the dialog is " << m_dialog.data()->winId() << m_dialog.data()->effectiveWinId();
m_dialog.data()->setOptions();
m_dialog.data()->show();
qDebug() << "WinId of the shown dialog is " << m_dialog.data()->winId() << m_dialog.data()->effectiveWinId();
m_dialog.data()->activateWindow();
Expand Down Expand Up @@ -154,8 +159,7 @@ void PolicyKitListener::finishObtainPrivilege()
}
}

m_pluginManager.data()->reduce(m_actionID,
m_selectedUser.toString().remove("unix-user:"),
m_pluginManager.data()->reduce(m_selectedUser.toString().remove("unix-user:"),
m_dialog.data()->password());

if (!m_session.isNull()) {
Expand Down
1 change: 0 additions & 1 deletion policykitlistener.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ public slots:
bool m_gainedAuthorization;
bool m_wasCancelled;
int m_numTries;
QString m_actionID;
PolkitQt1::Identity::List m_identities;
PolkitQt1::Agent::AsyncResult* m_result;
QString m_cookie;
Expand Down

0 comments on commit ceffd7b

Please sign in to comment.