-
Notifications
You must be signed in to change notification settings - Fork 7
/
agent.h
72 lines (59 loc) · 2.6 KB
/
agent.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Copyright (C) 2020 Martin Sandsmark
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <QDebug>
#include <QInputDialog>
#include <QRandomGenerator>
#include <KDESu/SuProcess>
#include <QProcess>
#include <unistd.h>
class Agent : public QObject
{
Q_CLASSINFO("D-Bus Interface", "org.freedesktop.PolicyKit1.AuthenticationAgent")
Q_OBJECT
public slots:
Q_SCRIPTABLE void BeginAuthentication(const QString &actionId,
const QString &message,
const QString &iconName,
const QMap<QString, QString> &details,
const QString &cookie,
const QList<QPair<QString, QVariantMap>> &identities
)
{
qDebug() << actionId << message << iconName << details << cookie << identities;
const QString safeCookie = QProcess::splitCommand(cookie).first(); // in case someone try to be funny
const QByteArray command = QStringList({ responderPath, safeCookie, QString::number(getuid()) }).join(' ').toLocal8Bit();
for (int num=0; num<3; num++) {
bool ok;
QString password = QInputDialog::getText(nullptr, "Enter the root password", message + "\n" + actionId, QLineEdit::Password, QString(), &ok);
if (!ok) {
return; // user aborted
}
KDESu::SuProcess process("root", command);
process.setErase(true);
const int result = process.exec(password.toLocal8Bit());
if (result < 0) {
qDebug() << "Failed to send reply" << strerror(errno);
}
// clear the memory
QRandomGenerator::system()->generate(password.begin(), password.end());
if (result != KDESu::SuProcess::SuIncorrectPassword) {
return;
}
}
return;
}
public:
QString responderPath;
};