summaryrefslogtreecommitdiffstats
path: root/src/main-lib
diff options
context:
space:
mode:
authorRobert Griebl <[email protected]>2025-07-16 17:09:42 +0200
committerRobert Griebl <[email protected]>2025-08-14 13:51:24 +0200
commit8fd101cf646d57750ec29a57b3d7d506c4c04b7c (patch)
treeefa8bb91c97f2fb850cde172cad6139a6b8cd3ee /src/main-lib
parentd7881d6ca6f33d63a8b2d844853491bbf6702a4a (diff)
dbus: do not silently ignore invalid parametersHEADdev
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.cpp39
-rw-r--r--src/main-lib/packagemanageradaptor_dbus.cpp87
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)