/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2022, Undefine * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include ErrorOr serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio rpath tty exec id")); if (!TRY(Core::System::isatty(STDIN_FILENO))) return Error::from_string_literal("Standard input is not a terminal"); char const* user = nullptr; Core::ArgsParser args_parser; args_parser.add_positional_argument(user, "User to switch to (defaults to user with UID 0)", "user", Core::ArgsParser::Required::No); args_parser.parse(arguments); if (geteuid() != 0) return Error::from_string_literal("Not running as root :("); auto account = TRY(user ? Core::Account::from_name(user) : Core::Account::from_uid(0)); TRY(Core::System::pledge("stdio tty exec id")); if (getuid() != 0 && account.has_password()) { auto password = TRY(Core::get_password()); if (!account.authenticate(password)) return Error::from_string_literal("Incorrect or disabled password."); } TRY(Core::System::pledge("stdio exec id")); if (!account.login()) { perror("Core::Account::login"); return 1; } TRY(Core::System::pledge("stdio exec")); TRY(Core::System::setenv("HOME"sv, account.home_directory(), true)); execl(account.shell().characters(), account.shell().characters(), nullptr); perror("execl"); return 1; }