From 4383423fc5381951b064bd55c2a5065b2d26660c Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Fri, 10 Feb 2023 15:14:58 +0100 Subject: Cleanup the D-Bus interfaces - most of the newer PackageManager signals were not exposed at all - some properties were not exposed consistently or used the wrong type - clarified the D-Bus policy settings in regards to properties Change-Id: I6875c0a0613a0a63af2386d311a1a6c7c0031b7b Reviewed-by: Dominik Holland (cherry picked from commit 4a14abf206c548b80f2942c4d42e23b0e97ddeb1) Reviewed-by: Qt Cherry-pick Bot --- doc/configuration.qdoc | 2 + .../QtApplicationManager/SystemUI/plugins.qmltypes | 16 ++---- src/dbus-lib/CMakeLists.txt | 3 + src/dbus-lib/dbuspolicy.cpp | 8 +-- src/dbus-lib/dbuspolicy.h | 4 +- src/dbus-lib/io.qt.applicationmanager.xml | 12 ++-- src/dbus-lib/io.qt.packagemanager.xml | 66 +++++++++++++++------- src/dbus-lib/io.qt.windowmanager.xml | 7 +++ src/dbus-lib/packagemanagerdbuscontextadaptor.cpp | 46 ++++++++++++--- src/dbus-lib/windowmanagerdbuscontextadaptor.cpp | 19 ++++++- src/manager-lib/applicationmanager.h | 4 +- src/manager-lib/notificationmanager.h | 4 +- src/manager-lib/packagemanager.h | 14 ++--- src/tools/controller/controller.cpp | 4 +- src/window-lib/windowmanager.h | 8 +-- 15 files changed, 148 insertions(+), 69 deletions(-) diff --git a/doc/configuration.qdoc b/doc/configuration.qdoc index 3a4e1f90..18473bb1 100644 --- a/doc/configuration.qdoc +++ b/doc/configuration.qdoc @@ -531,6 +531,8 @@ policies. policy configuration. The keys into this map are the undecorated D-Bus function names, such as \c startApplication. When a key is specified, the corresponding function's access policy is \c deny, until you add \c allow criterias -- all of which are AND-ed together. + Due to the way D-Bus properties are implemented, these policy only apply to methods, but + not to property getters and setters. \endtable The code snippet below shows a simple example, that only allows applications with the \c appstore diff --git a/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes b/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes index 858fc226..608b8606 100644 --- a/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes +++ b/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes @@ -306,6 +306,10 @@ Module { Signal { name: "countChanged" } + Signal { + name: "slowAnimationsChanged" + Parameter { name: ""; type: "bool"; } + } Signal { name: "raiseApplicationWindow" Parameter { name: "applicationId"; type: "string"; } @@ -336,14 +340,6 @@ Module { Signal { name: "shutDownFinished" } - Signal { - name: "slowAnimationsChanged" - Parameter { name: ""; type: "bool"; } - } - Method { - name: "count" - type: "int" - } Method { name: "get" type: "QVariantMap" @@ -581,10 +577,6 @@ Module { Parameter { name: "id"; type: "uint"; } Parameter { name: "rolesChanged"; type: "QStringList"; } } - Method { - name: "count" - type: "int" - } Method { name: "get" type: "QVariantMap" diff --git a/src/dbus-lib/CMakeLists.txt b/src/dbus-lib/CMakeLists.txt index 419c2f6f..08ff81cb 100644 --- a/src/dbus-lib/CMakeLists.txt +++ b/src/dbus-lib/CMakeLists.txt @@ -61,16 +61,19 @@ add_custom_target("DBus-Interface-XMLs" SOURCES qt_generate_dbus_interface( ${CMAKE_CURRENT_SOURCE_DIR}/../manager-lib/applicationmanager.h ${CMAKE_CURRENT_BINARY_DIR}/io.qt.applicationmanager.xml.regen + OPTIONS -a -t "QtAM::Am::RunState=u" -t "QtAM::UnixFdMap=a{sh}" ) qt_generate_dbus_interface( ${CMAKE_CURRENT_SOURCE_DIR}/../manager-lib/packagemanager.h ${CMAKE_CURRENT_BINARY_DIR}/io.qt.packagemanager.xml.regen + OPTIONS -a -t "QtAM::AsynchronousTask::TaskState=s" ) qt_generate_dbus_interface( ${CMAKE_CURRENT_SOURCE_DIR}/../window-lib/windowmanager.h ${CMAKE_CURRENT_BINARY_DIR}/io.qt.windowmanager.xml.regen + OPTIONS -a ) add_custom_target(dbus_xml_regen DEPENDS diff --git a/src/dbus-lib/dbuspolicy.cpp b/src/dbus-lib/dbuspolicy.cpp index b4b872ba..2e1b4c63 100644 --- a/src/dbus-lib/dbuspolicy.cpp +++ b/src/dbus-lib/dbuspolicy.cpp @@ -26,14 +26,14 @@ struct DBusPolicyEntry QStringList m_capabilities; }; -static QHash> &policies() +static QHash> &policies() { - static QHash> hash; + static QHash> hash; return hash; } -bool DBusPolicy::add(QDBusAbstractAdaptor *dbusAdaptor, const QVariantMap &yamlFragment) +bool DBusPolicy::add(const QDBusAbstractAdaptor *dbusAdaptor, const QVariantMap &yamlFragment) { QMap result; const QMetaObject *mo = dbusAdaptor->metaObject(); @@ -75,7 +75,7 @@ bool DBusPolicy::add(QDBusAbstractAdaptor *dbusAdaptor, const QVariantMap &yamlF } -bool DBusPolicy::check(QDBusAbstractAdaptor *dbusAdaptor, const QByteArray &function) +bool DBusPolicy::check(const QDBusAbstractAdaptor *dbusAdaptor, const QByteArray &function) { #if !defined(Q_OS_UNIX) Q_UNUSED(dbusAdaptor) diff --git a/src/dbus-lib/dbuspolicy.h b/src/dbus-lib/dbuspolicy.h index 36041093..5c6e631c 100644 --- a/src/dbus-lib/dbuspolicy.h +++ b/src/dbus-lib/dbuspolicy.h @@ -16,8 +16,8 @@ QT_BEGIN_NAMESPACE_AM class DBusPolicy { public: - static bool add(QDBusAbstractAdaptor *dbusAdaptor, const QVariantMap &yamlFragment); - static bool check(QDBusAbstractAdaptor *dbusAdaptor, const QByteArray &function); + static bool add(const QDBusAbstractAdaptor *dbusAdaptor, const QVariantMap &yamlFragment); + static bool check(const QDBusAbstractAdaptor *dbusAdaptor, const QByteArray &function); }; QT_END_NAMESPACE_AM diff --git a/src/dbus-lib/io.qt.applicationmanager.xml b/src/dbus-lib/io.qt.applicationmanager.xml index 499500c2..ff933ce9 100644 --- a/src/dbus-lib/io.qt.applicationmanager.xml +++ b/src/dbus-lib/io.qt.applicationmanager.xml @@ -5,10 +5,14 @@ + - + + + + @@ -25,10 +29,6 @@ - - - - @@ -83,9 +83,9 @@ + - diff --git a/src/dbus-lib/io.qt.packagemanager.xml b/src/dbus-lib/io.qt.packagemanager.xml index 37e41b9d..336bdd1d 100644 --- a/src/dbus-lib/io.qt.packagemanager.xml +++ b/src/dbus-lib/io.qt.packagemanager.xml @@ -1,16 +1,33 @@ + - - - + + - + + + + + + + + + + + + + + + + + + @@ -30,6 +47,9 @@ + + + @@ -39,16 +59,27 @@ - - - - + + + + + + + + + + + + + + + @@ -88,19 +119,14 @@ - - - - - - - - + + + + - - - - + + + diff --git a/src/dbus-lib/io.qt.windowmanager.xml b/src/dbus-lib/io.qt.windowmanager.xml index fa35aef5..8f3c5843 100644 --- a/src/dbus-lib/io.qt.windowmanager.xml +++ b/src/dbus-lib/io.qt.windowmanager.xml @@ -1,8 +1,15 @@ + + + + + + + diff --git a/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp b/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp index 43937292..2f5217a6 100644 --- a/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp +++ b/src/dbus-lib/packagemanagerdbuscontextadaptor.cpp @@ -37,6 +37,16 @@ PackageManagerAdaptor::PackageManagerAdaptor(QObject *parent) { auto pm = PackageManager::instance(); + connect(pm, &PackageManager::countChanged, + this, &PackageManagerAdaptor::countChanged); + connect(pm, &PackageManager::readyChanged, + this, &PackageManagerAdaptor::readyChanged); + connect(pm, &PackageManager::packageAdded, + this, &PackageManagerAdaptor::packageAdded); + connect(pm, &PackageManager::packageChanged, + this, &PackageManagerAdaptor::packageChanged); + connect(pm, &PackageManager::packageAboutToBeRemoved, + this, &PackageManagerAdaptor::packageAboutToBeRemoved); connect(pm, &PackageManager::taskBlockingUntilInstallationAcknowledge, this, &PackageManagerAdaptor::taskBlockingUntilInstallationAcknowledge); connect(pm, &PackageManager::taskFailed, @@ -57,9 +67,9 @@ PackageManagerAdaptor::PackageManagerAdaptor(QObject *parent) connect(pm, &PackageManager::taskStarted, this, &PackageManagerAdaptor::taskStarted); connect(pm, &PackageManager::taskStateChanged, - [this](const QString &taskId, AsynchronousTask::TaskState newState) { - emit taskStateChanged(taskId, taskStateToString(newState)); - }); + this, [this](const QString &taskId, AsynchronousTask::TaskState newState) { + emit taskStateChanged(taskId, taskStateToString(newState)); + }); } PackageManagerAdaptor::~PackageManagerAdaptor() @@ -80,19 +90,29 @@ uint PackageManagerAdaptor::commonApplicationGroupId() const return PackageManager::instance()->commonApplicationGroupId(); } +int PackageManagerAdaptor::count() const +{ + return PackageManager::instance()->count(); +} + bool PackageManagerAdaptor::developmentMode() const { return PackageManager::instance()->developmentMode(); } -QDBusVariant PackageManagerAdaptor::installationLocation() const +QVariantMap PackageManagerAdaptor::installationLocation() const { - return QDBusVariant(PackageManager::instance()->installationLocation()); + return PackageManager::instance()->installationLocation(); } -QDBusVariant PackageManagerAdaptor::documentLocation() const +bool PackageManagerAdaptor::ready() const { - return QDBusVariant(PackageManager::instance()->documentLocation()); + return PackageManager::instance()->isReady(); +} + +QVariantMap PackageManagerAdaptor::documentLocation() const +{ + return PackageManager::instance()->documentLocation(); } void PackageManagerAdaptor::acknowledgePackageInstallation(const QString &taskId) @@ -179,3 +199,15 @@ QStringList PackageManagerAdaptor::activeTaskIds() AM_AUTHENTICATE_DBUS(QStringList) return PackageManager::instance()->activeTaskIds(); } + +bool PackageManagerAdaptor::validateDnsName(const QString &name) +{ + AM_AUTHENTICATE_DBUS(bool) + return PackageManager::instance()->validateDnsName(name); +} + +bool PackageManagerAdaptor::validateDnsName(const QString &name, int minimumParts) +{ + AM_AUTHENTICATE_DBUS(bool) + return PackageManager::instance()->validateDnsName(name, minimumParts); +} diff --git a/src/dbus-lib/windowmanagerdbuscontextadaptor.cpp b/src/dbus-lib/windowmanagerdbuscontextadaptor.cpp index e94a1afa..1a32329a 100644 --- a/src/dbus-lib/windowmanagerdbuscontextadaptor.cpp +++ b/src/dbus-lib/windowmanagerdbuscontextadaptor.cpp @@ -6,6 +6,7 @@ #include "windowmanagerdbuscontextadaptor.h" #include "windowmanager.h" #include "windowmanager_adaptor.h" +#include "dbuspolicy.h" QT_BEGIN_NAMESPACE_AM @@ -23,11 +24,26 @@ QT_USE_NAMESPACE_AM WindowManagerAdaptor::WindowManagerAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) -{ } +{ + connect(WindowManager::instance(), &WindowManager::countChanged, + this, &WindowManagerAdaptor::countChanged); + connect(WindowManager::instance(), &WindowManager::slowAnimationsChanged, + this, &WindowManagerAdaptor::slowAnimationsChanged); +} WindowManagerAdaptor::~WindowManagerAdaptor() { } +bool WindowManagerAdaptor::allowUnknownUiClients() const +{ + return WindowManager::instance()->allowUnknownUiClients(); +} + +int WindowManagerAdaptor::count() const +{ + return WindowManager::instance()->count(); +} + bool WindowManagerAdaptor::runningOnDesktop() const { return WindowManager::instance()->isRunningOnDesktop(); @@ -45,5 +61,6 @@ void WindowManagerAdaptor::setSlowAnimations(bool slow) bool WindowManagerAdaptor::makeScreenshot(const QString &filename, const QString &selector) { + AM_AUTHENTICATE_DBUS(bool) return WindowManager::instance()->makeScreenshot(filename, selector); } diff --git a/src/manager-lib/applicationmanager.h b/src/manager-lib/applicationmanager.h index 2c7f20a7..d535acae 100644 --- a/src/manager-lib/applicationmanager.h +++ b/src/manager-lib/applicationmanager.h @@ -44,12 +44,12 @@ class ApplicationManager : public QAbstractListModel Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(bool singleProcess READ isSingleProcess CONSTANT) - Q_PROPERTY(bool shuttingDown READ isShuttingDown NOTIFY shuttingDownChanged) + Q_PROPERTY(bool shuttingDown READ isShuttingDown NOTIFY shuttingDownChanged SCRIPTABLE false) Q_PROPERTY(bool securityChecksEnabled READ securityChecksEnabled CONSTANT) Q_PROPERTY(bool dummy READ isDummy CONSTANT) // set to false here and true in the dummydata imports Q_PROPERTY(bool windowManagerCompositorReady READ isWindowManagerCompositorReady NOTIFY windowManagerCompositorReadyChanged) Q_PROPERTY(QVariantMap systemProperties READ systemProperties CONSTANT) - Q_PROPERTY(QJSValue containerSelectionFunction READ containerSelectionFunction WRITE setContainerSelectionFunction NOTIFY containerSelectionFunctionChanged) + Q_PROPERTY(QJSValue containerSelectionFunction READ containerSelectionFunction WRITE setContainerSelectionFunction NOTIFY containerSelectionFunctionChanged SCRIPTABLE false) public: ~ApplicationManager() override; diff --git a/src/manager-lib/notificationmanager.h b/src/manager-lib/notificationmanager.h index d319d72e..a271ab51 100644 --- a/src/manager-lib/notificationmanager.h +++ b/src/manager-lib/notificationmanager.h @@ -22,7 +22,7 @@ class NotificationManager : public QAbstractListModel Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Notifications") Q_CLASSINFO("AM-QmlType", "QtApplicationManager.SystemUI/NotificationManager 2.0 SINGLETON") - Q_PROPERTY(int count READ count NOTIFY countChanged) + Q_PROPERTY(int count READ count NOTIFY countChanged SCRIPTABLE false) public: ~NotificationManager() override; @@ -35,7 +35,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override; - Q_INVOKABLE int count() const; + int count() const; Q_INVOKABLE QVariantMap get(int index) const; Q_INVOKABLE QVariantMap notification(uint id) const; Q_INVOKABLE int indexOfNotification(uint id) const; diff --git a/src/manager-lib/packagemanager.h b/src/manager-lib/packagemanager.h index f54e56e5..6598dd97 100644 --- a/src/manager-lib/packagemanager.h +++ b/src/manager-lib/packagemanager.h @@ -52,14 +52,14 @@ signals: class PackageManager : public QAbstractListModel { Q_OBJECT - Q_PROPERTY(int count READ count NOTIFY countChanged) Q_CLASSINFO("D-Bus Interface", "io.qt.PackageManager") Q_CLASSINFO("AM-QmlType", "QtApplicationManager.SystemUI/PackageManager 2.0 SINGLETON") + Q_PROPERTY(int count READ count NOTIFY countChanged) // these are const on purpose - these should never change in a running system Q_PROPERTY(bool allowInstallationOfUnsignedPackages READ allowInstallationOfUnsignedPackages CONSTANT) Q_PROPERTY(bool developmentMode READ developmentMode CONSTANT) - Q_PROPERTY(QString hardwareId READ hardwareId CONSTANT) + Q_PROPERTY(QString hardwareId READ hardwareId CONSTANT SCRIPTABLE false) Q_PROPERTY(bool ready READ isReady NOTIFY readyChanged) Q_PROPERTY(QVariantMap installationLocation READ installationLocation CONSTANT) @@ -142,7 +142,7 @@ public: Q_SCRIPTABLE void acknowledgePackageInstallation(const QString &taskId); Q_SCRIPTABLE QString removePackage(const QString &id, bool keepDocuments, bool force = false); - Q_SCRIPTABLE AsynchronousTask::TaskState taskState(const QString &taskId) const; + Q_SCRIPTABLE QT_PREPEND_NAMESPACE_AM(AsynchronousTask::TaskState) taskState(const QString &taskId) const; Q_SCRIPTABLE QString taskPackageId(const QString &taskId) const; Q_SCRIPTABLE QStringList activeTaskIds() const; Q_SCRIPTABLE bool cancelTask(const QString &taskId); @@ -169,10 +169,10 @@ signals: QT_PREPEND_NAMESPACE_AM(AsynchronousTask::TaskState) newState); // installation only - Q_SCRIPTABLE void taskRequestingInstallationAcknowledge(const QString &taskId, - QT_PREPEND_NAMESPACE_AM(Package) *package, - const QVariantMap &packageExtraMetaData, - const QVariantMap &packageExtraSignedMetaData); + void taskRequestingInstallationAcknowledge(const QString &taskId, + QT_PREPEND_NAMESPACE_AM(Package) *package, + const QVariantMap &packageExtraMetaData, + const QVariantMap &packageExtraSignedMetaData); Q_SCRIPTABLE void taskBlockingUntilInstallationAcknowledge(const QString &taskId); protected: diff --git a/src/tools/controller/controller.cpp b/src/tools/controller/controller.cpp index f915e5ec..5c2b5d8b 100644 --- a/src/tools/controller/controller.cpp +++ b/src/tools/controller/controller.cpp @@ -908,7 +908,7 @@ void listInstallationLocations() Q_DECL_NOEXCEPT_EXPR(false) { dbus.connectToPackager(); - auto installationLocation = dbus.packager()->installationLocation().variant().toMap(); + auto installationLocation = dbus.packager()->installationLocation(); if (!installationLocation.isEmpty()) fputs("internal-0\n", stdout); qApp->quit(); @@ -918,7 +918,7 @@ void showInstallationLocation(bool asJson) Q_DECL_NOEXCEPT_EXPR(false) { dbus.connectToPackager(); - auto installationLocation = dbus.packager()->installationLocation().variant().toMap(); + auto installationLocation = dbus.packager()->installationLocation(); fprintf(stdout, "%s\n", asJson ? QJsonDocument::fromVariant(installationLocation).toJson().constData() : QtYaml::yamlFromVariantDocuments({ installationLocation }).constData()); qApp->quit(); diff --git a/src/window-lib/windowmanager.h b/src/window-lib/windowmanager.h index 6755d3c2..09491baa 100644 --- a/src/window-lib/windowmanager.h +++ b/src/window-lib/windowmanager.h @@ -80,7 +80,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override; - Q_INVOKABLE int count() const; + int count() const; Q_INVOKABLE QVariantMap get(int index) const; Q_INVOKABLE QT_PREPEND_NAMESPACE_AM(Window) *window(int index) const; Q_INVOKABLE QList windowsOfApplication(const QString &id) const; @@ -93,7 +93,9 @@ protected: bool eventFilter(QObject *watched, QEvent *event) override; signals: - void countChanged(); + Q_SCRIPTABLE void countChanged(); + Q_SCRIPTABLE void slowAnimationsChanged(bool); + void raiseApplicationWindow(const QString &applicationId, const QString &applicationAliasId); void windowAdded(QT_PREPEND_NAMESPACE_AM(Window) *window); @@ -106,8 +108,6 @@ signals: void shutDownFinished(); - void slowAnimationsChanged(bool); - private slots: void inProcessSurfaceItemCreated(QSharedPointer surfaceItem); void setupWindow(QT_PREPEND_NAMESPACE_AM(Window) *window); -- cgit v1.2.1