From a5c75692c17498a61babb7045db2dc3f25b0d1af Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Thu, 24 Oct 2013 11:44:11 +0200 Subject: idmap: add sss_idmap_domain_by_name_has_algorithmic_mapping() --- Makefile.am | 2 +- src/lib/idmap/sss_idmap.c | 33 +++++++++++++++++++++++++++++ src/lib/idmap/sss_idmap.h | 44 +++++++++++++++++++++++++++++++++++---- src/tests/cmocka/test_sss_idmap.c | 41 ++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 5 deletions(-) diff --git a/Makefile.am b/Makefile.am index e964a2461..0c33f4617 100644 --- a/Makefile.am +++ b/Makefile.am @@ -609,7 +609,7 @@ libsss_idmap_la_SOURCES = \ src/lib/idmap/sss_idmap_conv.c \ src/util/murmurhash3.c libsss_idmap_la_LDFLAGS = \ - -version-info 1:0:1 + -version-info 2:0:2 dist_pkgconfig_DATA += src/sss_client/idmap/sss_nss_idmap.pc libsss_nss_idmap_la_SOURCES = \ diff --git a/src/lib/idmap/sss_idmap.c b/src/lib/idmap/sss_idmap.c index 17bd5779e..9278e10d2 100644 --- a/src/lib/idmap/sss_idmap.c +++ b/src/lib/idmap/sss_idmap.c @@ -953,3 +953,36 @@ sss_idmap_domain_has_algorithmic_mapping(struct sss_idmap_ctx *ctx, return IDMAP_SID_UNKNOWN; } + +enum idmap_error_code +sss_idmap_domain_by_name_has_algorithmic_mapping(struct sss_idmap_ctx *ctx, + const char *dom_name, + bool *has_algorithmic_mapping) +{ + struct idmap_domain_info *idmap_domain_info; + + if (dom_name == NULL) { + return IDMAP_ERROR; + } + + CHECK_IDMAP_CTX(ctx, IDMAP_CONTEXT_INVALID); + + if (ctx->idmap_domain_info == NULL) { + return IDMAP_NO_DOMAIN; + } + + idmap_domain_info = ctx->idmap_domain_info; + + while (idmap_domain_info != NULL) { + if (idmap_domain_info->name != NULL + && strcmp(dom_name, idmap_domain_info->name) == 0) { + + *has_algorithmic_mapping = !idmap_domain_info->external_mapping; + return IDMAP_SUCCESS; + } + + idmap_domain_info = idmap_domain_info->next; + } + + return IDMAP_NAME_UNKNOWN; +} diff --git a/src/lib/idmap/sss_idmap.h b/src/lib/idmap/sss_idmap.h index 91e5d0bf3..4101fb9a5 100644 --- a/src/lib/idmap/sss_idmap.h +++ b/src/lib/idmap/sss_idmap.h @@ -81,7 +81,10 @@ enum idmap_error_code { IDMAP_COLLISION, /** External source should be consulted for idmapping */ - IDMAP_EXTERNAL + IDMAP_EXTERNAL, + + /** The provided name was not found */ + IDMAP_NAME_UNKNOWN }; /** @@ -524,17 +527,50 @@ bool is_domain_sid(const char *str); /** * @brief Check if a domain is configured with algorithmic mapping * - * @param[in] ctx Idmap context - * @param[in] dom_sid SID string, can be either a domain SID or an object SID + * @param[in] ctx Idmap context + * @param[in] dom_sid SID string, can be either a domain SID + * or an object SID + * @param[out] has_algorithmic_mapping Boolean value indicating if the given + * domain is configured for algorithmic + * mapping or not. * * @return - * TODO .... + * - #IDMAP_SUCCESS: Domain for the given SID was found and + * has_algorithmic_mapping is set accordingly + * - #IDMAP_SID_INVALID: Provided SID is invalid + * - #IDMAP_CONTEXT_INVALID: Provided idmap context is invalid + * - #IDMAP_NO_DOMAIN: No domains are available in the idmap context + * - #IDMAP_SID_UNKNOWN: No domain with the given SID was found in the + * idmap context */ enum idmap_error_code sss_idmap_domain_has_algorithmic_mapping(struct sss_idmap_ctx *ctx, const char *dom_sid, bool *has_algorithmic_mapping); +/** + * @brief Check if a domain is configured with algorithmic mapping + * + * @param[in] ctx Idmap context + * @param[in] dom_name Name of the domain + * @param[out] has_algorithmic_mapping Boolean value indicating if the given + * domain is configured for algorithmic + * mapping or not. + * + * @return + * - #IDMAP_SUCCESS: Domain for the given name was found and + * has_algorithmic_mapping is set accordingly + * - #IDMAP_ERROR: Provided name is invalid + * - #IDMAP_CONTEXT_INVALID: Provided idmap context is invalid + * - #IDMAP_NO_DOMAIN: No domains are available in the idmap context + * - #IDMAP_NAME_UNKNOWN: No domain with the given name was found in the + * idmap context + */ +enum idmap_error_code +sss_idmap_domain_by_name_has_algorithmic_mapping(struct sss_idmap_ctx *ctx, + const char *dom_name, + bool *has_algorithmic_mapping); + /** * @brief Convert binary SID to SID structure * diff --git a/src/tests/cmocka/test_sss_idmap.c b/src/tests/cmocka/test_sss_idmap.c index 2f6a67d7d..53ed35a97 100644 --- a/src/tests/cmocka/test_sss_idmap.c +++ b/src/tests/cmocka/test_sss_idmap.c @@ -367,6 +367,44 @@ void test_has_algorithmic(void **state) assert_false(use_id_mapping); } +void test_has_algorithmic_by_name(void **state) +{ + struct test_ctx *test_ctx; + bool use_id_mapping; + enum idmap_error_code err; + + test_ctx = talloc_get_type(*state, struct test_ctx); + + assert_non_null(test_ctx); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(NULL, NULL, &use_id_mapping); + assert_int_equal(err, IDMAP_ERROR); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(NULL, TEST_DOM_SID, + &use_id_mapping); + assert_int_equal(err, IDMAP_CONTEXT_INVALID); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(test_ctx->idmap_ctx, NULL, + &use_id_mapping); + assert_int_equal(err, IDMAP_ERROR); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(test_ctx->idmap_ctx, + TEST_DOM_NAME"1", + &use_id_mapping); + assert_int_equal(err, IDMAP_NAME_UNKNOWN); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(test_ctx->idmap_ctx, + TEST_DOM_NAME, + &use_id_mapping); + assert_int_equal(err, IDMAP_SUCCESS); + assert_true(use_id_mapping); + + err = sss_idmap_domain_by_name_has_algorithmic_mapping(test_ctx->idmap_ctx, + TEST_2_DOM_NAME, + &use_id_mapping); + assert_int_equal(err, IDMAP_SUCCESS); + assert_false(use_id_mapping); +} int main(int argc, const char *argv[]) { @@ -396,6 +434,9 @@ int main(int argc, const char *argv[]) unit_test_setup_teardown(test_has_algorithmic, test_sss_idmap_setup_with_both, test_sss_idmap_teardown), + unit_test_setup_teardown(test_has_algorithmic_by_name, + test_sss_idmap_setup_with_both, + test_sss_idmap_teardown), }; /* Set debug level to invalid value so we can deside if -d 0 was used. */ -- cgit