Merge pull request #34651 from yuwata/polkit-transient-unit
dbus: pass transient unit name metadata to polkit
This commit is contained in:
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user