X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fbus-driverd%2Fbus-driverd.c;h=8dd3418f01ddbdd5be24f3844144cddfc58290ea;hb=050eb34da8bfe26ecdbda072ce945210279a9753;hp=46ee3492bade04611a22666a4e1b427410d3ecc3;hpb=37224a5ff522a366b353e8a01e2c2eee1e5416e5;p=elogind.git diff --git a/src/bus-driverd/bus-driverd.c b/src/bus-driverd/bus-driverd.c index 46ee3492b..8dd3418f0 100644 --- a/src/bus-driverd/bus-driverd.c +++ b/src/bus-driverd/bus-driverd.c @@ -364,19 +364,42 @@ finish: return r; } -static int driver_get_security_ctx(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { - _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; - _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; - char *arg0; +static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) { + _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL; + const char *name; int r; - r = sd_bus_message_read(m, "s", &arg0); + assert(bus); + assert(m); + assert(_creds); + + r = sd_bus_message_read(m, "s", &name); if (r < 0) return r; - assert_return(service_name_is_valid(arg0), -EINVAL); + assert_return(service_name_is_valid(name), -EINVAL); - r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_SELINUX_CONTEXT, &creds); + r = sd_bus_get_owner(bus, name, mask, &c); + if (r == -ENOENT || r == -ENXIO) + return sd_bus_error_setf(error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Name %s is currently not owned by anyone.", name); + if (r < 0) + return r; + + if ((c->mask & mask) != mask) + return -ENOTSUP; + + *_creds = c; + c = NULL; + + return 0; +} + +static int driver_get_security_context(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { + _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + int r; + + r = get_creds(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error); if (r < 0) return r; @@ -393,38 +416,35 @@ static int driver_get_security_ctx(sd_bus *bus, sd_bus_message *m, void *userdat static int driver_get_pid(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; - char *arg0; int r; - r = sd_bus_message_read(m, "s", &arg0); - if (r < 0) - return r; - - assert_return(service_name_is_valid(arg0), -EINVAL); - - r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_PID, &creds); + r = get_creds(bus, m, SD_BUS_CREDS_PID, &creds, error); if (r < 0) return r; - return sd_bus_reply_method_return(m, "u", creds->pid); + return sd_bus_reply_method_return(m, "u", (uint32_t) creds->pid); } static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; - char *arg0; int r; - r = sd_bus_message_read(m, "s", &arg0); + r = get_creds(bus, m, SD_BUS_CREDS_UID, &creds, error); if (r < 0) return r; - assert_return(service_name_is_valid(arg0), -EINVAL); + return sd_bus_reply_method_return(m, "u", (uint32_t) creds->uid); +} + +static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { + _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; + int r; - r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_UID, &creds); + r = get_creds(bus, m, SD_BUS_CREDS_UNIQUE_NAME, &creds, error); if (r < 0) return r; - return sd_bus_reply_method_return(m, "u", creds->uid); + return sd_bus_reply_method_return(m, "s", creds->unique_name); } static int driver_get_id(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { @@ -439,24 +459,6 @@ static int driver_get_id(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_ return sd_bus_reply_method_return(m, "s", sd_id128_to_string(server_id, buf)); } -static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { - _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL; - char *arg0; - int r; - - r = sd_bus_message_read(m, "s", &arg0); - if (r < 0) - return r; - - assert_return(service_name_is_valid(arg0), -EINVAL); - - r = sd_bus_get_owner(bus, arg0, SD_BUS_CREDS_UNIQUE_NAME, &creds); - if (r < 0) - return r; - - return sd_bus_reply_method_return(m, "s", creds->unique_name); -} - static int driver_hello(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { return sd_bus_reply_method_return(m, "s", m->sender); } @@ -484,6 +486,9 @@ static int driver_list_names(sd_bus *bus, sd_bus_message *m, void *userdata, sd_ if (r < 0) return r; + /* Let's sort the names list to make it stable */ + strv_sort(names); + return return_strv(bus, m, names); } @@ -495,6 +500,9 @@ static int driver_list_activatable_names(sd_bus *bus, sd_bus_message *m, void *u if (r < 0) return r; + /* Let's sort the names list to make it stable */ + strv_sort(names); + return return_strv(bus, m, names); } @@ -547,17 +555,17 @@ static int driver_list_queued_owners(sd_bus *bus, sd_bus_message *m, void *userd } static int driver_name_has_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) { - char *arg0; + const char *name; int r; - r = sd_bus_message_read(m, "s", &arg0); + r = sd_bus_message_read(m, "s", &name); if (r < 0) return r; - assert_return(service_name_is_valid(arg0), -EINVAL); + assert_return(service_name_is_valid(name), -EINVAL); - r = sd_bus_get_owner(bus, arg0, 0, NULL); - if (r < 0 && r != -ENOENT) + r = sd_bus_get_owner(bus, name, 0, NULL); + if (r < 0 && r != -ENOENT && r != -ENXIO) return r; return sd_bus_reply_method_return(m, "b", r >= 0); @@ -712,8 +720,8 @@ static int driver_unsupported(sd_bus *bus, sd_bus_message *m, void *userdata, sd static const sd_bus_vtable driver_vtable[] = { SD_BUS_VTABLE_START(0), - SD_BUS_METHOD("AddMatch", "s", NULL, driver_add_match, 0), - SD_BUS_METHOD("GetConnectionSELinuxSecurityContext", "s", "ay", driver_get_security_ctx, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("AddMatch", "s", NULL, driver_add_match, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("GetConnectionSELinuxSecurityContext", "s", "ay", driver_get_security_context, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("GetConnectionUnixProcessID", "s", "u", driver_get_pid, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("GetConnectionUnixUser", "s", "u", driver_get_user, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("GetId", NULL, "s", driver_get_id, SD_BUS_VTABLE_UNPRIVILEGED),