From c34f2e75e974dcb0933470753795aba50e50e662 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Fri, 23 Sep 2022 09:45:05 -0400 Subject: [PATCH] LibCore+LibConfig+ConfigServer: Add Config::{add,remove}_group() Plumbs synchronous calls for adding and removing group entries to config files. This is useful for services like SystemServer which default to group names for executable paths, and for removing all keys at once. --- Userland/Libraries/LibConfig/Client.cpp | 24 +++++++++++++ Userland/Libraries/LibConfig/Client.h | 14 ++++++++ Userland/Libraries/LibConfig/Listener.cpp | 8 +++++ Userland/Libraries/LibConfig/Listener.h | 2 ++ Userland/Libraries/LibCore/ConfigFile.cpp | 6 ++++ Userland/Libraries/LibCore/ConfigFile.h | 1 + .../Services/ConfigServer/ConfigClient.ipc | 2 ++ .../Services/ConfigServer/ConfigServer.ipc | 2 ++ .../ConfigServer/ConnectionFromClient.cpp | 36 +++++++++++++++++++ .../ConfigServer/ConnectionFromClient.h | 2 ++ 10 files changed, 97 insertions(+) diff --git a/Userland/Libraries/LibConfig/Client.cpp b/Userland/Libraries/LibConfig/Client.cpp index 7046300bc0a..9d026630b2c 100644 --- a/Userland/Libraries/LibConfig/Client.cpp +++ b/Userland/Libraries/LibConfig/Client.cpp @@ -75,6 +75,16 @@ void Client::remove_key(StringView domain, StringView group, StringView key) remove_key_entry(domain, group, key); } +void Client::remove_group(StringView domain, StringView group) +{ + remove_group_entry(domain, group); +} + +void Client::add_group(StringView domain, StringView group) +{ + add_group_entry(domain, group); +} + void Client::notify_changed_string_value(String const& domain, String const& group, String const& key, String const& value) { Listener::for_each([&](auto& listener) { @@ -103,4 +113,18 @@ void Client::notify_removed_key(String const& domain, String const& group, Strin }); } +void Client::notify_removed_group(String const& domain, String const& group) +{ + Listener::for_each([&](auto& listener) { + listener.config_group_was_removed(domain, group); + }); +} + +void Client::notify_added_group(String const& domain, String const& group) +{ + Listener::for_each([&](auto& listener) { + listener.config_group_was_added(domain, group); + }); +} + } diff --git a/Userland/Libraries/LibConfig/Client.h b/Userland/Libraries/LibConfig/Client.h index 406dd3a93bf..ff1c2d52075 100644 --- a/Userland/Libraries/LibConfig/Client.h +++ b/Userland/Libraries/LibConfig/Client.h @@ -35,6 +35,8 @@ public: void write_i32(StringView domain, StringView group, StringView key, i32 value); void write_bool(StringView domain, StringView group, StringView key, bool value); void remove_key(StringView domain, StringView group, StringView key); + void remove_group(StringView domain, StringView group); + void add_group(StringView domain, StringView group); static Client& the(); @@ -48,6 +50,8 @@ private: void notify_changed_i32_value(String const& domain, String const& group, String const& key, i32 value) override; void notify_changed_bool_value(String const& domain, String const& group, String const& key, bool value) override; void notify_removed_key(String const& domain, String const& group, String const& key) override; + void notify_removed_group(String const& domain, String const& group) override; + void notify_added_group(String const& domain, String const& group) override; }; inline Vector list_groups(StringView domain) @@ -95,6 +99,16 @@ inline void remove_key(StringView domain, StringView group, StringView key) Client::the().remove_key(domain, group, key); } +inline void remove_group(StringView domain, StringView group) +{ + Client::the().remove_group(domain, group); +} + +inline void add_group(StringView domain, StringView group) +{ + Client::the().add_group(domain, group); +} + inline void pledge_domains(Vector const& domains) { Client::the().pledge_domains(domains); diff --git a/Userland/Libraries/LibConfig/Listener.cpp b/Userland/Libraries/LibConfig/Listener.cpp index 31e5afc93d7..08fafeadc1b 100644 --- a/Userland/Libraries/LibConfig/Listener.cpp +++ b/Userland/Libraries/LibConfig/Listener.cpp @@ -45,4 +45,12 @@ void Listener::config_key_was_removed(String const&, String const&, String const { } +void Listener::config_group_was_removed(String const&, String const&) +{ +} + +void Listener::config_group_was_added(String const&, String const&) +{ +} + } diff --git a/Userland/Libraries/LibConfig/Listener.h b/Userland/Libraries/LibConfig/Listener.h index b59c907e412..67820d1be29 100644 --- a/Userland/Libraries/LibConfig/Listener.h +++ b/Userland/Libraries/LibConfig/Listener.h @@ -20,6 +20,8 @@ public: virtual void config_i32_did_change(String const& domain, String const& group, String const& key, i32 value); virtual void config_bool_did_change(String const& domain, String const& group, String const& key, bool value); virtual void config_key_was_removed(String const& domain, String const& group, String const& key); + virtual void config_group_was_removed(String const& domain, String const& group); + virtual void config_group_was_added(String const& domain, String const& group); protected: Listener(); diff --git a/Userland/Libraries/LibCore/ConfigFile.cpp b/Userland/Libraries/LibCore/ConfigFile.cpp index 22264d46b79..5df2fce419e 100644 --- a/Userland/Libraries/LibCore/ConfigFile.cpp +++ b/Userland/Libraries/LibCore/ConfigFile.cpp @@ -234,6 +234,12 @@ bool ConfigFile::has_group(String const& group) const return m_groups.contains(group); } +void ConfigFile::add_group(String const& group) +{ + m_groups.ensure(group); + m_dirty = true; +} + void ConfigFile::remove_group(String const& group) { m_groups.remove(group); diff --git a/Userland/Libraries/LibCore/ConfigFile.h b/Userland/Libraries/LibCore/ConfigFile.h index 9655a6eb420..044acd050b8 100644 --- a/Userland/Libraries/LibCore/ConfigFile.h +++ b/Userland/Libraries/LibCore/ConfigFile.h @@ -54,6 +54,7 @@ public: ErrorOr sync(); + void add_group(String const& group); void remove_group(String const& group); void remove_entry(String const& group, String const& key); diff --git a/Userland/Services/ConfigServer/ConfigClient.ipc b/Userland/Services/ConfigServer/ConfigClient.ipc index bd168990253..0700c1ec5a6 100644 --- a/Userland/Services/ConfigServer/ConfigClient.ipc +++ b/Userland/Services/ConfigServer/ConfigClient.ipc @@ -4,4 +4,6 @@ endpoint ConfigClient notify_changed_i32_value(String domain, String group, String key, i32 value) =| notify_changed_bool_value(String domain, String group, String key, bool value) =| notify_removed_key(String domain, String group, String key) =| + notify_removed_group(String domain, String group) =| + notify_added_group(String domain, String group) =| } diff --git a/Userland/Services/ConfigServer/ConfigServer.ipc b/Userland/Services/ConfigServer/ConfigServer.ipc index 491e24101d7..e68dd2b2eb2 100644 --- a/Userland/Services/ConfigServer/ConfigServer.ipc +++ b/Userland/Services/ConfigServer/ConfigServer.ipc @@ -15,4 +15,6 @@ endpoint ConfigServer write_i32_value(String domain, String group, String key, i32 value) => () write_bool_value(String domain, String group, String key, bool value) => () remove_key_entry(String domain, String group, String key) => () + remove_group_entry(String domain, String group) => () + add_group_entry(String domain, String group) => () } diff --git a/Userland/Services/ConfigServer/ConnectionFromClient.cpp b/Userland/Services/ConfigServer/ConnectionFromClient.cpp index 22bf2370cfb..264cd7ead19 100644 --- a/Userland/Services/ConfigServer/ConnectionFromClient.cpp +++ b/Userland/Services/ConfigServer/ConnectionFromClient.cpp @@ -267,4 +267,40 @@ void ConnectionFromClient::remove_key_entry(String const& domain, String const& }); } +void ConnectionFromClient::remove_group_entry(String const& domain, String const& group) +{ + if (!validate_access(domain, group, {})) + return; + + auto& config = ensure_domain_config(domain); + if (!config.has_group(group)) + return; + + config.remove_group(group); + m_dirty_domains.set(domain); + start_or_restart_sync_timer(); + + for_each_monitoring_connection(domain, this, [&domain, &group](ConnectionFromClient& connection) { + connection.async_notify_removed_group(domain, group); + }); +} + +void ConnectionFromClient::add_group_entry(String const& domain, String const& group) +{ + if (!validate_access(domain, group, {})) + return; + + auto& config = ensure_domain_config(domain); + if (config.has_group(group)) + return; + + config.add_group(group); + m_dirty_domains.set(domain); + start_or_restart_sync_timer(); + + for_each_monitoring_connection(domain, this, [&domain, &group](ConnectionFromClient& connection) { + connection.async_notify_added_group(domain, group); + }); +} + } diff --git a/Userland/Services/ConfigServer/ConnectionFromClient.h b/Userland/Services/ConfigServer/ConnectionFromClient.h index a5ce7e1f4a9..a5ca6a57629 100644 --- a/Userland/Services/ConfigServer/ConnectionFromClient.h +++ b/Userland/Services/ConfigServer/ConnectionFromClient.h @@ -36,6 +36,8 @@ private: virtual void write_i32_value([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key, [[maybe_unused]] i32 value) override; virtual void write_bool_value([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key, [[maybe_unused]] bool value) override; virtual void remove_key_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group, [[maybe_unused]] String const& key) override; + virtual void remove_group_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group) override; + virtual void add_group_entry([[maybe_unused]] String const& domain, [[maybe_unused]] String const& group) override; bool validate_access(String const& domain, String const& group, String const& key); void sync_dirty_domains_to_disk();