File indexing completed on 2024-12-08 07:55:46

0001 // SPDX-FileCopyrightText: 2022 Jonah BrĂ¼chert <jbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2022 Harald Sitter <sitter@kde.org>
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 #include "shellcommand.h"
0006 
0007 #include <KSandbox>
0008 #include <KShell>
0009 
0010 #include <pwd.h>
0011 #include <sys/types.h>
0012 #include <unistd.h>
0013 
0014 ShellCommand::ShellCommand(QObject *parent)
0015     : QObject(parent)
0016     , m_cmd(KShell::splitArgs(command()))
0017 {
0018 }
0019 
0020 QString ShellCommand::executable() const
0021 {
0022     return m_cmd.front();
0023 }
0024 
0025 QStringList ShellCommand::args() const
0026 {
0027     return m_cmd.mid(1);
0028 }
0029 
0030 QString ShellCommand::command() const
0031 {
0032     // Signal to running processes that we can handle colors
0033     qputenv("TERM", "xterm-256color");
0034 
0035     if (KSandbox::isFlatpak()) {
0036         auto shell = []() {
0037             // From Konsole: https://github.com/KDE/konsole/blob/c450e754c789915b6dd27514a18f311ba9249981/src/profile/Profile.cpp#L177
0038             auto pw = getpwuid(getuid());
0039             // pw: Do not pass the returned pointer to free.
0040             if (pw != nullptr) {
0041                 QProcess proc;
0042                 proc.setProgram(QStringLiteral("getent"));
0043                 proc.setArguments({QStringLiteral("passwd"), QString::number(pw->pw_uid)});
0044                 KSandbox::startHostProcess(proc);
0045                 proc.waitForFinished();
0046                 return QString::fromUtf8(proc.readAllStandardOutput().simplified().split(':').at(6));
0047             } else {
0048                 return QStringLiteral("bash");
0049             }
0050         }();
0051 
0052         return QStringLiteral("host-spawn %1").arg(shell);
0053     } else {
0054         return qEnvironmentVariable("SHELL");
0055     }
0056 }