Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:iDesmI:branches:KDE:Frameworks
kinfocenter6
0003-kcms-memory-use-KAuth-dmidecode-helper.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0003-kcms-memory-use-KAuth-dmidecode-helper.patch of Package kinfocenter6
From 375abcd571b991aa1ea8436fad6c7a4d30f62fa1 Mon Sep 17 00:00:00 2001 From: Kristen McWilliam <kmcwilliampublic@gmail.com> Date: Mon, 14 Oct 2024 15:45:02 -0400 Subject: [PATCH 3/3] kcms/memory: use KAuth dmidecode helper Refactor to use a KAuth helper to run dmidecode as root, rather than using the CommandOutputContext. This means the KCM no longer requires the user to enter their password to view memory information, and won't show an obtuse error like before if the user cancelled the password dialog. --- kcms/helpers/dmidecode-helper/helper.cpp | 26 ++++++++++ kcms/helpers/dmidecode-helper/helper.h | 5 ++ .../org.kde.kinfocenter.dmidecode.actions | 7 +++ kcms/memory/CMakeLists.txt | 9 +++- kcms/memory/main.cpp | 48 ++++++++++++++++--- kcms/memory/ui/main.qml | 25 ++++++++-- 6 files changed, 108 insertions(+), 12 deletions(-) diff --git a/kcms/helpers/dmidecode-helper/helper.cpp b/kcms/helpers/dmidecode-helper/helper.cpp index e9d068dc..11921934 100644 --- a/kcms/helpers/dmidecode-helper/helper.cpp +++ b/kcms/helpers/dmidecode-helper/helper.cpp @@ -26,6 +26,24 @@ DMIDecodeHelper::DMIDecodeHelper(QObject *parent) m_dmidecodePath = QStandardPaths::findExecutable("dmidecode"); } +KAuth::ActionReply DMIDecodeHelper::memoryinformation(const QVariantMap &args) +{ + Q_UNUSED(args); + + KAuth::ActionReply reply; + auto result = executeDmidecode({QStringLiteral("--type"), QStringLiteral("17")}); + + if (result.failed()) { + qWarning() << "DMIDecodeHelper: Unable to get memory information"; + return KAuth::ActionReply::HelperErrorReply(); + } + + const QString output = result.data().value("result").toString(); + reply.addData("memory", output); + + return reply; +} + KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) { Q_UNUSED(args); @@ -45,6 +63,8 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) for (const auto &key : keys) { auto result = executeDmidecode({QStringLiteral("--string"), key}); if (result.failed()) { + qWarning() << "DMIDecodeHelper: Unable to get system information for " << key; + // We don't want to fail the entire action if we can't get a single piece of information. continue; } @@ -71,6 +91,12 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) reply.addData(key, output); } + if (reply.data().isEmpty()) { + qWarning() << "DMIDecodeHelper: Unable to get system information"; + // If we didn't get any data, we should fail the action. + return KAuth::ActionReply::HelperErrorReply(); + } + return reply; } diff --git a/kcms/helpers/dmidecode-helper/helper.h b/kcms/helpers/dmidecode-helper/helper.h index c1b588e8..805d5fa6 100644 --- a/kcms/helpers/dmidecode-helper/helper.h +++ b/kcms/helpers/dmidecode-helper/helper.h @@ -14,6 +14,11 @@ public: explicit DMIDecodeHelper(QObject *parent = nullptr); public Q_SLOTS: + /** + * Retrieves memory (RAM) information from dmidecode. + */ + KAuth::ActionReply memoryinformation(const QVariantMap &args); + KAuth::ActionReply systeminformation(const QVariantMap &args); private: diff --git a/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions b/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions index 66d3aa99..9f0c76f3 100644 --- a/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions +++ b/kcms/helpers/dmidecode-helper/org.kde.kinfocenter.dmidecode.actions @@ -1,5 +1,7 @@ # SPDX-License-Identifier: CC0-1.0 # SPDX-FileCopyrightText: 2021 Harald Sitter <sitter@kde.org> +# SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> + [Domain] Icon=computer URL=https://www.kde.org @@ -47,6 +49,11 @@ Name[x-test]=xxDesktop Management Interfacexx Name[zh_CN]=桌面管理界面 (DMI) Name[zh_TW]=桌面管理介面 +[org.kde.kinfocenter.dmidecode.memoryinformation] +Policy=yes +Name=Memory Information +Description=Read memory information from system's Desktop Management Interface (DMI) + [org.kde.kinfocenter.dmidecode.systeminformation] Policy=yes PolicyInactive=yes diff --git a/kcms/memory/CMakeLists.txt b/kcms/memory/CMakeLists.txt index 49219ac4..59c93b69 100644 --- a/kcms/memory/CMakeLists.txt +++ b/kcms/memory/CMakeLists.txt @@ -1,5 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com> +# SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> find_package(dmidecode) set_package_properties(dmidecode PROPERTIES TYPE RUNTIME) @@ -7,4 +8,10 @@ set_package_properties(dmidecode PROPERTIES TYPE RUNTIME) add_definitions(-DTRANSLATION_DOMAIN=\"kcm_memory\") kinfocenter_add_kcm(kcm_memory main.cpp) -target_link_libraries(kcm_memory PRIVATE KF6::CoreAddons KF6::KCMUtilsQuick KF6::I18n KInfoCenterInternal) +target_link_libraries(kcm_memory PRIVATE + KF6::AuthCore + KF6::CoreAddons + KF6::KCMUtilsQuick + KF6::I18n + KInfoCenterInternal +) diff --git a/kcms/memory/main.cpp b/kcms/memory/main.cpp index d2190140..7aab18ce 100644 --- a/kcms/memory/main.cpp +++ b/kcms/memory/main.cpp @@ -1,30 +1,64 @@ /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com> + SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> */ +#include <KAuth/Action> +#include <KAuth/ExecuteJob> +#include <KLocalizedString> #include <KPluginFactory> #include <KQuickConfigModule> -#include "CommandOutputContext.h" - class KCMMemory : public KQuickConfigModule { Q_OBJECT - Q_PROPERTY(CommandOutputContext *infoOutputContext READ outputContext CONSTANT FINAL) + Q_PROPERTY(QString memoryInformation READ memoryInformation NOTIFY changed) public: explicit KCMMemory(QObject *parent, const KPluginMetaData &data) : KQuickConfigModule(parent, data) { - m_outputContext = new CommandOutputContext(QStringLiteral("pkexec"), {"dmidecode", "--type", "17"}, parent); + loadData(); } - CommandOutputContext *outputContext() const + + QString memoryInformation() const { - return m_outputContext; + return m_memoryInformation; } private: - CommandOutputContext *m_outputContext; + Q_SIGNAL void changed(); + + /** + * The memory information that will be displayed in the KCM. + */ + QString m_memoryInformation; + + /** + * Load the memory information from the dmidecode helper. + */ + void loadData() + { + KAuth::Action action(QStringLiteral("org.kde.kinfocenter.dmidecode.memoryinformation")); + action.setHelperId(QStringLiteral("org.kde.kinfocenter.dmidecode")); + KAuth::ExecuteJob *job = action.execute(); + + connect(job, &KJob::result, this, [this, job]() { + if (job->error()) { + qWarning() << "Failed to retrieve memory information: " << job->errorString(); + return; + } else { + const auto reply = job->data(); + if (reply.contains("memory")) { + m_memoryInformation = reply["memory"].toString(); + } + } + + Q_EMIT changed(); + }); + + job->start(); + } }; K_PLUGIN_CLASS_WITH_JSON(KCMMemory, "kcm_memory.json") diff --git a/kcms/memory/ui/main.qml b/kcms/memory/ui/main.qml index 0300d619..42fdcbc7 100644 --- a/kcms/memory/ui/main.qml +++ b/kcms/memory/ui/main.qml @@ -1,14 +1,31 @@ /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL SPDX-FileCopyrightText: 2024 Thomas Duckworth <tduck973564@gmail.com> + SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> */ -import QtQuick 2.5 +import QtQuick 2.15 +import org.kde.kirigami 2.20 as Kirigami import org.kde.kcmutils as KCM -import org.kde.kinfocenter.private 1.0 as KInfoCenter +KCM.SimpleKCM { + id: kcm_memory + Kirigami.Theme.colorSet: Kirigami.Theme.View + Kirigami.Theme.inherit: false -KInfoCenter.CommandOutputKCM { - output: kcm.infoOutputContext + Kirigami.PlaceholderMessage { + anchors.centerIn: parent + width: parent.width - (Kirigami.Units.largeSpacing * 8) + visible: kcm.memoryInformation === "" + icon.name: "data-warning" + text: i18ndc("kinfocenter", "@info the KCM has no data to display", "No data available") + } + + Kirigami.SelectableLabel { + id: text + text: kcm.memoryInformation + font.family: "monospace" + visible: kcm.memoryInformation !== "" + } } -- 2.47.0
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor