From c42758b335b81dc45d987562ed3d916e20b3c195 Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Sun, 20 Jul 2025 11:02:20 +0200 Subject: [PATCH] quicksettings: Move Flashlight write to KAuth --- quicksettings/flashlight/CMakeLists.txt | 3 ++ quicksettings/flashlight/flashlightutil.cpp | 23 ++++++-- quicksettings/flashlight/kauth/CMakeLists.txt | 27 ++++++++++ .../flashlight/kauth/flashlighthelper.actions | 13 +++++ .../flashlight/kauth/flashlighthelper.cpp | 52 +++++++++++++++++++ 5 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 quicksettings/flashlight/kauth/CMakeLists.txt create mode 100644 quicksettings/flashlight/kauth/flashlighthelper.actions create mode 100644 quicksettings/flashlight/kauth/flashlighthelper.cpp diff --git a/quicksettings/flashlight/CMakeLists.txt b/quicksettings/flashlight/CMakeLists.txt index d8a987d1..670324f3 100644 --- a/quicksettings/flashlight/CMakeLists.txt +++ b/quicksettings/flashlight/CMakeLists.txt @@ -13,6 +13,7 @@ target_link_libraries(flashlightplugin PRIVATE Qt::Qml Qt::Quick Qt::DBus + KF6::AuthCore KF6::CoreAddons KF6::ConfigCore KF6::ConfigGui @@ -24,3 +25,5 @@ target_link_libraries(flashlightplugin PRIVATE ecm_finalize_qml_module(flashlightplugin) plasma_install_package(package org.kde.plasma.quicksetting.flashlight quicksettings) + +add_subdirectory(kauth) diff --git a/quicksettings/flashlight/flashlightutil.cpp b/quicksettings/flashlight/flashlightutil.cpp index cd085a68..c7730d25 100644 --- a/quicksettings/flashlight/flashlightutil.cpp +++ b/quicksettings/flashlight/flashlightutil.cpp @@ -1,6 +1,7 @@ /* * SPDX-FileCopyrightText: 2020 Han Young * SPDX-FileCopyrightText: 2022 by Devin Lin + * SPDX-FileCopyrightText: 2024-2025 Florian RICHER * * SPDX-License-Identifier: GPL-2.0-or-later */ @@ -15,6 +16,11 @@ #include #include +#include +#include + +using namespace Qt::StringLiterals; + #define TORCH_SUBSYSTEM "leds" FlashlightUtil::FlashlightUtil(QObject *parent) @@ -39,9 +45,20 @@ void FlashlightUtil::toggleTorch() return; } - int ret = udev_device_set_sysattr_value(m_device, "brightness", const_cast(m_torchEnabled ? "0" : m_maxBrightness)); - if (ret < 0) { - qWarning() << "Flashlight can't be toggled"; + const QString sysPath = udev_device_get_syspath(m_device); + const QString brightness = m_torchEnabled ? "0" : m_maxBrightness; + const QVariantMap args = { + {u"sysPath"_s, sysPath}, + {u"brightness"_s, brightness}, + }; + + KAuth::Action writeAction(u"org.kde.plasma.mobileshell.flashlighthelper.setbrightness"_s); + writeAction.setHelperId(u"org.kde.plasma.mobileshell.flashlighthelper"_s); + writeAction.setArguments(args); + + KAuth::ExecuteJob *job = writeAction.execute(); + if (!job->exec()) { + qDebug() << "Flashlight can't be toggled: kauth returned an error code:" << job->error() << " message: " << job->errorString(); return; } diff --git a/quicksettings/flashlight/kauth/CMakeLists.txt b/quicksettings/flashlight/kauth/CMakeLists.txt new file mode 100644 index 00000000..ac4a7cd2 --- /dev/null +++ b/quicksettings/flashlight/kauth/CMakeLists.txt @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2025 Florian RICHER +# SPDX-License-Identifier: BSD-2-Clause + +add_executable(flashlighthelper) +target_sources(flashlighthelper PRIVATE flashlighthelper.cpp) + +target_link_libraries(flashlighthelper + Qt6::Core + KF6::AuthCore + KF6::CoreAddons + udev +) + +install(TARGETS flashlighthelper DESTINATION ${KAUTH_HELPER_INSTALL_DIR}) + +find_package(KF6Auth NO_MODULE) + +kauth_install_helper_files(flashlighthelper org.kde.plasma.mobileshell.flashlighthelper root) +kauth_install_actions(org.kde.plasma.mobileshell.flashlighthelper flashlighthelper.actions) + +ecm_qt_declare_logging_category(flashlighthelper + HEADER flashlighthelper_debug.h + IDENTIFIER FLASHLIGHTHELPER + DEFAULT_SEVERITY Warning + CATEGORY_NAME org.kde.plasma.mobileshell.flashlighthelper + DESCRIPTION "Helper for Flashlight for some actions need root access" +) \ No newline at end of file diff --git a/quicksettings/flashlight/kauth/flashlighthelper.actions b/quicksettings/flashlight/kauth/flashlighthelper.actions new file mode 100644 index 00000000..24a08d52 --- /dev/null +++ b/quicksettings/flashlight/kauth/flashlighthelper.actions @@ -0,0 +1,13 @@ +# SPDX-FileCopyrightText: 2025 Florian RICHER +# SPDX-License-Identifier: GPL-2.0-or-later + +[Domain] +Name=Waydroid Management +Icon=color + +[org.kde.plasma.mobileshell.flashlighthelper.setbrightness] +Name=Set flashlight brightness +Description=Allow set brightness on led device +Policy=yes +PolicyInactive=yes +Persistence=session diff --git a/quicksettings/flashlight/kauth/flashlighthelper.cpp b/quicksettings/flashlight/kauth/flashlighthelper.cpp new file mode 100644 index 00000000..b77430bc --- /dev/null +++ b/quicksettings/flashlight/kauth/flashlighthelper.cpp @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2025 Florian RICHER + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "flashlighthelper_debug.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include + +using namespace Qt::StringLiterals; + +class Flashlighthelper : public QObject +{ + Q_OBJECT +public Q_SLOTS: + KAuth::ActionReply setbrightness(const QVariantMap &args); +}; + +KAuth::ActionReply Flashlighthelper::setbrightness(const QVariantMap &args) +{ + const char *sysPath = args.value("sysPath"_L1).toString().toUtf8().constData(); + const char *brightness = args.value("brightness"_L1).toString().toUtf8().constData(); + + struct udev *udev = udev_new(); + struct udev_device *device = udev_device_new_from_syspath(udev, sysPath); + + int ret = udev_device_set_sysattr_value(device, "brightness", const_cast(brightness)); + + udev_device_unref(device); + udev_unref(udev); + + if (ret >= 0) { + return KAuth::ActionReply::SuccessReply(); + } else { + qCWarning(FLASHLIGHTHELPER) << "Failed to set udev system attribute"; + return KAuth::ActionReply::HelperErrorReply(); + } +} + +KAUTH_HELPER_MAIN("org.kde.plasma.mobileshell.flashlighthelper", Flashlighthelper) + +#include "flashlighthelper.moc" \ No newline at end of file