From 8550c06fd960f2b68d7aa67f403510415cd8fdda Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Jun 08 2018 11:25:03 +0000 Subject: nss-imap: add sss_nss_getsidbyuid() and sss_nss_getsidbygid() Two new calls are added to allow the caller to specify if the given POSIX ID is a UID or a GID and the expected result is a user or a group respectively. This is needed because on POSIX a user and a group may share numerically the same ID value but might have different SIDs assigned. Related to https://pagure.io/SSSD/sssd/issue/3629 Reviewed-by: Jakub Hrozek --- diff --git a/Makefile.am b/Makefile.am index ebb38db..9539b3c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1171,7 +1171,7 @@ libsss_nss_idmap_la_LIBADD = \ $(NULL) libsss_nss_idmap_la_LDFLAGS = \ -Wl,--version-script,$(srcdir)/src/sss_client/idmap/sss_nss_idmap.exports \ - -version-info 4:0:4 + -version-info 5:0:5 dist_noinst_DATA += src/sss_client/idmap/sss_nss_idmap.exports diff --git a/src/responder/nss/nss_cmd.c b/src/responder/nss/nss_cmd.c index 9f8479b..9ee6ca8 100644 --- a/src/responder/nss/nss_cmd.c +++ b/src/responder/nss/nss_cmd.c @@ -1134,6 +1134,22 @@ static errno_t nss_cmd_getsidbyid(struct cli_ctx *cli_ctx) SSS_MC_NONE, nss_protocol_fill_sid); } +static errno_t nss_cmd_getsidbyuid(struct cli_ctx *cli_ctx) +{ + const char *attrs[] = { SYSDB_SID_STR, NULL }; + + return nss_getby_id(cli_ctx, false, CACHE_REQ_USER_BY_ID, attrs, + SSS_MC_NONE, nss_protocol_fill_sid); +} + +static errno_t nss_cmd_getsidbygid(struct cli_ctx *cli_ctx) +{ + const char *attrs[] = { SYSDB_SID_STR, NULL }; + + return nss_getby_id(cli_ctx, false, CACHE_REQ_GROUP_BY_ID, attrs, + SSS_MC_NONE, nss_protocol_fill_sid); +} + static errno_t nss_cmd_getnamebysid(struct cli_ctx *cli_ctx) { return nss_getby_sid(cli_ctx, CACHE_REQ_OBJECT_BY_SID, @@ -1225,6 +1241,8 @@ struct sss_cmd_table *get_nss_cmds(void) { SSS_NSS_ENDSERVENT, nss_cmd_endservent }, { SSS_NSS_GETSIDBYNAME, nss_cmd_getsidbyname }, { SSS_NSS_GETSIDBYID, nss_cmd_getsidbyid }, + { SSS_NSS_GETSIDBYUID, nss_cmd_getsidbyuid }, + { SSS_NSS_GETSIDBYGID, nss_cmd_getsidbygid }, { SSS_NSS_GETNAMEBYSID, nss_cmd_getnamebysid }, { SSS_NSS_GETIDBYSID, nss_cmd_getidbysid }, { SSS_NSS_GETORIGBYNAME, nss_cmd_getorigbyname }, diff --git a/src/sss_client/idmap/sss_nss_idmap.c b/src/sss_client/idmap/sss_nss_idmap.c index cbf8c11..323392f 100644 --- a/src/sss_client/idmap/sss_nss_idmap.c +++ b/src/sss_client/idmap/sss_nss_idmap.c @@ -246,6 +246,8 @@ static int sss_nss_getyyybyxxx(union input inp, enum sss_cli_command cmd, break; case SSS_NSS_GETSIDBYID: + case SSS_NSS_GETSIDBYUID: + case SSS_NSS_GETSIDBYGID: rd.len = sizeof(uint32_t); rd.data = &inp.id; @@ -292,6 +294,8 @@ static int sss_nss_getyyybyxxx(union input inp, enum sss_cli_command cmd, switch(cmd) { case SSS_NSS_GETSIDBYID: + case SSS_NSS_GETSIDBYUID: + case SSS_NSS_GETSIDBYGID: case SSS_NSS_GETSIDBYNAME: case SSS_NSS_GETNAMEBYSID: case SSS_NSS_GETNAMEBYCERT: @@ -414,6 +418,60 @@ int sss_nss_getsidbyid(uint32_t id, char **sid, enum sss_id_type *type) return sss_nss_getsidbyid_timeout(id, NO_TIMEOUT, sid, type); } +int sss_nss_getsidbyuid_timeout(uint32_t uid, unsigned int timeout, + char **sid, enum sss_id_type *type) +{ + int ret; + union input inp; + struct output out; + + if (sid == NULL) { + return EINVAL; + } + + inp.id = uid; + + ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETSIDBYUID, timeout, &out); + if (ret == EOK) { + *sid = out.d.str; + *type = out.type; + } + + return ret; +} + +int sss_nss_getsidbyuid(uint32_t uid, char **sid, enum sss_id_type *type) +{ + return sss_nss_getsidbyuid_timeout(uid, NO_TIMEOUT, sid, type); +} + +int sss_nss_getsidbygid_timeout(uint32_t gid, unsigned int timeout, + char **sid, enum sss_id_type *type) +{ + int ret; + union input inp; + struct output out; + + if (sid == NULL) { + return EINVAL; + } + + inp.id = gid; + + ret = sss_nss_getyyybyxxx(inp, SSS_NSS_GETSIDBYGID, timeout, &out); + if (ret == EOK) { + *sid = out.d.str; + *type = out.type; + } + + return ret; +} + +int sss_nss_getsidbygid(uint32_t gid, char **sid, enum sss_id_type *type) +{ + return sss_nss_getsidbygid_timeout(gid, NO_TIMEOUT, sid, type); +} + int sss_nss_getnamebysid_timeout(const char *sid, unsigned int timeout, char **fq_name, enum sss_id_type *type) { diff --git a/src/sss_client/idmap/sss_nss_idmap.exports b/src/sss_client/idmap/sss_nss_idmap.exports index 8d0a24f..d1b61f5 100644 --- a/src/sss_client/idmap/sss_nss_idmap.exports +++ b/src/sss_client/idmap/sss_nss_idmap.exports @@ -48,3 +48,12 @@ SSS_NSS_IDMAP_0.4.0 { sss_nss_getnamebycert_timeout; sss_nss_getlistbycert_timeout; } SSS_NSS_IDMAP_0.3.0; + +SSS_NSS_IDMAP_0.5.0 { + # public functions + global: + sss_nss_getsidbyuid; + sss_nss_getsidbyuid_timeout; + sss_nss_getsidbygid; + sss_nss_getsidbygid_timeout; +} SSS_NSS_IDMAP_0.4.0; diff --git a/src/sss_client/idmap/sss_nss_idmap.h b/src/sss_client/idmap/sss_nss_idmap.h index 125e72a..46e2425 100644 --- a/src/sss_client/idmap/sss_nss_idmap.h +++ b/src/sss_client/idmap/sss_nss_idmap.h @@ -79,6 +79,32 @@ int sss_nss_getsidbyname(const char *fq_name, char **sid, int sss_nss_getsidbyid(uint32_t id, char **sid, enum sss_id_type *type); /** + * @brief Find SID by a POSIX UID + * + * @param[in] uid POSIX UID + * @param[out] sid String representation of the SID of the requested user, + * must be freed by the caller + * @param[out] type Type of the object related to the given ID + * + * @return + * - see #sss_nss_getsidbyname + */ +int sss_nss_getsidbyuid(uint32_t uid, char **sid, enum sss_id_type *type); + +/** + * @brief Find SID by a POSIX GID + * + * @param[in] gid POSIX GID + * @param[out] sid String representation of the SID of the requested group, + * must be freed by the caller + * @param[out] type Type of the object related to the given ID + * + * @return + * - see #sss_nss_getsidbyname + */ +int sss_nss_getsidbygid(uint32_t id, char **sid, enum sss_id_type *type); + +/** * @brief Return the fully qualified name for the given SID * * @param[in] sid String representation of the SID @@ -340,6 +366,36 @@ int sss_nss_getsidbyname_timeout(const char *fq_name, unsigned int timeout, */ int sss_nss_getsidbyid_timeout(uint32_t id, unsigned int timeout, char **sid, enum sss_id_type *type); +/** + * @brief Find SID by a POSIX UID with timeout + * + * @param[in] uid POSIX UID + * @param[in] timeout timeout in milliseconds + * @param[out] sid String representation of the SID of the requested user, + * must be freed by the caller + * @param[out] type Type of the object related to the given ID + * + * @return + * - see #sss_nss_getsidbyname_timeout + */ +int sss_nss_getsidbyuid_timeout(uint32_t uid, unsigned int timeout, + char **sid, enum sss_id_type *type); + +/** + * @brief Find SID by a POSIX GID with timeout + * + * @param[in] gid POSIX GID + * @param[in] timeout timeout in milliseconds + * @param[out] sid String representation of the SID of the requested group, + * must be freed by the caller + * @param[out] type Type of the object related to the given ID + * + * @return + * - see #sss_nss_getsidbyname_timeout + */ +int sss_nss_getsidbygid_timeout(uint32_t gid, unsigned int timeout, + char **sid, enum sss_id_type *type); + /** * @brief Return the fully qualified name for the given SID with timeout diff --git a/src/sss_client/sss_cli.h b/src/sss_client/sss_cli.h index 34eee58..24d28ed 100644 --- a/src/sss_client/sss_cli.h +++ b/src/sss_client/sss_cli.h @@ -272,6 +272,14 @@ SSS_NSS_GETLISTBYCERT = 0x0117, /**< Takes the zero terminated string of a X509 certificate and returns a list of zero terminated fully qualified names of the related objects. */ +SSS_NSS_GETSIDBYUID = 0x0118, /**< Takes an unsigned 32bit integer (POSIX UID) + and reurn the zero terminated string + representation of the SID of the object + with the given UID. */ +SSS_NSS_GETSIDBYGID = 0x0119, /**< Takes an unsigned 32bit integer (POSIX GID) + and reurn the zero terminated string + representation of the SID of the object + with the given UID. */ }; /** diff --git a/src/tests/cmocka/test_nss_srv.c b/src/tests/cmocka/test_nss_srv.c index 930495d..1f7de7b 100644 --- a/src/tests/cmocka/test_nss_srv.c +++ b/src/tests/cmocka/test_nss_srv.c @@ -544,6 +544,7 @@ static void assert_users_equal(struct passwd *a, struct passwd *b) static errno_t store_group(struct nss_test_ctx *ctx, struct sss_domain_info *dom, struct group *group, + struct sysdb_attrs *attrs, time_t cache_update) { errno_t ret; @@ -556,10 +557,10 @@ static errno_t store_group(struct nss_test_ctx *ctx, return ENOMEM; } - ret = sysdb_add_group(dom, - fqname, - group->gr_gid, - NULL, 300, 0); + ret = sysdb_store_group(dom, + fqname, + group->gr_gid, + attrs, 300, 0); talloc_free(fqname); return ret; } @@ -1485,7 +1486,7 @@ void test_nss_getgrnam_no_members(void **state) /* Prime the cache with a valid group */ ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &getgrnam_no_members, 0); + &getgrnam_no_members, NULL, 0); assert_int_equal(ret, EOK); mock_input_user_or_group(getgrnam_no_members.gr_name); @@ -1563,7 +1564,7 @@ void test_nss_getgrnam_members(void **state) errno_t ret; ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testgroup_members, 0); + &testgroup_members, NULL, 0); assert_int_equal(ret, EOK); ret = store_user(nss_test_ctx, nss_test_ctx->tctx->dom, @@ -2149,7 +2150,7 @@ void test_nss_getgrnam_space(void **state) /* Prime the cache with a valid group */ ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &space_group, 0); + &space_group, NULL, 0); assert_int_equal(ret, EOK); mock_input_user_or_group("space group"); @@ -2965,11 +2966,11 @@ void test_nss_initgroups(void **state) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_gr1, 0); + &testinitgr_gr1, NULL, 0); assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_gr2, 0); + &testinitgr_gr2, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3099,11 +3100,11 @@ static int test_nss_initgr_search_acct_cb(void *pvt) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_srch_gr1, 0); + &testinitgr_srch_gr1, NULL, 0); assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_srch_gr2, 0); + &testinitgr_srch_gr2, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3209,7 +3210,7 @@ static int test_nss_initgr_update_acct_cb(void *pvt) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_update_gr2, 0); + &testinitgr_update_gr2, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3249,7 +3250,7 @@ void test_nss_initgr_update(void **state) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_update_gr1, 0); + &testinitgr_update_gr1, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3317,7 +3318,7 @@ static int test_nss_initgr_update_acct_2expire_attributes_cb(void *pvt) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_2attr_gr2, 0); + &testinitgr_2attr_gr2, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3369,7 +3370,7 @@ void test_nss_initgr_update_two_expire_attributes(void **state) assert_int_equal(ret, EOK); ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, - &testinitgr_2attr_gr1, 0); + &testinitgr_2attr_gr1, NULL, 0); assert_int_equal(ret, EOK); ret = store_group_member(nss_test_ctx, @@ -3504,7 +3505,7 @@ static int nss_subdom_test_setup_common(void **state, bool nonfqnames) nss_test_ctx->subdom = nss_test_ctx->tctx->dom->subdomains; ret = store_group(nss_test_ctx, nss_test_ctx->subdom, - &testsubdomgroup, 0); + &testsubdomgroup, NULL, 0); assert_int_equal(ret, EOK); ret = store_user(nss_test_ctx, nss_test_ctx->subdom, @@ -4163,6 +4164,264 @@ void test_nss_getsidbyname(void **state) assert_int_equal(ret, EOK); } +void test_nss_getsidbyid(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testuser_sid = "S-1-2-3-4"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testuser_sid); + assert_int_equal(ret, EOK); + + ret = store_user(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_user, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 1234); + will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETSIDBYID); + will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL); + + will_return(test_nss_getsidbyname_check, testuser_sid); + + /* Query for that user, call a callback when command finishes */ + set_cmd_cb(test_nss_getsidbyname_check); + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with EOK */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, EOK); +} + +void test_nss_getsidbyuid(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testuser_sid = "S-1-2-3-4"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testuser_sid); + assert_int_equal(ret, EOK); + + ret = store_user(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_user, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 1234); + will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETSIDBYUID); + will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL); + + will_return(test_nss_getsidbyname_check, testuser_sid); + + /* Query for that user, call a callback when command finishes */ + set_cmd_cb(test_nss_getsidbyname_check); + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYUID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with EOK */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, EOK); +} + +void test_nss_getsidbygid_no_group(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testuser_sid = "S-1-2-3-4"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testuser_sid); + assert_int_equal(ret, EOK); + + ret = store_user(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_user, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 1234); + mock_account_recv_simple(); + set_cmd_cb(NULL); + + /* Query for that user, call a callback when command finishes */ + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYGID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with ENOENT (because there is no such + * group) */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, ENOENT); +} + +struct group sid_group = { + .gr_name = discard_const("testgroupsid"), + .gr_gid = 5555, +}; + +static int test_nss_getsidbyname_group_check(uint32_t status, + uint8_t *body, + size_t blen) +{ + const char *name; + enum sss_id_type type; + size_t rp = 2 * sizeof(uint32_t); + char *expected_result = sss_mock_ptr_type(char *); + + if (expected_result == NULL) { + assert_int_equal(status, EINVAL); + assert_int_equal(blen, 0); + } else { + assert_int_equal(status, EOK); + + SAFEALIGN_COPY_UINT32(&type, body+rp, &rp); + + name = (char *) body+rp; + + assert_int_equal(type, SSS_ID_TYPE_GID); + assert_string_equal(name, expected_result); + } + + return EOK; +} + +void test_nss_getsidbyname_group(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testgroup_sid = "S-1-2-3-5"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testgroup_sid); + assert_int_equal(ret, EOK); + + ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_group, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_user_or_group("testgroupsid"); + will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETSIDBYNAME); + will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL); + + will_return(test_nss_getsidbyname_group_check, testgroup_sid); + + /* Query for that group, call a callback when command finishes */ + set_cmd_cb(test_nss_getsidbyname_group_check); + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYNAME, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with EOK */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, EOK); +} + +void test_nss_getsidbyid_group(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testgroup_sid = "S-1-2-3-5"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testgroup_sid); + assert_int_equal(ret, EOK); + + ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_group, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 5555); + will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETSIDBYID); + will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL); + + will_return(test_nss_getsidbyname_group_check, testgroup_sid); + + /* Query for that group, call a callback when command finishes */ + set_cmd_cb(test_nss_getsidbyname_group_check); + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with EOK */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, EOK); +} + +void test_nss_getsidbygid_group(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testgroup_sid = "S-1-2-3-5"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testgroup_sid); + assert_int_equal(ret, EOK); + + ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_group, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 5555); + will_return(__wrap_sss_packet_get_cmd, SSS_NSS_GETSIDBYGID); + will_return(__wrap_sss_packet_get_body, WRAP_CALL_REAL); + + will_return(test_nss_getsidbyname_group_check, testgroup_sid); + + /* Query for that user, call a callback when command finishes */ + set_cmd_cb(test_nss_getsidbyname_group_check); + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYGID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with EOK */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, EOK); +} + +void test_nss_getsidbyuid_no_user(void **state) +{ + errno_t ret; + struct sysdb_attrs *attrs; + const char *testgroup_sid = "S-1-2-3-5"; + + attrs = sysdb_new_attrs(nss_test_ctx); + assert_non_null(attrs); + + ret = sysdb_attrs_add_string(attrs, SYSDB_SID_STR, testgroup_sid); + assert_int_equal(ret, EOK); + + ret = store_group(nss_test_ctx, nss_test_ctx->tctx->dom, + &sid_group, attrs, 0); + assert_int_equal(ret, EOK); + + mock_input_id(nss_test_ctx, 5555); + mock_account_recv_simple(); + set_cmd_cb(NULL); + + /* Query for that user, call a callback when command finishes */ + ret = sss_cmd_execute(nss_test_ctx->cctx, SSS_NSS_GETSIDBYUID, + nss_test_ctx->nss_cmds); + assert_int_equal(ret, EOK); + + /* Wait until the test finishes with ENOENT (because there is no such + * user) */ + ret = test_ev_loop(nss_test_ctx->tctx); + assert_int_equal(ret, ENOENT); +} + void test_nss_getsidbyupn(void **state) { errno_t ret; @@ -4835,6 +5094,20 @@ int main(int argc, const char *argv[]) nss_subdom_test_teardown), cmocka_unit_test_setup_teardown(test_nss_getsidbyname, nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbyid, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbyuid, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbygid_no_group, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbyname_group, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbyid_group, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbygid_group, + nss_test_setup, nss_test_teardown), + cmocka_unit_test_setup_teardown(test_nss_getsidbyuid_no_user, + nss_test_setup, nss_test_teardown), cmocka_unit_test_setup_teardown(test_nss_getsidbyupn, nss_test_setup, nss_test_teardown), cmocka_unit_test_setup_teardown(test_nss_getsidbyname_neg,