File patch-allow-non-privileged.diff of Package kdiskmark

commit fe26a80e665f88b6713db6bfbb3e9bda98d0eb62
Author: René Bertin <rjvbertin@gmail.com>
Date:   Wed Feb 18 16:24:31 2026 +0100

    Provide a build option to run in non-privileged mode
    
    The user can take care of ensuring that s/he has write access.
    
    Committed from host : Bola

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4da934d..70bb8da 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,18 +13,25 @@ include_directories(${PROJECT_BINARY_BIN})
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
+include(FeatureSummary)
+
 option(USE_QT5 "Use Qt5 instead of Qt6" OFF)
+option(USE_PRIVILEGED_HELPER "The benchmarking helper process runs as root" ON)
 
 if(USE_QT5)
     find_package(Qt5 COMPONENTS Widgets LinguistTools DBus REQUIRED)
-    find_package(PolkitQt5-1 REQUIRED)
     set(QT_LIBS Qt5::Widgets Qt5::DBus)
-    set(POLKIT_LIB PolkitQt5-1::Core)
+    if (USE_PRIVILEGED_HELPER)
+        find_package(PolkitQt5-1 REQUIRED)
+        set(POLKIT_LIB PolkitQt5-1::Core)
+    endif()
 else()
     find_package(Qt6 COMPONENTS Widgets LinguistTools DBus REQUIRED)
-    find_package(PolkitQt6-1 REQUIRED)
     set(QT_LIBS Qt6::Widgets Qt6::DBus)
-    set(POLKIT_LIB PolkitQt6-1::Core)
+    if (USE_PRIVILEGED_HELPER)
+        find_package(PolkitQt6-1 REQUIRED)
+        set(POLKIT_LIB PolkitQt6-1::Core)
+    endif()
 endif()
 
 set(CMAKE_AUTOUIC ON)
@@ -136,6 +143,13 @@ add_executable(${PROJECT_NAME}
     src/diskdriveinfo.cpp
 )
 
+if (USE_PRIVILEGED_HELPER)
+    set_property(SOURCE
+        src/mainwindow.cpp
+        src/benchmark.cpp
+        APPEND PROPERTY COMPILE_DEFINITIONS USE_PRIVILEGED_HELPER)
+endif()
+
 target_link_libraries(${PROJECT_NAME} PRIVATE
     SingleApplication::SingleApplication
     ${QT_LIBS}
@@ -168,12 +182,26 @@ target_link_libraries(${PROJECT_NAME}_helper
     ${QT_LIBS}
     ${POLKIT_LIB}
 )
+if (USE_PRIVILEGED_HELPER)
+    set_target_properties(${PROJECT_NAME}_helper PROPERTIES
+        COMPILE_DEFINITIONS USE_PRIVILEGED_HELPER)
+endif()
 
 install(TARGETS ${PROJECT_NAME}_helper DESTINATION ${KDE_INSTALL_LIBEXECDIR})
-install(FILES data/dev.jonmagon.kdiskmark.helperinterface.conf DESTINATION ${KDE_INSTALL_DBUSDIR}/system.d)
 
-install(FILES data/dev.jonmagon.kdiskmark.helper.policy DESTINATION ${POLKITQT-1_POLICY_FILES_INSTALL_DIR})
-ecm_install_configured_files(
-    INPUT data/dev.jonmagon.kdiskmark.helperinterface.service.in
-    DESTINATION ${KDE_INSTALL_DBUSDIR}/system-services
-)
+if (USE_PRIVILEGED_HELPER)
+    install(FILES data/dev.jonmagon.kdiskmark.helper.policy DESTINATION ${POLKITQT-1_POLICY_FILES_INSTALL_DIR})
+    install(FILES data/dev.jonmagon.kdiskmark.helperinterface.conf DESTINATION ${KDE_INSTALL_DBUSDIR}/system.d)
+    ecm_install_configured_files(
+        INPUT data/dev.jonmagon.kdiskmark.helperinterface.service.in
+        DESTINATION ${KDE_INSTALL_DBUSDIR}/system-services
+    )
+else()
+    install(FILES data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.conf DESTINATION ${KDE_INSTALL_DBUSDIR}/system.d)
+    ecm_install_configured_files(
+        INPUT data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.service.in
+        DESTINATION ${KDE_INSTALL_DBUSDIR}/services
+    )
+endif()
+
+feature_summary(WHAT ALL   FATAL_ON_MISSING_REQUIRED_PACKAGES)
diff --git a/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.conf b/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.conf
new file mode 100644
index 0000000..076d137
--- /dev/null
+++ b/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.conf
@@ -0,0 +1,12 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+  <policy context="default">
+      <allow own="dev.jonmagon.kdiskmark.helperinterface"/>
+      <allow send_destination="dev.jonmagon.kdiskmark.helperinterface"
+           send_interface="dev.jonmagon.kdiskmark.helper"/>
+
+  </policy>
+</busconfig>
diff --git a/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.service.in b/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.service.in
new file mode 100644
index 0000000..6f641ea
--- /dev/null
+++ b/data/nonpriv/dev.jonmagon.kdiskmark.helperinterface.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=dev.jonmagon.kdiskmark.helperinterface
+Exec=@KDE_INSTALL_FULL_LIBEXECDIR@/kdiskmark_helper
diff --git a/src/benchmark.cpp b/src/benchmark.cpp
index 4d56e5a..d0ee665 100644
--- a/src/benchmark.cpp
+++ b/src/benchmark.cpp
@@ -4,6 +4,10 @@
 
 #include "helper_interface.h"
 
+#ifndef USE_PRIVILEGED_HELPER
+#warning "This build does not use a privileged helper application!"
+#endif
+
 Benchmark::Benchmark()
 {
     m_running = false;
@@ -59,9 +63,11 @@ void Benchmark::startTest(int blockSize, int queueDepth, int threads, const QStr
             return;
         }
 
+#ifdef USE_PRIVILEGED_HELPER
         if (settings.getFlusingCacheState()) {
             handleDbusPendingCall(interface->flushPageCache());
         }
+#endif
 
         if (!isRunning()) return;
 
@@ -305,13 +311,13 @@ void Benchmark::runBenchmark(QList<QPair<QPair<Global::BenchmarkTest, Global::Be
 
 DevJonmagonKdiskmarkHelperInterface* Benchmark::helperInterface()
 {
-    if (!QDBusConnection::systemBus().isConnected()) {
-        emit failed(QDBusConnection::systemBus().lastError().message());
+    if (!QDBusConnection::sessionBus().isConnected()) {
+        emit failed(QDBusConnection::sessionBus().lastError().message());
         return nullptr;
     }
 
     auto *interface = new dev::jonmagon::kdiskmark::helper(QStringLiteral("dev.jonmagon.kdiskmark.helperinterface"),
-                QStringLiteral("/Helper"), QDBusConnection::systemBus(), this);
+                QStringLiteral("/Helper"), QDBusConnection::sessionBus(), this);
     interface->setTimeout(10 * 24 * 3600 * 1000); // 10 days
 
     return interface;
diff --git a/src/helper.cpp b/src/helper.cpp
index 734b0c4..a759fdf 100644
--- a/src/helper.cpp
+++ b/src/helper.cpp
@@ -3,8 +3,12 @@
 #include <QCoreApplication>
 #include <QtDBus>
 #include <QFile>
+#ifdef USE_PRIVILEGED_HELPER
 #include <PolkitQt1/Authority>
 #include <PolkitQt1/Subject>
+#else
+#warning "This build does not use a privileged helper application!"
+#endif
 
 #include <signal.h>
 
@@ -70,14 +74,14 @@ QVariantMap HelperAdaptor::createNoCowDirectory(const QString &path)
 
 Helper::Helper() : m_helperAdaptor(new HelperAdaptor(this))
 {
-    if (!QDBusConnection::systemBus().isConnected() || !QDBusConnection::systemBus().registerService(QStringLiteral("dev.jonmagon.kdiskmark.helperinterface")) ||
-        !QDBusConnection::systemBus().registerObject(QStringLiteral("/Helper"), this)) {
-        qWarning() << QDBusConnection::systemBus().lastError().message();
+    if (!QDBusConnection::sessionBus().isConnected() || !QDBusConnection::sessionBus().registerService(QStringLiteral("dev.jonmagon.kdiskmark.helperinterface")) ||
+        !QDBusConnection::sessionBus().registerObject(QStringLiteral("/Helper"), this)) {
+        qWarning() << QDBusConnection::sessionBus().lastError().message();
         qApp->quit();
     }
 
     m_serviceWatcher = new QDBusServiceWatcher(this);
-    m_serviceWatcher->setConnection(QDBusConnection::systemBus());
+    m_serviceWatcher->setConnection(QDBusConnection::sessionBus());
     m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
 
     connect(m_serviceWatcher, &QDBusServiceWatcher::serviceUnregistered, qApp, [this](const QString &service) {
@@ -93,6 +97,7 @@ Helper::Helper() : m_helperAdaptor(new HelperAdaptor(this))
 QVariantMap Helper::initSession()
 {
     if (!calledFromDBus()) {
+	   qWarning() << Q_FUNC_INFO << "not called via DBus!";
         return {};
     }
 
@@ -104,6 +109,7 @@ QVariantMap Helper::initSession()
         return {{"success", false}, {"error", "There are already registered DBus connection."}};
     }
 
+#ifdef USE_PRIVILEGED_HELPER
     PolkitQt1::SystemBusNameSubject subject(message().service());
     PolkitQt1::Authority *authority = PolkitQt1::Authority::instance();
 
@@ -118,7 +124,7 @@ QVariantMap Helper::initSession()
     e.exec();
 
     if (authority->hasError()) {
-        qDebug() << "Encountered error while checking authorization, error code: " << authority->lastError() << authority->errorDetails();
+        qCritical() << "Encountered error while checking authorization, error code: " << authority->lastError() << authority->errorDetails();
         authority->clearError();
     }
 
@@ -133,6 +139,11 @@ QVariantMap Helper::initSession()
             qApp->quit();
         return {};
     }
+#else
+        // track who called into us so we can close when all callers have gone away
+        m_serviceWatcher->addWatchedService(message().service());
+        return {{"success", true}};
+#endif
 }
 
 QVariantMap Helper::endSession()
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index a332d4a..7b35a0a 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -20,6 +20,10 @@
 #include "storageitemdelegate.h"
 #include "global.h"
 
+#ifndef USE_PRIVILEGED_HELPER
+#warning "This build does not use a privileged helper application!"
+#endif
+
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
     , ui(new Ui::MainWindow)
@@ -170,7 +174,13 @@ MainWindow::MainWindow(QWidget *parent)
     ui->actionWrite_Mix->setChecked(settings.getBenchmarkMode() == Global::BenchmarkMode::WriteMix);
 
     ui->actionUse_O_DIRECT->setChecked(settings.getCacheBypassState());
+#ifdef USE_PRIVILEGED_HELPER
     ui->actionFlush_Pagecache->setChecked(settings.getFlusingCacheState());
+#else
+    ui->actionFlush_Pagecache->setChecked(false);
+    ui->actionFlush_Pagecache->setEnabled(false);
+    ui->actionFlush_Pagecache->setToolTip(tr("Only available in builds that require root privileges"));
+#endif
     ui->actionCoW_detection->setChecked(settings.getCoWDetectionState());
     ui->loopsCount->setValue(settings.getLoopsCount());
 
@@ -402,7 +412,9 @@ void MainWindow::on_actionTestData_Continuous_triggered(bool checked) {
 
 void MainWindow::on_actionFlush_Pagecache_triggered(bool checked)
 {
+#ifdef USE_PRIVILEGED_HELPER
     AppSettings().setFlushingCacheState(checked);
+#endif
 }
 
 void MainWindow::on_actionCoW_detection_triggered(bool checked)
openSUSE Build Service is sponsored by