From 0fd09b2381e7d01eeb80cf811415f54174b03b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Sat, 9 Apr 2022 12:35:21 +0200 Subject: [PATCH] LibCore: Automatically create config directories if necessary If the .config directory (or its children, like lib) was deleted, ConfigFile would crash because it would try to open or create a file in a directory that didn't exist. Therefore, for user and library configs (but not system configs), ensure that the parent directories exist. This allows the user to delete the entire .config folder and all apps still work. (Except those which can't handle missing config. That's a separate issue though.) Fixes #13555 Note: Some changes to pledges and unveils are necessary for this to work. The only one who can recreate .config at the moment is ConfigServer, as others probably don't pledge the user home directory. --- Userland/Libraries/LibCore/ConfigFile.cpp | 11 ++++++++--- Userland/Libraries/LibCore/ConfigFile.h | 1 + Userland/Services/ConfigServer/main.cpp | 1 + Userland/Services/KeyboardPreferenceLoader/main.cpp | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibCore/ConfigFile.cpp b/Userland/Libraries/LibCore/ConfigFile.cpp index 5e494c8213..bab469e747 100644 --- a/Userland/Libraries/LibCore/ConfigFile.cpp +++ b/Userland/Libraries/LibCore/ConfigFile.cpp @@ -6,23 +6,28 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include +#include #include +#include #include +#include namespace Core { ErrorOr> ConfigFile::open_for_lib(String const& lib_name, AllowWriting allow_altering) { - String directory = StandardPaths::config_directory(); - auto path = String::formatted("{}/lib/{}.ini", directory, lib_name); + String directory_name = String::formatted("{}/lib", StandardPaths::config_directory()); + auto directory = TRY(Directory::create(directory_name, Directory::CreateDirectories::Yes)); + auto path = String::formatted("{}/{}.ini", directory, lib_name); return ConfigFile::open(path, allow_altering); } ErrorOr> ConfigFile::open_for_app(String const& app_name, AllowWriting allow_altering) { - String directory = StandardPaths::config_directory(); + auto directory = TRY(Directory::create(StandardPaths::config_directory(), Directory::CreateDirectories::Yes)); auto path = String::formatted("{}/{}.ini", directory, app_name); return ConfigFile::open(path, allow_altering); } diff --git a/Userland/Libraries/LibCore/ConfigFile.h b/Userland/Libraries/LibCore/ConfigFile.h index 8e64d97b39..efb577376e 100644 --- a/Userland/Libraries/LibCore/ConfigFile.h +++ b/Userland/Libraries/LibCore/ConfigFile.h @@ -8,6 +8,7 @@ #pragma once +#include #include #include #include diff --git a/Userland/Services/ConfigServer/main.cpp b/Userland/Services/ConfigServer/main.cpp index da08477e1c..1cb55d4e2b 100644 --- a/Userland/Services/ConfigServer/main.cpp +++ b/Userland/Services/ConfigServer/main.cpp @@ -14,6 +14,7 @@ ErrorOr serenity_main(Main::Arguments) { TRY(Core::System::pledge("stdio accept rpath wpath cpath")); TRY(Core::System::unveil(Core::StandardPaths::config_directory(), "rwc")); + TRY(Core::System::unveil(Core::StandardPaths::home_directory(), "rwc")); TRY(Core::System::unveil(nullptr, nullptr)); Core::EventLoop event_loop; diff --git a/Userland/Services/KeyboardPreferenceLoader/main.cpp b/Userland/Services/KeyboardPreferenceLoader/main.cpp index 247421e782..7cc995c950 100644 --- a/Userland/Services/KeyboardPreferenceLoader/main.cpp +++ b/Userland/Services/KeyboardPreferenceLoader/main.cpp @@ -16,7 +16,7 @@ ErrorOr serenity_main(Main::Arguments) { - TRY(Core::System::pledge("stdio proc exec rpath")); + TRY(Core::System::pledge("stdio proc exec rpath cpath")); auto keyboard_settings_config = TRY(Core::ConfigFile::open_for_app("KeyboardSettings")); TRY(Core::System::unveil("/bin/keymap", "x"));