userdb: add support for looking up users or groups by uuid.
This propagates the UUID lookup parameter through the API permitting lookups to be done by uuid.
This commit is contained in:
@@ -2777,7 +2777,8 @@ bool userdb_match_is_set(const UserDBMatch *match) {
|
||||
return !strv_isempty(match->fuzzy_names) ||
|
||||
!FLAGS_SET(match->disposition_mask, USER_DISPOSITION_MASK_ALL) ||
|
||||
match->uid_min > 0 ||
|
||||
match->uid_max < UID_INVALID-1;
|
||||
match->uid_max < UID_INVALID-1 ||
|
||||
!sd_id128_is_null(match->uuid);
|
||||
}
|
||||
|
||||
void userdb_match_done(UserDBMatch *match) {
|
||||
@@ -2836,6 +2837,9 @@ bool user_record_match(UserRecord *u, const UserDBMatch *match) {
|
||||
if (!BIT_SET(match->disposition_mask, user_record_disposition(u)))
|
||||
return false;
|
||||
|
||||
if (!sd_id128_is_null(match->uuid) && !sd_id128_equal(match->uuid, u->uuid))
|
||||
return false;
|
||||
|
||||
if (!strv_isempty(match->fuzzy_names)) {
|
||||
|
||||
/* Note this array of names is sparse, i.e. various entries listed in it will be
|
||||
|
||||
@@ -513,6 +513,7 @@ typedef struct UserDBMatch {
|
||||
uid_t uid_max;
|
||||
gid_t gid_max;
|
||||
};
|
||||
sd_id128_t uuid;
|
||||
} UserDBMatch;
|
||||
|
||||
#define USER_DISPOSITION_MASK_ALL ((UINT64_C(1) << _USER_DISPOSITION_MAX) - UINT64_C(1))
|
||||
@@ -522,6 +523,7 @@ typedef struct UserDBMatch {
|
||||
.disposition_mask = USER_DISPOSITION_MASK_ALL, \
|
||||
.uid_min = 0, \
|
||||
.uid_max = UID_INVALID-1, \
|
||||
.uuid = SD_ID128_NULL, \
|
||||
}
|
||||
|
||||
/* Maybe useful when we want to resolve root and system user/group but want to refuse nobody user/group. */
|
||||
|
||||
+17
-16
@@ -799,27 +799,29 @@ nomatch:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int query_append_disposition_mask(sd_json_variant **query, uint64_t mask) {
|
||||
static int query_append_common(sd_json_variant **query, const UserDBMatch *match) {
|
||||
int r;
|
||||
_cleanup_strv_free_ char **dispositions = NULL;
|
||||
|
||||
assert(query);
|
||||
|
||||
if (FLAGS_SET(mask, USER_DISPOSITION_MASK_ALL))
|
||||
return 0;
|
||||
uint64_t mask = match->disposition_mask;
|
||||
if (FLAGS_SET(mask, USER_DISPOSITION_MASK_ALL)) {
|
||||
for (UserDisposition d = 0; d < _USER_DISPOSITION_MAX; d++) {
|
||||
if (!BIT_SET(mask, d))
|
||||
continue;
|
||||
|
||||
_cleanup_strv_free_ char **dispositions = NULL;
|
||||
for (UserDisposition d = 0; d < _USER_DISPOSITION_MAX; d++) {
|
||||
if (!BITS_SET(mask, d))
|
||||
continue;
|
||||
|
||||
r = strv_extend(&dispositions, user_disposition_to_string(d));
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = strv_extend(&dispositions, user_disposition_to_string(d));
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
return sd_json_variant_merge_objectbo(
|
||||
query,
|
||||
SD_JSON_BUILD_PAIR_STRV("dispositionMask", dispositions));
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(match->fuzzy_names), "fuzzyNames", SD_JSON_BUILD_STRV(match->fuzzy_names)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!sd_id128_is_null(match->uuid), "uuid", SD_JSON_BUILD_UUID(match->uuid)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(dispositions), "dispositionMask", SD_JSON_BUILD_STRV(dispositions)));
|
||||
}
|
||||
|
||||
static int query_append_uid_match(sd_json_variant **query, const UserDBMatch *match) {
|
||||
@@ -832,13 +834,12 @@ static int query_append_uid_match(sd_json_variant **query, const UserDBMatch *ma
|
||||
|
||||
r = sd_json_variant_merge_objectbo(
|
||||
query,
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(match->fuzzy_names), "fuzzyNames", SD_JSON_BUILD_STRV(match->fuzzy_names)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(match->uid_min > 0, "uidMin", SD_JSON_BUILD_UNSIGNED(match->uid_min)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(match->uid_max < UID_INVALID-1, "uidMax", SD_JSON_BUILD_UNSIGNED(match->uid_max)));
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return query_append_disposition_mask(query, match->disposition_mask);
|
||||
return query_append_common(query, match);
|
||||
}
|
||||
|
||||
static int userdb_by_name_fallbacks(
|
||||
@@ -1298,13 +1299,13 @@ static int query_append_gid_match(sd_json_variant **query, const UserDBMatch *ma
|
||||
|
||||
r = sd_json_variant_merge_objectbo(
|
||||
query,
|
||||
SD_JSON_BUILD_PAIR_CONDITION(!strv_isempty(match->fuzzy_names), "fuzzyNames", SD_JSON_BUILD_STRV(match->fuzzy_names)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(match->gid_min > 0, "gidMin", SD_JSON_BUILD_UNSIGNED(match->gid_min)),
|
||||
SD_JSON_BUILD_PAIR_CONDITION(match->gid_max < GID_INVALID-1, "gidMax", SD_JSON_BUILD_UNSIGNED(match->gid_max)));
|
||||
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return query_append_disposition_mask(query, match->disposition_mask);
|
||||
return query_append_common(query, match);
|
||||
}
|
||||
|
||||
static int groupdb_by_name_fallbacks(
|
||||
|
||||
Reference in New Issue
Block a user