static bool arg_drop_privileges = false;
static char **arg_configuration = NULL;
+static Hashmap *names_hash = NULL;
+
static int help(void) {
printf("%s [OPTIONS...]\n\n"
assert(a);
assert(b);
- r = sd_bus_get_peer_creds(b, SD_BUS_CREDS_UID|SD_BUS_CREDS_PID|SD_BUS_CREDS_CMDLINE|SD_BUS_CREDS_COMM, &creds);
+ r = sd_bus_get_owner_creds(b, SD_BUS_CREDS_UID|SD_BUS_CREDS_PID|SD_BUS_CREDS_CMDLINE|SD_BUS_CREDS_COMM, &creds);
if (r < 0)
return r;
assert_return(service_name_is_valid(name), -EINVAL);
- r = sd_bus_get_owner(bus, name, mask, &c);
+ r = sd_bus_get_name_creds(bus, name, mask, &c);
if (r == -ESRCH || 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)
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionSELinuxSecurityContext")) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- r = get_creds_by_message(a, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, NULL);
+ r = get_creds_by_message(a, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, &error);
if (r < 0)
- return synthetic_reply_method_errno(m, r, NULL);
+ return synthetic_reply_method_errno(m, r, &error);
return synthetic_reply_method_return(m, "y", creds->label, strlen(creds->label));
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionUnixProcessID")) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- r = get_creds_by_message(a, m, SD_BUS_CREDS_PID, &creds, NULL);
+ r = get_creds_by_message(a, m, SD_BUS_CREDS_PID, &creds, &error);
if (r < 0)
- return synthetic_reply_method_errno(m, r, NULL);
+ return synthetic_reply_method_errno(m, r, &error);
return synthetic_reply_method_return(m, "u", (uint32_t) creds->pid);
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionUnixUser")) {
_cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
- r = get_creds_by_message(a, m, SD_BUS_CREDS_UID, &creds, NULL);
+ r = get_creds_by_message(a, m, SD_BUS_CREDS_UID, &creds, &error);
if (r < 0)
- return synthetic_reply_method_errno(m, r, NULL);
+ return synthetic_reply_method_errno(m, r, &error);
return synthetic_reply_method_return(m, "u", (uint32_t) creds->uid);
sd_id128_t server_id;
char buf[SD_ID128_STRING_MAX];
- r = sd_bus_get_server_id(a, &server_id);
+ r = sd_bus_get_owner_id(a, &server_id);
if (r < 0)
return synthetic_reply_method_errno(m, r, NULL);
struct kdbus_cmd_name_list cmd = {};
struct kdbus_name_list *name_list;
struct kdbus_cmd_free cmd_free;
- struct kdbus_cmd_name *name;
+ struct kdbus_name_info *name;
_cleanup_strv_free_ char **owners = NULL;
+ _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
char *arg0;
int err = 0;
if (!service_name_is_valid(arg0))
return synthetic_reply_method_errno(m, -EINVAL, NULL);
+ r = sd_bus_get_name_creds(a, arg0, 0, NULL);
+ if (r == -ESRCH || r == -ENXIO) {
+ sd_bus_error_setf(&error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Could not get owners of name '%s': no such name.", arg0);
+ return synthetic_reply_method_errno(m, r, &error);
+ }
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
cmd.flags = KDBUS_NAME_LIST_QUEUED;
r = ioctl(a->input_fd, KDBUS_CMD_NAME_LIST, &cmd);
if (r < 0)
char *n;
KDBUS_ITEM_FOREACH(item, name, items)
- if (item->type == KDBUS_ITEM_NAME)
- entry_name = item->str;
+ if (item->type == KDBUS_ITEM_OWNED_NAME)
+ entry_name = item->name.name;
if (!streq_ptr(entry_name, arg0))
continue;
if (streq(name, "org.freedesktop.DBus"))
return synthetic_reply_method_return(m, "b", true);
- r = sd_bus_get_owner(a, name, 0, NULL);
+ r = sd_bus_get_name_creds(a, name, 0, NULL);
if (r < 0 && r != -ESRCH && r != -ENXIO)
return synthetic_reply_method_errno(m, r, NULL);
return synthetic_reply_method_errno(m, r, NULL);
}
+ hashmap_remove(names_hash, name);
+
return synthetic_reply_method_return(m, "u", BUS_NAME_RELEASED);
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "ReloadConfig")) {
} else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "RequestName")) {
const char *name;
- uint32_t flags;
+ uint32_t flags, param;
+ bool in_queue;
r = sd_bus_message_read(m, "su", &name, &flags);
if (r < 0)
if ((flags & ~(BUS_NAME_ALLOW_REPLACEMENT|BUS_NAME_REPLACE_EXISTING|BUS_NAME_DO_NOT_QUEUE)) != 0)
return synthetic_reply_method_errno(m, -EINVAL, NULL);
- r = sd_bus_request_name(a, name, flags);
+ param = 0;
+ if (flags & BUS_NAME_ALLOW_REPLACEMENT)
+ param |= SD_BUS_NAME_ALLOW_REPLACEMENT;
+ if (flags & BUS_NAME_REPLACE_EXISTING)
+ param |= SD_BUS_NAME_REPLACE_EXISTING;
+ if (!(flags & BUS_NAME_DO_NOT_QUEUE))
+ param |= SD_BUS_NAME_QUEUE;
+
+ r = sd_bus_request_name(a, name, param);
if (r < 0) {
if (r == -EEXIST)
return synthetic_reply_method_return(m, "u", BUS_NAME_EXISTS);
return synthetic_reply_method_errno(m, r, NULL);
}
- if (r == 0)
+ in_queue = (r == 0);
+
+ r = hashmap_put(names_hash, name, NULL);
+ if (r < 0)
+ return synthetic_reply_method_errno(m, r, NULL);
+
+ if (in_queue)
return synthetic_reply_method_return(m, "u", BUS_NAME_IN_QUEUE);
return synthetic_reply_method_return(m, "u", BUS_NAME_PRIMARY_OWNER);
if (flags != 0)
return synthetic_reply_method_errno(m, -EINVAL, NULL);
- r = sd_bus_get_owner(a, name, 0, NULL);
+ r = sd_bus_get_name_creds(a, name, 0, NULL);
if (r >= 0 || streq(name, "org.freedesktop.DBus"))
return synthetic_reply_method_return(m, "u", BUS_START_REPLY_ALREADY_RUNNING);
if (r != -ESRCH)
}
}
-static int process_hello(sd_bus *a, sd_bus *b, sd_bus_message *m, bool *got_hello) {
+static int process_hello(sd_bus *a, sd_bus *b, sd_bus_message *m, Policy *policy, const struct ucred *ucred, bool *got_hello) {
_cleanup_bus_message_unref_ sd_bus_message *n = NULL;
bool is_hello;
int r;
return -EIO;
}
+ if (!policy_check_hello(policy, ucred)) {
+ log_error("Policy denied HELLO");
+ return -EPERM;
+ }
+
*got_hello = true;
if (!a->is_kernel)
sd_is_socket(out_fd, AF_UNIX, 0, 0) > 0;
if (is_unix) {
- getpeercred(in_fd, &ucred);
- getpeersec(in_fd, &peersec);
+ (void) getpeercred(in_fd, &ucred);
+ (void) getpeersec(in_fd, &peersec);
}
if (arg_drop_privileges) {
goto finish;
}
+ names_hash = hashmap_new(&string_hash_ops);
+ if (!names_hash) {
+ log_oom();
+ goto finish;
+ }
+
r = sd_bus_new(&a);
if (r < 0) {
log_error("Failed to allocate bus: %s", strerror(-r));
goto finish;
}
- r = sd_bus_set_name(a, "sd-proxy");
+ r = sd_bus_set_description(a, "sd-proxy");
if (r < 0) {
log_error("Failed to set bus name: %s", strerror(-r));
goto finish;
goto finish;
}
- r = sd_bus_get_server_id(a, &server_id);
+ r = sd_bus_get_owner_id(a, &server_id);
if (r < 0) {
log_error("Failed to get server ID: %s", strerror(-r));
goto finish;
goto finish;
}
- k = process_hello(a, b, m, &got_hello);
+ k = process_hello(a, b, m, &policy, &ucred, &got_hello);
if (k < 0) {
r = k;
log_error("Failed to process HELLO: %s", strerror(-r));
policy_free(&policy);
strv_free(arg_configuration);
+ hashmap_free(names_hash);
free(arg_address);
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;