KCoreAddons

ksandbox.cpp
1 // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
2 // SPDX-FileCopyrightText: 2022 Harald Sitter <[email protected]>
3 
4 #include "ksandbox.h"
5 
6 #include <QDebug>
7 #include <QFileInfo>
8 
9 #include <kcoreaddons_debug.h>
10 
12 {
13  static const bool isInside = isFlatpak() || isSnap();
14  return isInside;
15 }
16 
18 {
19  static const bool isFlatpak = QFileInfo::exists(QStringLiteral("/.flatpak-info"));
20  return isFlatpak;
21 }
22 
24 {
25  static const bool isSnap = qEnvironmentVariableIsSet("SNAP");
26  return isSnap;
27 }
28 
29 bool checkHasFlatpakSpawnPrivileges()
30 {
31  QFile f(QStringLiteral("/.flatpak-info"));
32  if (!f.open(QIODevice::ReadOnly)) {
33  return false;
34  }
35 
36  return f.readAll().contains("\norg.freedesktop.Flatpak=talk\n");
37 }
38 
40 {
41  if (!KSandbox::isFlatpak()) {
42  return {process.program(), process.arguments()};
43  }
44 
45  static const bool hasFlatpakSpawnPrivileges = checkHasFlatpakSpawnPrivileges();
46  if (!hasFlatpakSpawnPrivileges) {
47  qCWarning(KCOREADDONS_DEBUG) << "Process execution expects 'org.freedesktop.Flatpak=talk'" << process.program();
48  return {process.program(), process.arguments()};
49  }
50 
51  QStringList args{QStringLiteral("--watch-bus"), QStringLiteral("--host"), QStringLiteral("--forward-fd=1"), QStringLiteral("--forward-fd=2")};
52  if (!process.workingDirectory().isEmpty()) {
53  args << QStringLiteral("--directory=%1").arg(process.workingDirectory());
54  }
55  const auto systemEnvironment = QProcessEnvironment::systemEnvironment().toStringList();
56  const auto processEnvironment = process.processEnvironment().toStringList();
57  for (const auto &variable : processEnvironment) {
58  if (systemEnvironment.contains(variable)) {
59  continue;
60  }
61  args << QStringLiteral("--env=%1").arg(variable);
62  }
63  if (!process.program().isEmpty()) { // some callers are cheeky and pass no program but put it into the arguments (e.g. konsole)
64  args << process.program();
65  }
66  args += process.arguments();
67  return {QStringLiteral("/usr/bin/flatpak-spawn"), args};
68 }
69 
70 KCOREADDONS_EXPORT void KSandbox::startHostProcess(QProcess &process, QProcess::OpenMode mode)
71 {
72  const auto context = makeHostContext(process);
73  process.start(context.program, context.arguments, mode);
74 }
void start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode)
KCOREADDONS_EXPORT bool isSnap()
Definition: ksandbox.cpp:23
Container for host process startup context.
Definition: ksandbox.h:31
QProcessEnvironment systemEnvironment()
bool exists() const const
QString workingDirectory() const const
KCOREADDONS_EXPORT void startHostProcess(QProcess &process, QProcess::OpenMode mode=QProcess::ReadWrite)
Starts the QProcess on the host (if the current context is inside a sandbox, otherwise it simply runs...
Definition: ksandbox.cpp:70
QProcessEnvironment processEnvironment() const const
bool isEmpty() const const
QStringList toStringList() const const
QStringList arguments() const const
KCOREADDONS_EXPORT bool isFlatpak()
Definition: ksandbox.cpp:17
KCOREADDONS_EXPORT KSandbox::ProcessContext makeHostContext(const QProcess &process)
Definition: ksandbox.cpp:39
QString program() const const
KCOREADDONS_EXPORT bool isInside()
Definition: ksandbox.cpp:11
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Mar 26 2023 04:10:49 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.