homed: when empty username is passed to bus calls, operate on client's UID
This commit is contained in:
committed by
Yu Watanabe
parent
cc943ab86e
commit
0e80e355b2
@@ -61,6 +61,53 @@ static int property_get_auto_login(
|
||||
return sd_bus_message_close_container(reply);
|
||||
}
|
||||
|
||||
static int lookup_user_name(
|
||||
Manager *m,
|
||||
sd_bus_message *message,
|
||||
const char *user_name,
|
||||
sd_bus_error *error,
|
||||
Home **ret) {
|
||||
|
||||
Home *h;
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(message);
|
||||
assert(user_name);
|
||||
assert(ret);
|
||||
|
||||
if (isempty(user_name)) {
|
||||
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
|
||||
uid_t uid;
|
||||
|
||||
/* If an empty user name is specified, then identify caller's EUID and find home by that. */
|
||||
|
||||
r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_bus_creds_get_euid(creds, &uid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
h = hashmap_get(m->homes_by_uid, UID_TO_PTR(uid));
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "Client's UID " UID_FMT " not managed.", uid);
|
||||
|
||||
} else {
|
||||
|
||||
if (!valid_user_group_name(user_name, 0))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
|
||||
|
||||
h = hashmap_get(m->homes_by_name, user_name);
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "No home for user %s known", user_name);
|
||||
}
|
||||
|
||||
*ret = h;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int method_get_home_by_name(
|
||||
sd_bus_message *message,
|
||||
void *userdata,
|
||||
@@ -77,12 +124,10 @@ static int method_get_home_by_name(
|
||||
r = sd_bus_message_read(message, "s", &user_name);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (!valid_user_group_name(user_name, 0))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
|
||||
|
||||
h = hashmap_get(m->homes_by_name, user_name);
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "No home for user %s known", user_name);
|
||||
r = lookup_user_name(m, message, user_name, error, &h);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = bus_home_path(h, &path);
|
||||
if (r < 0)
|
||||
@@ -204,12 +249,10 @@ static int method_get_user_record_by_name(
|
||||
r = sd_bus_message_read(message, "s", &user_name);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (!valid_user_group_name(user_name, 0))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
|
||||
|
||||
h = hashmap_get(m->homes_by_name, user_name);
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "No home for user %s known", user_name);
|
||||
r = lookup_user_name(m, message, user_name, error, &h);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = bus_home_get_record_json(h, message, &json, &incomplete);
|
||||
if (r < 0)
|
||||
@@ -278,12 +321,9 @@ static int generic_home_method(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!valid_user_group_name(user_name, 0))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "User name %s is not valid", user_name);
|
||||
|
||||
h = hashmap_get(m->homes_by_name, user_name);
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "No home for user %s known", user_name);
|
||||
r = lookup_user_name(m, message, user_name, error, &h);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return handler(message, h, error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user