Merge pull request #34651 from yuwata/polkit-transient-unit

dbus: pass transient unit name metadata to polkit
This commit is contained in:
Lennart Poettering
2024-10-09 10:35:19 +02:00
committed by GitHub
5 changed files with 95 additions and 62 deletions
+9 -1
View File
@@ -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)
+73 -11
View File
@@ -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);
}
+13 -1
View File
@@ -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);
-43
View File
@@ -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;
-6
View File
@@ -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);