Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:iDesmI:branches:KDE:Frameworks
kinfocenter6
0002-refactor-dmidecode-helper-support-multiple...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0002-refactor-dmidecode-helper-support-multiple-methods.patch of Package kinfocenter6
From e6f449a1aa0bf5b1dceaff13390955bd3d21de9d Mon Sep 17 00:00:00 2001 From: Kristen McWilliam <kmcwilliampublic@gmail.com> Date: Thu, 5 Sep 2024 13:03:45 -0400 Subject: [PATCH 2/3] refactor(dmidecode-helper): support multiple methods This allows the helper to extend and support other types of information, eg. memory information. --- kcms/helpers/dmidecode-helper/helper.cpp | 60 +++++++++++++++++------- kcms/helpers/dmidecode-helper/helper.h | 15 ++++++ 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/kcms/helpers/dmidecode-helper/helper.cpp b/kcms/helpers/dmidecode-helper/helper.cpp index 396b2d74..e9d068dc 100644 --- a/kcms/helpers/dmidecode-helper/helper.cpp +++ b/kcms/helpers/dmidecode-helper/helper.cpp @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL // SPDX-FileCopyrightText: 2021-2022 Harald Sitter <sitter@kde.org> +// SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> #include "helper.h" @@ -16,16 +17,18 @@ auto make_array(Input &&...args) -> std::array<Output, sizeof...(args)> // NB: w return {std::forward<Input>(args)...}; } -KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) +DMIDecodeHelper::DMIDecodeHelper(QObject *parent) + : QObject(parent) { - Q_UNUSED(args); - // PATH is super minimal when invoked through dbus setenv("PATH", "/usr/sbin:/sbin:/usr/local/sbin", 1); - const QString dmidecode = QStandardPaths::findExecutable("dmidecode"); - if (dmidecode.isEmpty()) { - return KAuth::ActionReply::HelperErrorReply(); - } + + m_dmidecodePath = QStandardPaths::findExecutable("dmidecode"); +} + +KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) +{ + Q_UNUSED(args); // NB: Microsoft also outlines a limited set of DMI values to be required for IOT OEM licensing, as such we // can rely on the same fields to have sound content . Since this only applies to OEMs we still need to filter @@ -33,19 +36,20 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) // https://docs.microsoft.com/en-us/windows-hardware/manufacture/iot/license-requirements?view=windows-11#smbios-support KAuth::ActionReply reply; - for (const auto &key : {QStringLiteral("system-manufacturer"), - QStringLiteral("system-product-name"), - QStringLiteral("system-version"), - QStringLiteral("system-serial-number")}) { - QProcess proc; - proc.start(dmidecode, {QStringLiteral("--string"), key}); - proc.waitForFinished(); - const QByteArray output = proc.readAllStandardOutput().trimmed(); - - if (output.isEmpty() || proc.error() != QProcess::UnknownError || proc.exitStatus() != QProcess::NormalExit) { + + const auto keys = {QStringLiteral("system-manufacturer"), + QStringLiteral("system-product-name"), + QStringLiteral("system-version"), + QStringLiteral("system-serial-number")}; + + for (const auto &key : keys) { + auto result = executeDmidecode({QStringLiteral("--string"), key}); + if (result.failed()) { continue; } + const auto output = result.data().value("result").toString(); + // Fairly exhaustive filter list based on a dozen or so samples gathered from reddit and other places. // These are values that may appear in the DMI system information but aren't really useful. static const auto dummyData = make_array<QString>(QStringLiteral("system version"), @@ -59,12 +63,34 @@ KAuth::ActionReply DMIDecodeHelper::systeminformation(const QVariantMap &args) QStringLiteral("not specified"), QStringLiteral("not applicable") /* may also be empty, but that is filtered above already */); + if (std::find(dummyData.cbegin(), dummyData.cend(), output.toLower()) != dummyData.cend()) { continue; } reply.addData(key, output); } + + return reply; +} + +KAuth::ActionReply DMIDecodeHelper::executeDmidecode(const QStringList &arguments) +{ + if (m_dmidecodePath.isEmpty()) { + return KAuth::ActionReply::HelperErrorReply(); + } + + QProcess proc; + proc.start(m_dmidecodePath, arguments); + proc.waitForFinished(); + const QByteArray output = proc.readAllStandardOutput().trimmed(); + + if (output.isEmpty() || proc.error() != QProcess::UnknownError || proc.exitStatus() != QProcess::NormalExit) { + return KAuth::ActionReply::HelperErrorReply(); + } + + KAuth::ActionReply reply; + reply.addData("result", output); return reply; } diff --git a/kcms/helpers/dmidecode-helper/helper.h b/kcms/helpers/dmidecode-helper/helper.h index dd8fe90d..c1b588e8 100644 --- a/kcms/helpers/dmidecode-helper/helper.h +++ b/kcms/helpers/dmidecode-helper/helper.h @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL // SPDX-FileCopyrightText: 2021 Harald Sitter <sitter@kde.org> +// SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic@gmail.com> #pragma once @@ -8,6 +9,20 @@ class DMIDecodeHelper : public QObject { Q_OBJECT + +public: + explicit DMIDecodeHelper(QObject *parent = nullptr); + public Q_SLOTS: KAuth::ActionReply systeminformation(const QVariantMap &args); + +private: + KAuth::ActionReply executeDmidecode(const QStringList &arguments); + + /** + * Path to the dmidecode binary. + * + * If the binary is not found, this helper will not work. + */ + QString m_dmidecodePath; }; -- 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