diff options
author | Robert Griebl <[email protected]> | 2025-07-16 17:09:42 +0200 |
---|---|---|
committer | Robert Griebl <[email protected]> | 2025-08-14 13:51:24 +0200 |
commit | 8fd101cf646d57750ec29a57b3d7d506c4c04b7c (patch) | |
tree | efa8bb91c97f2fb850cde172cad6139a6b8cd3ee /src/main-lib | |
parent | d7881d6ca6f33d63a8b2d844853491bbf6702a4a (diff) |
Requesting to stop an application with an unknown id would just result
in the appman-controller exiting with code '0', instead of complaining.
This patch fixes all those cases, where an invalid id parameter or even
a missing installer sub-system would silently be accepted on a DBus
call.
Change-Id: I1ffc8cec970a79c23fde82c7523b2a69519a5583
Pick-to: 6.10
Reviewed-by: Dominik Holland <[email protected]>
Diffstat (limited to 'src/main-lib')
-rw-r--r-- | src/main-lib/applicationmanageradaptor_dbus.cpp | 39 | ||||
-rw-r--r-- | src/main-lib/packagemanageradaptor_dbus.cpp | 87 |
2 files changed, 99 insertions, 27 deletions
diff --git a/src/main-lib/applicationmanageradaptor_dbus.cpp b/src/main-lib/applicationmanageradaptor_dbus.cpp index 5802a89c..15de90f8 100644 --- a/src/main-lib/applicationmanageradaptor_dbus.cpp +++ b/src/main-lib/applicationmanageradaptor_dbus.cpp @@ -25,6 +25,14 @@ using namespace Qt::StringLiterals; QT_USE_NAMESPACE_AM +static bool checkApplicationId(ApplicationManagerAdaptor *a, const QString &id) +{ + if (ApplicationManager::instance()->application(id)) + return true; + DBusContextAdaptor::sendErrorReply(a, u"Unknown application id '%1'"_s.arg(id)); + return false; +} + ApplicationManagerAdaptor::ApplicationManagerAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { @@ -92,13 +100,19 @@ QStringList ApplicationManagerAdaptor::applicationIds() uint ApplicationManagerAdaptor::applicationRunState(const QString &id) { QT_AM_AUTHENTICATE_DBUS(uint) - return ApplicationManager::instance()->applicationRunState(id); + if (checkApplicationId(this, id)) + return ApplicationManager::instance()->applicationRunState(id); + else + return { }; } QStringList ApplicationManagerAdaptor::capabilities(const QString &id) { QT_AM_AUTHENTICATE_DBUS(QStringList) - return ApplicationManager::instance()->capabilities(id); + if (checkApplicationId(this, id)) + return ApplicationManager::instance()->capabilities(id); + else + return { }; } bool ApplicationManagerAdaptor::debugApplication(const QString &id, const QString &debugWrapper) @@ -139,8 +153,7 @@ bool ApplicationManagerAdaptor::debugApplication(const QString &id, const QStrin std::move(stdioRedirections)); } catch (const Exception &e) { qCWarning(LogSystem) << e.what(); - if (auto *ctxt = DBusContextAdaptor::dbusContextFor(this)) - ctxt->sendErrorReply(QDBusError::Failed, e.errorString()); + DBusContextAdaptor::sendErrorReply(this, e.errorString()); return false; } } @@ -148,10 +161,14 @@ bool ApplicationManagerAdaptor::debugApplication(const QString &id, const QStrin QVariantMap ApplicationManagerAdaptor::get(const QString &id) { QT_AM_AUTHENTICATE_DBUS(QVariantMap) - auto map = ApplicationManager::instance()->get(id); - map.remove(u"application"_s); // cannot marshall QObject * - map.remove(u"applicationObject"_s); // cannot marshall QObject * - return convertToDBusVariant(map).toMap(); + if (checkApplicationId(this, id)) { + auto map = ApplicationManager::instance()->get(id); + map.remove(u"application"_s); // cannot marshall QObject * + map.remove(u"applicationObject"_s); // cannot marshall QObject * + return convertToDBusVariant(map).toMap(); + } else { + return { }; + } } QString ApplicationManagerAdaptor::identifyApplication(qlonglong pid) @@ -210,8 +227,7 @@ bool ApplicationManagerAdaptor::startApplication(const QString &id, const QtAM:: std::move(stdioRedirections)); } catch (const Exception &e) { qCWarning(LogSystem) << e.what(); - if (auto *ctxt = DBusContextAdaptor::dbusContextFor(this)) - ctxt->sendErrorReply(QDBusError::Failed, e.errorString()); + DBusContextAdaptor::sendErrorReply(this, e.errorString()); return false; } } @@ -235,7 +251,8 @@ void ApplicationManagerAdaptor::stopApplication(const QString &id) void ApplicationManagerAdaptor::stopApplication(const QString &id, bool forceKill) { QT_AM_AUTHENTICATE_DBUS(void) - ApplicationManager::instance()->stopApplication(id, forceKill); + if (checkApplicationId(this, id)) + ApplicationManager::instance()->stopApplication(id, forceKill); } QString ApplicationManagerAdaptor::sendIntentRequestAs(const QString &requestingApplicationId, diff --git a/src/main-lib/packagemanageradaptor_dbus.cpp b/src/main-lib/packagemanageradaptor_dbus.cpp index 7ed62f6c..e39a837d 100644 --- a/src/main-lib/packagemanageradaptor_dbus.cpp +++ b/src/main-lib/packagemanageradaptor_dbus.cpp @@ -20,6 +20,22 @@ using namespace Qt::StringLiterals; QT_USE_NAMESPACE_AM +static bool checkPackageId(PackageManagerAdaptor *a, const QString &id) +{ + if (PackageManager::instance()->package(id)) + return true; + DBusContextAdaptor::sendErrorReply(a, u"Unknown package id '%1'"_s.arg(id)); + return false; +} + +static bool checkInstaller(PackageManagerAdaptor *a) +{ + if (PackageManager::instance()->installationEnabled()) + return true; + DBusContextAdaptor::sendErrorReply(a, u"The application-manager was compiled without the installer part"_s); + return false; +} + static QString taskStateToString(AsynchronousTask::TaskState state) { const char *cstr = QMetaEnum::fromType<AsynchronousTask::TaskState>().valueToKey(state); @@ -84,6 +100,11 @@ PackageManagerAdaptor::PackageManagerAdaptor(QObject *parent) PackageManagerAdaptor::~PackageManagerAdaptor() { } +bool PackageManagerAdaptor::installationEnabled() const +{ + return PackageManager::instance()->installationEnabled(); +} + bool PackageManagerAdaptor::allowInstallationOfUnsignedPackages() const { return PackageManager::instance()->allowInstallationOfUnsignedPackages(); @@ -127,13 +148,17 @@ QVariantMap PackageManagerAdaptor::documentLocation() const void PackageManagerAdaptor::acknowledgePackageInstallation(const QString &taskId) { QT_AM_AUTHENTICATE_DBUS(void) - PackageManager::instance()->acknowledgePackageInstallation(taskId); + if (checkInstaller(this)) + PackageManager::instance()->acknowledgePackageInstallation(taskId); } bool PackageManagerAdaptor::cancelTask(const QString &taskId) { QT_AM_AUTHENTICATE_DBUS(bool) - return PackageManager::instance()->cancelTask(taskId); + if (checkInstaller(this)) + return PackageManager::instance()->cancelTask(taskId); + else + return { }; } int PackageManagerAdaptor::compareVersions(const QString &version1, const QString &version2) @@ -151,30 +176,45 @@ QStringList PackageManagerAdaptor::packageIds() QVariantMap PackageManagerAdaptor::get(const QString &id) { QT_AM_AUTHENTICATE_DBUS(QVariantMap) - auto map = PackageManager::instance()->get(id); - map.remove(u"package"_s); // cannot marshall QObject * - map.remove(u"packageObject"_s); // cannot marshall QObject * - return convertToDBusVariant(map).toMap(); + if (checkPackageId(this, id)) { + auto map = PackageManager::instance()->get(id); + map.remove(u"package"_s); // cannot marshall QObject * + map.remove(u"packageObject"_s); // cannot marshall QObject * + return convertToDBusVariant(map).toMap(); + } else { + return { }; + } } qlonglong PackageManagerAdaptor::installedPackageSize(const QString &packageId) { QT_AM_AUTHENTICATE_DBUS(qlonglong) - return PackageManager::instance()->installedPackageSize(packageId); + if (checkInstaller(this) && checkPackageId(this, packageId)) + return PackageManager::instance()->installedPackageSize(packageId); + else + return { }; } QVariantMap PackageManagerAdaptor::installedPackageExtraMetaData(const QString &packageId) { QT_AM_AUTHENTICATE_DBUS(QVariantMap) - const auto map = PackageManager::instance()->installedPackageExtraMetaData(packageId); - return convertToDBusVariant(map).toMap(); + if (checkInstaller(this) && checkPackageId(this, packageId)) { + const auto map = PackageManager::instance()->installedPackageExtraMetaData(packageId); + return convertToDBusVariant(map).toMap(); + } else { + return { }; + } } QVariantMap PackageManagerAdaptor::installedPackageExtraSignedMetaData(const QString &packageId) { QT_AM_AUTHENTICATE_DBUS(QVariantMap) - const auto map = PackageManager::instance()->installedPackageExtraSignedMetaData(packageId); - return convertToDBusVariant(map).toMap(); + if (checkInstaller(this) && checkPackageId(this, packageId)) { + const auto map = PackageManager::instance()->installedPackageExtraSignedMetaData(packageId); + return convertToDBusVariant(map).toMap(); + } else { + return { }; + } } QString PackageManagerAdaptor::removePackage(const QString &packageId, bool keepDocuments) @@ -185,31 +225,46 @@ QString PackageManagerAdaptor::removePackage(const QString &packageId, bool keep QString PackageManagerAdaptor::removePackage(const QString &packageId, bool keepDocuments, bool force) { QT_AM_AUTHENTICATE_DBUS(QString) - return PackageManager::instance()->removePackage(packageId, keepDocuments, force); + if (checkInstaller(this) && checkPackageId(this, packageId)) + return PackageManager::instance()->removePackage(packageId, keepDocuments, force); + else + return { }; } QString PackageManagerAdaptor::startPackageInstallation(const QString &sourceUrl) { QT_AM_AUTHENTICATE_DBUS(QString) - return PackageManager::instance()->startPackageInstallation(sourceUrl); + if (checkInstaller(this)) + return PackageManager::instance()->startPackageInstallation(sourceUrl); + else + return { }; } QString PackageManagerAdaptor::taskState(const QString &taskId) { QT_AM_AUTHENTICATE_DBUS(QString) - return taskStateToString(PackageManager::instance()->taskState(taskId)); + if (checkInstaller(this)) + return taskStateToString(PackageManager::instance()->taskState(taskId)); + else + return { }; } QString PackageManagerAdaptor::taskPackageId(const QString &taskId) { QT_AM_AUTHENTICATE_DBUS(QString) - return PackageManager::instance()->taskPackageId(taskId); + if (checkInstaller(this)) + return PackageManager::instance()->taskPackageId(taskId); + else + return { }; } QStringList PackageManagerAdaptor::activeTaskIds() { QT_AM_AUTHENTICATE_DBUS(QStringList) - return PackageManager::instance()->activeTaskIds(); + if (checkInstaller(this)) + return PackageManager::instance()->activeTaskIds(); + else + return { }; } bool PackageManagerAdaptor::validateDnsName(const QString &name) |