FlatpakLauncher.cpp [plain text]
#include "config.h"
#include "FlatpakLauncher.h"
#if OS(LINUX)
#include <gio/gio.h>
#include <wtf/glib/GUniquePtr.h>
namespace WebKit {
GRefPtr<GSubprocess> flatpakSpawn(GSubprocessLauncher* launcher, const WebKit::ProcessLauncher::LaunchOptions& launchOptions, char** argv, int childProcessSocket, GError** error)
{
ASSERT(launcher);
GUniquePtr<gchar> childProcessSocketArg(g_strdup_printf("--forward-fd=%d", childProcessSocket));
Vector<CString> flatpakArgs = {
"flatpak-spawn",
childProcessSocketArg.get(),
"--watch-bus"
};
if (launchOptions.processType == ProcessLauncher::ProcessType::Web) {
flatpakArgs.appendVector(Vector<CString>({
"--sandbox",
"--no-network",
"--sandbox-flag=share-gpu",
"--sandbox-flag=share-display",
"--sandbox-flag=share-sound",
"--sandbox-flag=allow-a11y",
"--sandbox-flag=allow-dbus", }));
for (const auto& pathAndPermission : launchOptions.extraWebProcessSandboxPaths) {
const char* formatString = pathAndPermission.value == SandboxPermission::ReadOnly ? "--sandbox-expose-path-ro=%s": "--sandbox-expose-path=%s";
GUniquePtr<gchar> pathArg(g_strdup_printf(formatString, pathAndPermission.key.data()));
flatpakArgs.append(pathArg.get());
}
}
char** newArgv = g_newa(char*, g_strv_length(argv) + flatpakArgs.size() + 1);
size_t i = 0;
for (const auto& arg : flatpakArgs)
newArgv[i++] = const_cast<char*>(arg.data());
for (size_t x = 0; argv[x]; x++)
newArgv[i++] = argv[x];
newArgv[i++] = nullptr;
return adoptGRef(g_subprocess_launcher_spawnv(launcher, newArgv, error));
}
};
#endif // OS(LINUX)