void test_sss_idmap_calculate_range_slice_collision(void **state) { struct test_ctx *test_ctx; enum idmap_error_code err; struct sss_idmap_range range; id_t slice_num = 123; test_ctx = talloc_get_type(*state, struct test_ctx); assert_non_null(test_ctx); err = sss_idmap_calculate_range(test_ctx->idmap_ctx, NULL, &slice_num, &range); assert_int_equal(err, IDMAP_SUCCESS); err = sss_idmap_add_domain_ex(test_ctx->idmap_ctx, TEST_DOM_NAME, TEST_DOM_SID, &range, NULL, 0, false); assert_int_equal(err, IDMAP_SUCCESS); err = sss_idmap_calculate_range(test_ctx->idmap_ctx, NULL, &slice_num, &range); assert_int_equal(err, IDMAP_COLLISION); slice_num++; err = sss_idmap_calculate_range(test_ctx->idmap_ctx, NULL, &slice_num, &range); assert_int_equal(err, IDMAP_SUCCESS); }
static int setup_ranges_2922(struct test_ctx *test_ctx) { const int TEST_2922_DFL_SLIDE = 9212; struct sss_idmap_range range; enum idmap_error_code err; const char *name; const char *sid; /* Pick a new slice. */ id_t slice_num = -1; assert_non_null(test_ctx); name = TEST_DOM_NAME; sid = TEST_DOM_SID; err = sss_idmap_calculate_range(test_ctx->idmap_ctx, sid, &slice_num, &range); assert_int_equal(err, IDMAP_SUCCESS); /* Range computation should be deterministic. Lets validate that. */ assert_int_equal(range.min, TEST_2922_MIN_ID); assert_int_equal(range.max, TEST_2922_MAX_ID); assert_int_equal(slice_num, TEST_2922_DFL_SLIDE); err = sss_idmap_add_domain_ex(test_ctx->idmap_ctx, name, sid, &range, NULL, 0, false /* No external mapping */); assert_int_equal(err, IDMAP_SUCCESS); return 0; }
errno_t sdap_idmap_add_domain(struct sdap_idmap_ctx *idmap_ctx, const char *dom_name, const char *dom_sid, id_t slice) { errno_t ret; struct sss_idmap_range range; enum idmap_error_code err; id_t idmap_upper; ret = sss_idmap_ctx_get_upper(idmap_ctx->map, &idmap_upper); if (ret != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to get upper bound of available ID range.\n")); ret = EIO; goto done; } ret = sss_idmap_calculate_range(idmap_ctx->map, dom_sid, &slice, &range); if (ret != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to calculate range for domain [%s]: [%d]\n", dom_name, ret)); ret = EIO; goto done; } DEBUG(SSSDBG_TRACE_LIBS, ("Adding domain [%s] as slice [%llu]\n", dom_sid, slice)); if (range.max > idmap_upper) { /* This should never happen */ DEBUG(SSSDBG_CRIT_FAILURE, ("BUG: Range maximum exceeds the global maximum: %d > %d\n", range.max, idmap_upper)); ret = EINVAL; goto done; } /* Add this domain to the map */ err = sss_idmap_add_domain(idmap_ctx->map, dom_name, dom_sid, &range); if (err != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, ("Could not add domain [%s] to the map: [%d]\n", dom_name, err)); ret = EIO; goto done; } /* Add this domain to the SYSDB cache so it will survive reboot */ ret = sysdb_idmap_store_mapping(idmap_ctx->id_ctx->be->domain->sysdb, idmap_ctx->id_ctx->be->domain, dom_name, dom_sid, slice); done: return ret; }
errno_t sdap_idmap_add_domain(struct sdap_idmap_ctx *idmap_ctx, const char *dom_name, const char *dom_sid, id_t slice) { errno_t ret; struct sss_idmap_range range; enum idmap_error_code err; id_t idmap_upper; bool external_mapping = true; ret = sss_idmap_ctx_get_upper(idmap_ctx->map, &idmap_upper); if (ret != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to get upper bound of available ID range.\n"); ret = EIO; goto done; } if (dp_opt_get_bool(idmap_ctx->id_ctx->opts->basic, SDAP_ID_MAPPING)) { external_mapping = false; ret = sss_idmap_calculate_range(idmap_ctx->map, dom_sid, &slice, &range); if (ret != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, "Failed to calculate range for domain [%s]: [%d]\n", dom_name, ret); ret = EIO; goto done; } DEBUG(SSSDBG_TRACE_LIBS, "Adding domain [%s] as slice [%"SPRIid"]\n", dom_sid, slice); if (range.max > idmap_upper) { /* This should never happen */ DEBUG(SSSDBG_CRIT_FAILURE, "BUG: Range maximum exceeds the global maximum: " "%u > %"SPRIid"\n", range.max, idmap_upper); ret = EINVAL; goto done; } } else { ret = sdap_idmap_get_configured_external_range(idmap_ctx, &range); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "sdap_idmap_get_configured_external_range failed.\n"); return ret; } } /* Add this domain to the map */ err = sss_idmap_add_domain_ex(idmap_ctx->map, dom_name, dom_sid, &range, NULL, 0, external_mapping); if (err != IDMAP_SUCCESS) { DEBUG(SSSDBG_CRIT_FAILURE, "Could not add domain [%s] to the map: [%d]\n", dom_name, err); ret = EIO; goto done; } /* If algorithmic mapping is used add this domain to the SYSDB cache so it * will survive reboot */ if (!external_mapping) { ret = sysdb_idmap_store_mapping(idmap_ctx->id_ctx->be->domain, dom_name, dom_sid, slice); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "sysdb_idmap_store_mapping failed.\n"); goto done; } } done: return ret; }