]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
userdb: optionally parse numeric UIDs/GIDs where a username is expected
authorLennart Poettering <lennart@poettering.net>
Tue, 14 Jan 2025 17:28:27 +0000 (18:28 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 15 Jan 2025 18:34:37 +0000 (03:34 +0900)
Let's move this logic from userdbctl into generic code so that we can
use it elsewhere.

src/shared/userdb.c
src/shared/userdb.h
src/userdb/userdbctl.c

index c7334e820d5e2a8e2f41eee03497192353dfcd2b..be7c77d950321a6811fcf1f6c96933670df2e3e7 100644 (file)
@@ -680,6 +680,13 @@ int userdb_by_name(const char *name, UserDBFlags flags, UserRecord **ret) {
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *query = NULL;
         int r;
 
+        if (FLAGS_SET(flags, USERDB_PARSE_NUMERIC)) {
+                uid_t uid;
+
+                if (parse_uid(name, &uid) >= 0)
+                        return userdb_by_uid(uid, flags, ret);
+        }
+
         if (!valid_user_group_name(name, VALID_USER_RELAX))
                 return -EINVAL;
 
@@ -991,6 +998,13 @@ int groupdb_by_name(const char *name, UserDBFlags flags, GroupRecord **ret) {
         _cleanup_(sd_json_variant_unrefp) sd_json_variant *query = NULL;
         int r;
 
+        if (FLAGS_SET(flags, USERDB_PARSE_NUMERIC)) {
+                gid_t gid;
+
+                if (parse_gid(name, &gid) >= 0)
+                        return groupdb_by_gid(gid, flags, ret);
+        }
+
         if (!valid_user_group_name(name, VALID_USER_RELAX))
                 return -EINVAL;
 
index daf87fb5cf5b5c3c017d9001f8c6ad6911ed2383..9bb47efbfee52951f140abb1e4bba56ae2a03ef6 100644 (file)
@@ -30,6 +30,8 @@ typedef enum UserDBFlags {
         /* Combinations */
         USERDB_NSS_ONLY = USERDB_EXCLUDE_VARLINK|USERDB_EXCLUDE_DROPIN|USERDB_DONT_SYNTHESIZE_INTRINSIC|USERDB_DONT_SYNTHESIZE_FOREIGN,
         USERDB_DROPIN_ONLY = USERDB_EXCLUDE_NSS|USERDB_EXCLUDE_VARLINK|USERDB_DONT_SYNTHESIZE_INTRINSIC|USERDB_DONT_SYNTHESIZE_FOREIGN,
+
+        USERDB_PARSE_NUMERIC             = 1 << 8,  /* if a numeric UID is specified as name, parse it and look up by UID/GID */
 } UserDBFlags;
 
 /* Well-known errors we'll return here:
index ee6e6c869a02365e9667c4ea5d383d20b02e0152..74057f6593bb021d56cc1d9aa70adddce0340bf4 100644 (file)
@@ -405,12 +405,8 @@ static int display_user(int argc, char *argv[], void *userdata) {
         if (argc > 1 && !arg_fuzzy)
                 STRV_FOREACH(i, argv + 1) {
                         _cleanup_(user_record_unrefp) UserRecord *ur = NULL;
-                        uid_t uid;
 
-                        if (parse_uid(*i, &uid) >= 0)
-                                r = userdb_by_uid(uid, arg_userdb_flags, &ur);
-                        else
-                                r = userdb_by_name(*i, arg_userdb_flags, &ur);
+                        r = userdb_by_name(*i, arg_userdb_flags|USERDB_PARSE_NUMERIC, &ur);
                         if (r < 0) {
                                 if (r == -ESRCH)
                                         log_error_errno(r, "User %s does not exist.", *i);
@@ -741,12 +737,8 @@ static int display_group(int argc, char *argv[], void *userdata) {
         if (argc > 1 && !arg_fuzzy)
                 STRV_FOREACH(i, argv + 1) {
                         _cleanup_(group_record_unrefp) GroupRecord *gr = NULL;
-                        gid_t gid;
 
-                        if (parse_gid(*i, &gid) >= 0)
-                                r = groupdb_by_gid(gid, arg_userdb_flags, &gr);
-                        else
-                                r = groupdb_by_name(*i, arg_userdb_flags, &gr);
+                        r = groupdb_by_name(*i, arg_userdb_flags|USERDB_PARSE_NUMERIC, &gr);
                         if (r < 0) {
                                 if (r == -ESRCH)
                                         log_error_errno(r, "Group %s does not exist.", *i);