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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/* This file is part of the KDE project
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "QuickAuthDialog.h"
#include "IdentitiesModel.h"
#include <PolkitQt1/Authority>
#include <KLocalizedQmlContext>
#include <KLocalizedString>
#include <KNotification>
#include <KRuntimePlatform>
#include <KUser>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QQuickWindow>
#include <QTimer>
QuickAuthDialog::QuickAuthDialog(const QString &actionId,
const QString &message,
[[maybe_unused]] const PolkitQt1::Details &details,
const PolkitQt1::Identity::List &identities)
: QObject(nullptr)
, m_actionId(actionId)
{
auto engine = new QQmlApplicationEngine(this);
QVariantMap props = {
{"mainText", message},
};
const auto actions = PolkitQt1::Authority::instance()->enumerateActionsSync();
for (const PolkitQt1::ActionDescription &desc : actions) {
if (actionId == desc.actionId()) {
qDebug() << "Action description has been found";
props.insert("descriptionString", desc.description());
props.insert("descriptionActionId", desc.actionId());
props.insert("descriptionVendorName", desc.vendorName());
props.insert("descriptionVendorUrl", desc.vendorUrl());
break;
}
}
engine->setInitialProperties(props);
engine->rootContext()->setContextObject(new KLocalizedQmlContext(engine));
if (KRuntimePlatform::runtimePlatform().contains("phone")) {
// If this is Plasma Mobile
engine->load("qrc:/qml/MobileQuickAuthDialog.qml");
} else {
// If this is Plasma Desktop, or other platforms
engine->load("qrc:/qml/QuickAuthDialog.qml");
}
m_theDialog = qobject_cast<QQuickWindow *>(engine->rootObjects().constFirst());
auto idents = qobject_cast<IdentitiesModel *>(m_theDialog->property("identitiesModel").value<QObject *>());
idents->setIdentities(identities, false);
if (!identities.isEmpty()) {
int initialIndex = std::max(0, idents->indexForUser(KUser().loginName()));
m_theDialog->setProperty("identitiesCurrentIndex", initialIndex);
}
// listen for dialog accept/reject
connect(m_theDialog, SIGNAL(accept()), this, SIGNAL(okClicked()));
connect(m_theDialog, SIGNAL(reject()), this, SIGNAL(rejected()));
connect(m_theDialog, SIGNAL(userSelected()), this, SIGNAL(userSelected()));
}
enum KirigamiInlineMessageTypes { Information = 0, Positive = 1, Warning = 2, Error = 3 };
QString QuickAuthDialog::actionId() const
{
return m_actionId;
}
QString QuickAuthDialog::password() const
{
return m_theDialog->property("password").toString();
}
void QuickAuthDialog::showError(const QString &message)
{
m_theDialog->setProperty("inlineMessageType", Error);
m_theDialog->setProperty("inlineMessageText", message);
}
void QuickAuthDialog::showInfo(const QString &message)
{
m_theDialog->setProperty("inlineMessageType", Information);
m_theDialog->setProperty("inlineMessageText", message);
}
PolkitQt1::Identity QuickAuthDialog::adminUserSelected() const
{
return PolkitQt1::Identity::fromString(m_theDialog->property("selectedIdentity").toString());
}
void QuickAuthDialog::authenticationFailure()
{
QTimer::singleShot(0, m_theDialog, SLOT(authenticationFailure()));
}
void QuickAuthDialog::show()
{
KNotification *notification = new KNotification("authenticate");
notification->setText(i18n("Authentication Required"));
notification->sendEvent();
QTimer::singleShot(0, m_theDialog, SLOT(show()));
}
void QuickAuthDialog::hide()
{
QTimer::singleShot(0, m_theDialog, SLOT(hide()));
}
void QuickAuthDialog::request([[maybe_unused]] const QString &request, [[maybe_unused]] bool echo)
{
QTimer::singleShot(0, m_theDialog, SLOT(request()));
}
#include "moc_QuickAuthDialog.cpp"
|