File indexing completed on 2024-04-28 05:36:12

0001 /*  This file is part of the KDE project
0002     SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
0003     SPDX-FileCopyrightText: 2023 Devin Lin <devin@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "QuickAuthDialog.h"
0009 #include "IdentitiesModel.h"
0010 
0011 #include <PolkitQt1/Authority>
0012 
0013 #include <KLocalizedContext>
0014 #include <KLocalizedString>
0015 #include <KRuntimePlatform>
0016 #include <KUser>
0017 
0018 #include <QQmlApplicationEngine>
0019 #include <QQmlContext>
0020 #include <QQuickWindow>
0021 #include <QTimer>
0022 
0023 QuickAuthDialog::QuickAuthDialog(const QString &actionId,
0024                                  const QString &message,
0025                                  [[maybe_unused]] const PolkitQt1::Details &details,
0026                                  const PolkitQt1::Identity::List &identities)
0027     : QObject(nullptr)
0028     , m_actionId(actionId)
0029 {
0030     auto engine = new QQmlApplicationEngine(this);
0031     QVariantMap props = {
0032         {"mainText", message},
0033     };
0034 
0035     const auto actions = PolkitQt1::Authority::instance()->enumerateActionsSync();
0036     for (const PolkitQt1::ActionDescription &desc : actions) {
0037         if (actionId == desc.actionId()) {
0038             qDebug() << "Action description has been found";
0039             props.insert("descriptionString", desc.description());
0040             props.insert("descriptionActionId", desc.actionId());
0041             props.insert("descriptionVendorName", desc.vendorName());
0042             props.insert("descriptionVendorUrl", desc.vendorUrl());
0043             break;
0044         }
0045     }
0046 
0047     engine->setInitialProperties(props);
0048     engine->rootContext()->setContextObject(new KLocalizedContext(engine));
0049 
0050     if (KRuntimePlatform::runtimePlatform().contains("phone")) {
0051         // If this is Plasma Mobile
0052         engine->load("qrc:/qml/MobileQuickAuthDialog.qml");
0053     } else {
0054         // If this is Plasma Desktop, or other platforms
0055         engine->load("qrc:/qml/QuickAuthDialog.qml");
0056     }
0057 
0058     m_theDialog = qobject_cast<QQuickWindow *>(engine->rootObjects().constFirst());
0059 
0060     auto idents = qobject_cast<IdentitiesModel *>(m_theDialog->property("identitiesModel").value<QObject *>());
0061     idents->setIdentities(identities, false);
0062     if (!identities.isEmpty()) {
0063         int initialIndex = std::max(0, idents->indexForUser(KUser().loginName()));
0064         m_theDialog->setProperty("identitiesCurrentIndex", initialIndex);
0065     }
0066 
0067     // listen for dialog accept/reject
0068     connect(m_theDialog, SIGNAL(accept()), this, SIGNAL(okClicked()));
0069     connect(m_theDialog, SIGNAL(reject()), this, SIGNAL(rejected()));
0070 }
0071 
0072 enum KirigamiInlineMessageTypes { Information = 0, Positive = 1, Warning = 2, Error = 3 };
0073 
0074 QString QuickAuthDialog::actionId() const
0075 {
0076     return m_actionId;
0077 }
0078 
0079 QString QuickAuthDialog::password() const
0080 {
0081     return m_theDialog->property("password").toString();
0082 }
0083 
0084 void QuickAuthDialog::showError(const QString &message)
0085 {
0086     m_theDialog->setProperty("inlineMessageType", Error);
0087     m_theDialog->setProperty("inlineMessageText", message);
0088 }
0089 
0090 void QuickAuthDialog::showInfo(const QString &message)
0091 {
0092     m_theDialog->setProperty("inlineMessageType", Information);
0093     m_theDialog->setProperty("inlineMessageText", message);
0094 }
0095 
0096 PolkitQt1::Identity QuickAuthDialog::adminUserSelected() const
0097 {
0098     return PolkitQt1::Identity::fromString(m_theDialog->property("selectedIdentity").toString());
0099 }
0100 
0101 void QuickAuthDialog::authenticationFailure()
0102 {
0103     QTimer::singleShot(0, m_theDialog, SLOT(authenticationFailure()));
0104 }
0105 
0106 void QuickAuthDialog::show()
0107 {
0108     QTimer::singleShot(0, m_theDialog, SLOT(show()));
0109 }
0110 
0111 void QuickAuthDialog::hide()
0112 {
0113     QTimer::singleShot(0, m_theDialog, SLOT(hide()));
0114 }
0115 
0116 #include "moc_QuickAuthDialog.cpp"