From 57078aec62049ac08c5df94db06c79e956fd0eeb Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Tue, 5 Jan 2021 15:58:14 +0200 Subject: Fix InstallIcons and CreateDesktopEntry operations usage as root The operations write the output files to a valid, writable directory value of XDG_DATA_HOME variable if set, otherwise defaulting to "$HOME/.local/share". This follows the XDG Base Directory Specification but misses the use case of system-wide installation: the XDG_DATA_HOME should only contain base directory relative to which user specific data files should be stored. Prefer a predefined value "/usr/local/share" when launced as root or the internal elevated admin rights handling is active. This should be a sane and well known value for applications installed system-wide, and should not conflict with files extracted by distribution's package management system. Task-number: QTIFW-2093 Change-Id: I96fab3367122e7df783697e07baeb71dfd9b3f0e Reviewed-by: Leena Miettinen Reviewed-by: Katja Marttila --- src/libs/installer/createdesktopentryoperation.cpp | 7 ++++++- src/libs/installer/installiconsoperation.cpp | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libs/installer/createdesktopentryoperation.cpp b/src/libs/installer/createdesktopentryoperation.cpp index 5907e2f21..1a56c193c 100644 --- a/src/libs/installer/createdesktopentryoperation.cpp +++ b/src/libs/installer/createdesktopentryoperation.cpp @@ -30,6 +30,8 @@ #include "errors.h" #include "fileutils.h" #include "globals.h" +#include "adminauthorization.h" +#include "remoteclient.h" #include #include @@ -60,7 +62,10 @@ QString CreateDesktopEntryOperation::absoluteFileName() .split(QLatin1Char(':'), QString::SkipEmptyParts); - XDG_DATA_HOME.push_back(QDir::home().absoluteFilePath(QLatin1String(".local/share"))); // default path + XDG_DATA_HOME.push_back(QDir::home().absoluteFilePath(QLatin1String(".local/share"))); // default user-specific path + + if (AdminAuthorization::hasAdminRights() || RemoteClient::instance().isActive()) + XDG_DATA_HOME.push_front(QLatin1String("/usr/local/share")); // default system-wide path const QStringList directories = XDG_DATA_HOME; QString directory; diff --git a/src/libs/installer/installiconsoperation.cpp b/src/libs/installer/installiconsoperation.cpp index eea83a462..9443b7f71 100644 --- a/src/libs/installer/installiconsoperation.cpp +++ b/src/libs/installer/installiconsoperation.cpp @@ -30,6 +30,8 @@ #include "fileutils.h" #include "packagemanagercore.h" #include "globals.h" +#include "adminauthorization.h" +#include "remoteclient.h" #include #include @@ -52,7 +54,10 @@ QString InstallIconsOperation::targetDirectory() QStringList XDG_DATA_HOME = QString::fromLocal8Bit(qgetenv("XDG_DATA_HOME")) .split(QLatin1Char(':'), QString::SkipEmptyParts); - XDG_DATA_HOME.push_back(QDir::home().absoluteFilePath(QLatin1String(".local/share"))); // default path + XDG_DATA_HOME.push_back(QDir::home().absoluteFilePath(QLatin1String(".local/share"))); // default user-specific path + + if (AdminAuthorization::hasAdminRights() || RemoteClient::instance().isActive()) + XDG_DATA_HOME.push_front(QLatin1String("/usr/local/share")); // default system-wide path QString directory; const QStringList& directories = XDG_DATA_HOME; -- cgit v1.2.3