/* ID mapping - bug in computing max id for slice range */ void test_map_id_2922(void **state) { const char* TEST_2922_FIRST_SID = TEST_DOM_SID"-0"; /* Last SID = first SID + (default) rangesize -1 */ const char* TEST_2922_LAST_SID = TEST_DOM_SID"-199999"; /* Last SID = first SID + rangesize */ const char* TEST_2922_LAST_SID_PLUS_ONE = TEST_DOM_SID"-200000"; struct test_ctx *test_ctx; enum idmap_error_code err; uint32_t id; char *sid = NULL; test_ctx = talloc_get_type(*state, struct test_ctx); assert_non_null(test_ctx); /* Min UNIX ID to SID */ err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MIN_ID, &sid); assert_int_equal(err, IDMAP_SUCCESS); assert_string_equal(sid, TEST_2922_FIRST_SID); sss_idmap_free_sid(test_ctx->idmap_ctx, sid); /* First SID to UNIX ID */ err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_FIRST_SID, &id); assert_int_equal(err, IDMAP_SUCCESS); assert_int_equal(id, TEST_2922_MIN_ID); /* Max UNIX ID to SID */ err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID, &sid); assert_int_equal(err, IDMAP_SUCCESS); assert_string_equal(sid, TEST_2922_LAST_SID); sss_idmap_free_sid(test_ctx->idmap_ctx, sid); /* Last SID to UNIX ID */ err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_LAST_SID, &id); assert_int_equal(err, IDMAP_SUCCESS); assert_int_equal(id, TEST_2922_MAX_ID); /* Max UNIX ID + 1 to SID */ err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_2922_MAX_ID + 1, &sid); assert_int_equal(err, IDMAP_NO_DOMAIN); /* Last SID + 1 to UNIX ID */ err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_2922_LAST_SID_PLUS_ONE, &id); /* Auto adding new ranges is disable in this test. */ assert_int_equal(err, IDMAP_NO_RANGE); }
void test_map_id_sec_slices(void **state) { struct test_ctx *test_ctx; enum idmap_error_code err; uint32_t id; char *sid = NULL; test_ctx = talloc_get_type(*state, struct test_ctx); assert_non_null(test_ctx); err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"1-1", &id); assert_int_equal(err, IDMAP_NO_DOMAIN); err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"-4000000", &id); assert_int_equal(err, IDMAP_SUCCESS); assert_int_equal(id, 575600000); err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, TEST_OFFSET - 1, &sid); assert_int_equal(err, IDMAP_NO_DOMAIN); err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"-0", &id); assert_int_equal(err, IDMAP_SUCCESS); assert_int_equal(id, TEST_RANGE_MIN); err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, id, &sid); assert_int_equal(err, IDMAP_SUCCESS); assert_string_equal(sid, TEST_DOM_SID"-0"); sss_idmap_free_sid(test_ctx->idmap_ctx, sid); err = sss_idmap_sid_to_unix(test_ctx->idmap_ctx, TEST_DOM_SID"-"TEST_OFFSET_STR, &id); assert_int_equal(err, IDMAP_SUCCESS); assert_int_equal(id, TEST_RANGE_MIN+TEST_OFFSET); err = sss_idmap_unix_to_sid(test_ctx->idmap_ctx, id, &sid); assert_int_equal(err, IDMAP_SUCCESS); assert_string_equal(sid, TEST_DOM_SID"-"TEST_OFFSET_STR); sss_idmap_free_sid(test_ctx->idmap_ctx, sid); }
static errno_t add_sids_from_rid_array_to_hash_table(struct dom_sid *dom_sid, struct samr_RidWithAttributeArray *groups, struct sss_idmap_ctx *idmap_ctx, hash_table_t *sid_table) { enum idmap_error_code err; char *dom_sid_str = NULL; size_t dom_sid_str_len; char *sid_str = NULL; char *rid_start; hash_key_t key; hash_value_t value; int ret; size_t c; TALLOC_CTX *tmp_ctx = NULL; tmp_ctx = talloc_new(NULL); if (tmp_ctx == NULL) { DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n"); return ENOMEM; } key.type = HASH_KEY_STRING; value.type = HASH_VALUE_ULONG; err = sss_idmap_smb_sid_to_sid(idmap_ctx, dom_sid, &dom_sid_str); if (err != IDMAP_SUCCESS) { DEBUG(SSSDBG_OP_FAILURE, "sss_idmap_smb_sid_to_sid failed.\n"); ret = EFAULT; goto done; } dom_sid_str_len = strlen(dom_sid_str); sid_str = talloc_zero_size(tmp_ctx, dom_sid_str_len + 12); if (sid_str == NULL) { DEBUG(SSSDBG_OP_FAILURE, "talloc_zero_size failed.\n"); ret = ENOMEM; goto done; } rid_start = sid_str + dom_sid_str_len; memcpy(sid_str, dom_sid_str, dom_sid_str_len); for (c = 0; c < groups->count; c++) { memset(rid_start, '\0', 12); ret = snprintf(rid_start, 12, "-%lu", (unsigned long) groups->rids[c].rid); if (ret < 0 || ret > 12) { DEBUG(SSSDBG_OP_FAILURE, "snprintf failed.\n"); ret = EIO; goto done; } key.str = sid_str; value.ul = 0; ret = hash_enter(sid_table, &key, &value); if (ret != HASH_SUCCESS) { DEBUG(SSSDBG_OP_FAILURE, "hash_enter failed [%d][%s].\n", ret, hash_error_string(ret)); ret = EIO; goto done; } } ret = EOK; done: sss_idmap_free_sid(idmap_ctx, dom_sid_str); talloc_free(tmp_ctx); return ret; }