Better and more secure argument parsing, and code reformatting (#1976)

* Better and more secure argument parsing, and code reformatting

* Changes to resolve PR conversation

* Formatted via clang-format, fixed typos

* More typos
This commit is contained in:
Andrew Nitrogenesis 2023-04-07 17:03:26 +03:00 committed by GitHub
parent d8645cd148
commit a35ea4d242
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3,11 +3,26 @@
#include "Compositor.hpp" #include "Compositor.hpp"
#include "config/ConfigManager.hpp" #include "config/ConfigManager.hpp"
#include "init/initHelpers.hpp" #include "init/initHelpers.hpp"
#include <iostream> #include <iostream>
#include <iterator>
#include <vector>
#include <stdexcept>
#include <string>
#include <filesystem>
#ifdef USES_SYSTEMD #ifdef USES_SYSTEMD
#include <systemd/sd-daemon.h> // for sd_notify #include <systemd/sd-daemon.h> // for sd_notify
#endif #endif
void help() {
std::cout << "usage: Hyprland [arg [...]].\n";
std::cout << "\nArguments:\n";
std::cout << " --help -h - Show this message again\n";
std::cout << " --config FILE -c FILE - Specify config file to use\n";
std::cout << " --i-am-really-stupid - Omits root user privileges check (why would you do that?)\n";
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
if (!getenv("XDG_RUNTIME_DIR")) if (!getenv("XDG_RUNTIME_DIR"))
@ -17,6 +32,7 @@ int main(int argc, char** argv) {
std::string cmd = ""; std::string cmd = "";
for (auto i = 0; i < argc; ++i) for (auto i = 0; i < argc; ++i)
cmd += std::string(i == 0 ? "" : " ") + argv[i]; cmd += std::string(i == 0 ? "" : " ") + argv[i];
setenv("HYPRLAND_CMD", cmd.c_str(), 1); setenv("HYPRLAND_CMD", cmd.c_str(), 1);
setenv("XDG_BACKEND", "wayland", 1); setenv("XDG_BACKEND", "wayland", 1);
setenv("_JAVA_AWT_WM_NONREPARENTING", "1", 1); setenv("_JAVA_AWT_WM_NONREPARENTING", "1", 1);
@ -26,28 +42,43 @@ int main(int argc, char** argv) {
// parse some args // parse some args
std::string configPath; std::string configPath;
bool ignoreSudo = false; bool ignoreSudo = false;
for (int i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "--i-am-really-stupid")) std::vector<std::string> args{argv + 1, argv + argc};
for (auto it = args.begin(); it != args.end(); it++) {
if (it->compare("--i-am-really-stupid") == 0 && !ignoreSudo) {
std::cout << "[ WARNING ] Running Hyprland with superuser privileges might damage your system\n";
ignoreSudo = true; ignoreSudo = true;
else if ((!strcmp(argv[i], "-c") || !strcmp(argv[i], "--config")) && argc >= i + 2) { }
configPath = std::string(argv[++i]);
Debug::log(LOG, "Using config location %s.", configPath.c_str()); else if (it->compare("-c") == 0 || it->compare("--config") == 0) {
} else { if (std::next(it)->c_str() == nullptr) {
std::cout << "Hyprland usage: Hyprland [arg [...]].\n\nArguments:\n" help();
<< "--help -h | Show this help message\n"
<< "--config -c | Specify config file to use\n";
return 1; return 1;
} }
std::string next_arg = std::next(it)->c_str();
if (!std::filesystem::exists(next_arg)) {
std::cerr << "[ ERROR ] Config path '" << next_arg << "' doesn't exist!\n";
help();
return 1;
}
configPath = next_arg;
Debug::log(LOG, "User-specified config location: '%s'", configPath.c_str());
continue;
}
} }
if (!ignoreSudo) { if (!ignoreSudo && Init::isSudo()) {
if (Init::isSudo()) { std::cerr << "[ ERROR ] Hyprland was launched with superuser priveleges, but the privileges check is not omitted.\n";
std::cout << "Hyprland shall not be run as the root user. If you really want to, use the --i-am-really-stupid flag.\n"; std::cerr << " Hint: Use the --i-am-really-stupid flag to omit that check.\n";
return 1; return 1;
} } else if (ignoreSudo && Init::isSudo()) {
} else { std::cout << "Superuser privileges check is omitted. I hope you know what you're doing.\n";
std::cout << "Running with ignored root checks, I surely hope you know what you're doing.\n";
sleep(1);
} }
std::cout << "Welcome to Hyprland!\n"; std::cout << "Welcome to Hyprland!\n";