Compare commits
9 Commits
8da8996181
...
ed0c57c6da
Author | SHA1 | Date |
---|---|---|
Zbigniew Jędrzejewski-Szmek | ed0c57c6da | |
Zbigniew Jędrzejewski-Szmek | 0f99304e11 | |
Zbigniew Jędrzejewski-Szmek | ee0d84bff6 | |
Zbigniew Jędrzejewski-Szmek | 14ded07623 | |
Zbigniew Jędrzejewski-Szmek | 7764746336 | |
Zbigniew Jędrzejewski-Szmek | 17d702393b | |
Zbigniew Jędrzejewski-Szmek | a573879ac1 | |
Zbigniew Jędrzejewski-Szmek | e30467cea0 | |
Zbigniew Jędrzejewski-Szmek | 5fb5bbfdea |
|
@ -691,51 +691,34 @@ static void dump_home_record(UserRecord *hr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inspect_home(sd_bus *bus, const char *name) {
|
static int mangle_user_list(char **list, char ***ret) {
|
||||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
char **l;
|
||||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
|
||||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
|
|
||||||
_cleanup_(user_record_unrefp) UserRecord *hr = NULL;
|
|
||||||
const char *json;
|
|
||||||
int incomplete;
|
|
||||||
uid_t uid;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = parse_uid(name, &uid);
|
if (strv_isempty(list)) {
|
||||||
if (r < 0) {
|
_cleanup_free_ char *myself = NULL;
|
||||||
if (!valid_user_group_name(name, 0))
|
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid user name '%s'.", name);
|
|
||||||
|
|
||||||
r = bus_call_method(bus, bus_mgr, "GetUserRecordByName", &error, &reply, "s", name);
|
myself = getusername_malloc();
|
||||||
} else
|
if (!myself)
|
||||||
r = bus_call_method(bus, bus_mgr, "GetUserRecordByUID", &error, &reply, "u", (uint32_t) uid);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to inspect home: %s", bus_error_message(&error, r));
|
|
||||||
|
|
||||||
r = sd_bus_message_read(reply, "sbo", &json, &incomplete, NULL);
|
|
||||||
if (r < 0)
|
|
||||||
return bus_log_parse_error(r);
|
|
||||||
|
|
||||||
r = sd_json_parse(json, SD_JSON_PARSE_SENSITIVE, &v, NULL, NULL);
|
|
||||||
if (r < 0)
|
|
||||||
return log_error_errno(r, "Failed to parse JSON identity: %m");
|
|
||||||
|
|
||||||
hr = user_record_new();
|
|
||||||
if (!hr)
|
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
r = user_record_load(hr, v, USER_RECORD_LOAD_REFUSE_SECRET|USER_RECORD_LOG|USER_RECORD_PERMISSIVE);
|
l = strv_new(myself);
|
||||||
if (r < 0)
|
} else
|
||||||
return r;
|
l = strv_copy(list);
|
||||||
|
if (!l)
|
||||||
|
return log_oom();
|
||||||
|
|
||||||
hr->incomplete = incomplete;
|
*ret = l;
|
||||||
dump_home_record(hr);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inspect_homes(int argc, char *argv[], void *userdata) {
|
static int inspect_home(int argc, char *argv[], void *userdata) {
|
||||||
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
||||||
int r;
|
_cleanup_strv_free_ char **items = NULL;
|
||||||
|
int r, ret = 0;
|
||||||
|
|
||||||
|
r = mangle_user_list(strv_skip(argv, 1), &items);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
r = acquire_bus(&bus);
|
r = acquire_bus(&bus);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -743,26 +726,92 @@ static int inspect_homes(int argc, char *argv[], void *userdata) {
|
||||||
|
|
||||||
pager_open(arg_pager_flags);
|
pager_open(arg_pager_flags);
|
||||||
|
|
||||||
char **args = strv_skip(argv, 1);
|
STRV_FOREACH(i, items) {
|
||||||
if (args) {
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
_cleanup_free_ char *myself = getusername_malloc();
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||||
if (!myself)
|
_cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL;
|
||||||
|
_cleanup_(user_record_unrefp) UserRecord *hr = NULL;
|
||||||
|
const char *json;
|
||||||
|
int incomplete;
|
||||||
|
uid_t uid;
|
||||||
|
|
||||||
|
r = parse_uid(*i, &uid);
|
||||||
|
if (r < 0) {
|
||||||
|
if (!valid_user_group_name(*i, 0)) {
|
||||||
|
log_error("Invalid user name '%s'.", *i);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = -EINVAL;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = bus_call_method(bus, bus_mgr, "GetUserRecordByName", &error, &reply, "s", *i);
|
||||||
|
} else
|
||||||
|
r = bus_call_method(bus, bus_mgr, "GetUserRecordByUID", &error, &reply, "u", (uint32_t) uid);
|
||||||
|
if (r < 0) {
|
||||||
|
log_error_errno(r, "Failed to inspect home: %s", bus_error_message(&error, r));
|
||||||
|
if (ret == 0)
|
||||||
|
ret = r;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sd_bus_message_read(reply, "sbo", &json, &incomplete, NULL);
|
||||||
|
if (r < 0) {
|
||||||
|
bus_log_parse_error(r);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = r;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sd_json_parse(json, SD_JSON_PARSE_SENSITIVE, &v, NULL, NULL);
|
||||||
|
if (r < 0) {
|
||||||
|
log_error_errno(r, "Failed to parse JSON identity: %m");
|
||||||
|
if (ret == 0)
|
||||||
|
ret = r;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = user_record_new();
|
||||||
|
if (!hr)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
return inspect_home(bus, myself);
|
r = user_record_load(hr, v, USER_RECORD_LOAD_REFUSE_SECRET|USER_RECORD_LOG|USER_RECORD_PERMISSIVE);
|
||||||
} else {
|
if (r < 0) {
|
||||||
STRV_FOREACH(arg, args)
|
if (ret == 0)
|
||||||
RET_GATHER(r, inspect_home(bus, *arg));
|
ret = r;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr->incomplete = incomplete;
|
||||||
|
dump_home_record(hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int authenticate_home(int argc, char *argv[], void *userdata) {
|
||||||
|
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
||||||
|
_cleanup_strv_free_ char **items = NULL;
|
||||||
|
int r, ret = 0;
|
||||||
|
|
||||||
|
r = mangle_user_list(strv_skip(argv, 1), &items);
|
||||||
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int authenticate_home(sd_bus *bus, const char *name) {
|
r = acquire_bus(&bus);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
(void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
|
||||||
|
|
||||||
|
STRV_FOREACH(i, items) {
|
||||||
_cleanup_(user_record_unrefp) UserRecord *secret = NULL;
|
_cleanup_(user_record_unrefp) UserRecord *secret = NULL;
|
||||||
int r;
|
|
||||||
|
|
||||||
r = acquire_passed_secrets(name, &secret);
|
r = acquire_passed_secrets(*i, &secret);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
@ -774,7 +823,7 @@ static int authenticate_home(sd_bus *bus, const char *name) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_create_error(r);
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
r = sd_bus_message_append(m, "s", name);
|
r = sd_bus_message_append(m, "s", *i);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_create_error(r);
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
|
@ -784,37 +833,19 @@ static int authenticate_home(sd_bus *bus, const char *name) {
|
||||||
|
|
||||||
r = sd_bus_call(bus, m, HOME_SLOW_BUS_CALL_TIMEOUT_USEC, &error, NULL);
|
r = sd_bus_call(bus, m, HOME_SLOW_BUS_CALL_TIMEOUT_USEC, &error, NULL);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
r = handle_generic_user_record_error(name, secret, &error, r, false);
|
r = handle_generic_user_record_error(*i, secret, &error, r, false);
|
||||||
if (r >= 0)
|
if (r < 0) {
|
||||||
continue;
|
if (ret == 0)
|
||||||
|
ret = r;
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return r;
|
} else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int authenticate_homes(int argc, char *argv[], void *userdata) {
|
return ret;
|
||||||
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = acquire_bus(&bus);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
(void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password);
|
|
||||||
|
|
||||||
char **args = strv_skip(argv, 1);
|
|
||||||
if (args) {
|
|
||||||
_cleanup_free_ char *myself = getusername_malloc();
|
|
||||||
if (!myself)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
return authenticate_home(bus, myself);
|
|
||||||
} else {
|
|
||||||
STRV_FOREACH(arg, args)
|
|
||||||
RET_GATHER(r, authenticate_home(bus, *arg));
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_last_change(sd_json_variant **v, bool with_password, bool override) {
|
static int update_last_change(sd_json_variant **v, bool with_password, bool override) {
|
||||||
|
@ -4690,8 +4721,8 @@ static int run(int argc, char *argv[]) {
|
||||||
{ "list", VERB_ANY, 1, VERB_DEFAULT, list_homes },
|
{ "list", VERB_ANY, 1, VERB_DEFAULT, list_homes },
|
||||||
{ "activate", 2, VERB_ANY, 0, activate_home },
|
{ "activate", 2, VERB_ANY, 0, activate_home },
|
||||||
{ "deactivate", 2, VERB_ANY, 0, deactivate_home },
|
{ "deactivate", 2, VERB_ANY, 0, deactivate_home },
|
||||||
{ "inspect", VERB_ANY, VERB_ANY, 0, inspect_homes },
|
{ "inspect", VERB_ANY, VERB_ANY, 0, inspect_home },
|
||||||
{ "authenticate", VERB_ANY, VERB_ANY, 0, authenticate_homes },
|
{ "authenticate", VERB_ANY, VERB_ANY, 0, authenticate_home },
|
||||||
{ "create", VERB_ANY, 2, 0, create_home },
|
{ "create", VERB_ANY, 2, 0, create_home },
|
||||||
{ "remove", 2, VERB_ANY, 0, remove_home },
|
{ "remove", 2, VERB_ANY, 0, remove_home },
|
||||||
{ "update", VERB_ANY, 2, 0, update_home },
|
{ "update", VERB_ANY, 2, 0, update_home },
|
||||||
|
|
Loading…
Reference in New Issue