diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 3a36dc7a16..e1f5df296e 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -22,6 +22,7 @@ #include "dbus-scope.h" #include "dbus-service.h" #include "dbus-unit.h" +#include "dbus-util.h" #include "dbus.h" #include "env-util.h" #include "fd-util.h" @@ -29,6 +30,7 @@ #include "format-util.h" #include "initrd-util.h" #include "install.h" +#include "locale-util.h" #include "log.h" #include "manager-dump.h" #include "os-util.h" @@ -1082,7 +1084,13 @@ static int method_start_transient_unit(sd_bus_message *message, void *userdata, if (mode < 0) return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Job mode %s is invalid.", smode); - r = bus_verify_manage_units_async(m, message, error); + r = bus_verify_manage_units_async_impl( + m, + name, + "start", + N_("Authentication is required to start transient '$(unit)'."), + message, + error); if (r < 0) return r; if (r == 0) diff --git a/src/core/dbus-util.c b/src/core/dbus-util.c index b871d89368..b44afc4258 100644 --- a/src/core/dbus-util.c +++ b/src/core/dbus-util.c @@ -150,30 +150,92 @@ int bus_set_transient_usec_internal( return 1; } -int bus_verify_manage_units_async_full( - Unit *u, +int bus_verify_manage_units_async_impl( + Manager *manager, + const char *id, const char *verb, const char *polkit_message, sd_bus_message *call, sd_bus_error *error) { - const char *details[9] = { - "unit", u->id, - "verb", verb, + const char *details[9]; + size_t n_details = 0; + + assert(manager); + assert(call); + + if (id) { + details[n_details++] = "unit"; + details[n_details++] = id; + } + + if (verb) { + details[n_details++] = "verb"; + details[n_details++] = verb; }; if (polkit_message) { - details[4] = "polkit.message"; - details[5] = polkit_message; - details[6] = "polkit.gettext_domain"; - details[7] = GETTEXT_PACKAGE; + details[n_details++] = "polkit.message"; + details[n_details++] = polkit_message; + details[n_details++] = "polkit.gettext_domain"; + details[n_details++] = GETTEXT_PACKAGE; } + assert(n_details < ELEMENTSOF(details)); + details[n_details] = NULL; + return bus_verify_polkit_async( call, "org.freedesktop.systemd1.manage-units", - details, - &u->manager->polkit_registry, + n_details > 0 ? details : NULL, + &manager->polkit_registry, + error); +} + +int bus_verify_manage_unit_files_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { + assert(m); + assert(call); + + return bus_verify_polkit_async( + call, + "org.freedesktop.systemd1.manage-unit-files", + /* details= */ NULL, + &m->polkit_registry, + error); +} + +int bus_verify_reload_daemon_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { + assert(m); + assert(call); + + return bus_verify_polkit_async( + call, + "org.freedesktop.systemd1.reload-daemon", + /* details= */ NULL, + &m->polkit_registry, error); +} + +int bus_verify_set_environment_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { + assert(m); + assert(call); + + return bus_verify_polkit_async( + call, + "org.freedesktop.systemd1.set-environment", + /* details= */ NULL, + &m->polkit_registry, + error); +} + +int bus_verify_bypass_dump_ratelimit_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { + assert(m); + assert(call); + + return bus_verify_polkit_async( + call, + "org.freedesktop.systemd1.bypass-dump-ratelimit", + /* details= */ NULL, + &m->polkit_registry, error); } diff --git a/src/core/dbus-util.h b/src/core/dbus-util.h index 0fc3a94961..471c64acb6 100644 --- a/src/core/dbus-util.h +++ b/src/core/dbus-util.h @@ -250,7 +250,19 @@ static inline int bus_set_transient_usec(Unit *u, const char *name, usec_t *p, s static inline int bus_set_transient_usec_fix_0(Unit *u, const char *name, usec_t *p, sd_bus_message *message, UnitWriteFlags flags, sd_bus_error *error) { return bus_set_transient_usec_internal(u, name, p, true, message, flags, error); } -int bus_verify_manage_units_async_full(Unit *u, const char *verb, const char *polkit_message, sd_bus_message *call, sd_bus_error *error); + +int bus_verify_manage_units_async_impl(Manager *manager, const char *id, const char *verb, const char *polkit_message, sd_bus_message *call, sd_bus_error *error); +static inline int bus_verify_manage_units_async_full(Unit *u, const char *verb, const char *polkit_message, sd_bus_message *call, sd_bus_error *error) { + assert(u); + return bus_verify_manage_units_async_impl(u->manager, u->id, verb, polkit_message, call, error); +} +static inline int bus_verify_manage_units_async(Manager *manager, sd_bus_message *call, sd_bus_error *error) { + return bus_verify_manage_units_async_impl(manager, NULL, NULL, NULL, call, error); +} +int bus_verify_manage_unit_files_async(Manager *m, sd_bus_message *call, sd_bus_error *error); +int bus_verify_reload_daemon_async(Manager *m, sd_bus_message *call, sd_bus_error *error); +int bus_verify_set_environment_async(Manager *m, sd_bus_message *call, sd_bus_error *error); +int bus_verify_bypass_dump_ratelimit_async(Manager *m, sd_bus_message *call, sd_bus_error *error); int bus_read_mount_options(sd_bus_message *message, sd_bus_error *error, MountOptions **ret_options, char **ret_format_str, const char *separator); diff --git a/src/core/dbus.c b/src/core/dbus.c index b6480937ee..2692dde151 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -1172,49 +1172,6 @@ int bus_track_coldplug(Manager *m, sd_bus_track **t, bool recursive, char **l) { return bus_track_add_name_many(*t, l); } -int bus_verify_manage_units_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { - return bus_verify_polkit_async( - call, - "org.freedesktop.systemd1.manage-units", - /* details= */ NULL, - &m->polkit_registry, - error); -} - -int bus_verify_manage_unit_files_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { - return bus_verify_polkit_async( - call, - "org.freedesktop.systemd1.manage-unit-files", - /* details= */ NULL, - &m->polkit_registry, - error); -} - -int bus_verify_reload_daemon_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { - return bus_verify_polkit_async( - call, - "org.freedesktop.systemd1.reload-daemon", - /* details= */ NULL, - &m->polkit_registry, error); -} - -int bus_verify_set_environment_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { - return bus_verify_polkit_async( - call, - "org.freedesktop.systemd1.set-environment", - /* details= */ NULL, - &m->polkit_registry, - error); -} -int bus_verify_bypass_dump_ratelimit_async(Manager *m, sd_bus_message *call, sd_bus_error *error) { - return bus_verify_polkit_async( - call, - "org.freedesktop.systemd1.bypass-dump-ratelimit", - /* details= */ NULL, - &m->polkit_registry, - error); -} - uint64_t manager_bus_n_queued_write(Manager *m) { uint64_t c = 0; sd_bus *b; diff --git a/src/core/dbus.h b/src/core/dbus.h index ae75404076..d00c14d3b7 100644 --- a/src/core/dbus.h +++ b/src/core/dbus.h @@ -23,12 +23,6 @@ int bus_track_coldplug(Manager *m, sd_bus_track **t, bool recursive, char **l); int bus_foreach_bus(Manager *m, sd_bus_track *subscribed2, int (*send_message)(sd_bus *bus, void *userdata), void *userdata); -int bus_verify_manage_units_async(Manager *m, sd_bus_message *call, sd_bus_error *error); -int bus_verify_manage_unit_files_async(Manager *m, sd_bus_message *call, sd_bus_error *error); -int bus_verify_reload_daemon_async(Manager *m, sd_bus_message *call, sd_bus_error *error); -int bus_verify_set_environment_async(Manager *m, sd_bus_message *call, sd_bus_error *error); -int bus_verify_bypass_dump_ratelimit_async(Manager *m, sd_bus_message *call, sd_bus_error *error); - int bus_forward_agent_released(Manager *m, const char *path); uint64_t manager_bus_n_queued_write(Manager *m);