]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bus-polkit: add a generic vtable for methods with no params, but with polkit 37466/head
authorLennart Poettering <lennart@poettering.net>
Thu, 15 May 2025 07:30:37 +0000 (09:30 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 15 May 2025 07:31:27 +0000 (09:31 +0200)
src/hostname/hostnamed.c
src/resolve/resolved-varlink.c
src/shared/bus-polkit.c
src/shared/bus-polkit.h

index 5f95e52f7f87347e78dd892df5180bfc62b56dad..72467704790f9bf54e5ee31f00dc437c5cd54eb4 100644 (file)
@@ -1797,11 +1797,6 @@ static int connect_bus(Context *c) {
 }
 
 static int vl_method_describe(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
-        static const sd_json_dispatch_field dispatch_table[] = {
-                VARLINK_DISPATCH_POLKIT_FIELD,
-                {}
-        };
-
         Context *c = ASSERT_PTR(userdata);
         bool privileged;
         int r;
@@ -1809,7 +1804,7 @@ static int vl_method_describe(sd_varlink *link, sd_json_variant *parameters, sd_
         assert(link);
         assert(parameters);
 
-        r = sd_varlink_dispatch(link, parameters, dispatch_table, /* userdata= */ NULL);
+        r = sd_varlink_dispatch(link, parameters, dispatch_table_polkit_only, /* userdata= */ NULL);
         if (r != 0)
                 return r;
 
index cf9569e667914788213f5c6b403b4b74901fec85..5b534b1d937ce1fe02a9e9f0bb2292d0232bd1d3 100644 (file)
@@ -1189,17 +1189,12 @@ static int vl_method_resolve_record(sd_varlink *link, sd_json_variant *parameter
 }
 
 static int verify_polkit(sd_varlink *link, sd_json_variant *parameters, const char *action) {
-        static const sd_json_dispatch_field dispatch_table[] = {
-                VARLINK_DISPATCH_POLKIT_FIELD,
-                {}
-        };
-
         int r;
         Manager *m = ASSERT_PTR(sd_varlink_get_userdata(ASSERT_PTR(link)));
 
         assert(action);
 
-        r = sd_varlink_dispatch(link, parameters, dispatch_table, /* userdata = */ NULL);
+        r = sd_varlink_dispatch(link, parameters, dispatch_table_polkit_only, /* userdata= */ NULL);
         if (r != 0)
                 return r;
 
index 97d81e743c367fc1a9b558e83fd258e285a1c23f..99d99a5bbb778cb0bf47224c7b4133696e805af4 100644 (file)
@@ -886,3 +886,8 @@ bool varlink_has_polkit_action(sd_varlink *link, const char *action, const char
         return false;
 #endif
 }
+
+const sd_json_dispatch_field dispatch_table_polkit_only[] = {
+        VARLINK_DISPATCH_POLKIT_FIELD,
+        {}
+};
index 284583f2a1a35cba25ec0e24fffb5e46b4ae6520..7f6f21b51e616e0f5e2702c50d23ee15f5690bc0 100644 (file)
@@ -35,6 +35,10 @@ static inline int varlink_verify_polkit_async(sd_varlink *link, sd_bus *bus, con
                 .type = SD_JSON_VARIANT_BOOLEAN,                 \
         }
 
+/* A dispatch table that only accepts (but ignores) the Polkit field, and refuses everything else. This can
+ * be used wherever methods do not accept any parameters but shall be access controlled via Polkit. */
+extern const sd_json_dispatch_field dispatch_table_polkit_only[];
+
 /* Generates the right Varlink introspection field for the allowInteractiveAuthentication field above. To be used in Varlink IDL definitions. */
 #define VARLINK_DEFINE_POLKIT_INPUT                                     \
         SD_VARLINK_FIELD_COMMENT("Controls whether interactive authentication (via polkit) shall be allowed. If unspecified defaults to false."), \