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"