diff options
Diffstat (limited to 'src/tests/pac_responder-tests.c')
-rw-r--r-- | src/tests/pac_responder-tests.c | 524 |
1 files changed, 0 insertions, 524 deletions
diff --git a/src/tests/pac_responder-tests.c b/src/tests/pac_responder-tests.c deleted file mode 100644 index ed8c9170..00000000 --- a/src/tests/pac_responder-tests.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - SSSD - Test for PAC reponder functions - - Authors: - Sumit Bose <sbose@redhat.com> - - Copyright (C) 2012 Red Hat - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <check.h> - -#include <stdbool.h> -#include <math.h> -#include <util/data_blob.h> -#include <gen_ndr/security.h> - -#include "tests/common_check.h" -#include "responder/pac/pacsrv.h" -#include "lib/idmap/sss_idmap.h" - -struct dom_sid test_dom_sid = {1, 4, {0, 0, 0, 0, 0, 5}, - {21, 2127521184, 1604012920, 1887927527, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -const char *test_dom_sid_str = "S-1-5-21-2127521184-1604012920-1887927527"; - -struct dom_sid test_remote_dom_sid = {1, 4, {0, 0, 0, 0, 0, 5}, - {21, 123, 456, 789, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -const char *test_remote_dom_sid_str = "S-1-5-21-123-456-789"; - -struct dom_sid test_smb_sid = {1, 5, {0, 0, 0, 0, 0, 5}, - {21, 2127521184, 1604012920, 1887927527, 1123, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -const uint32_t test_id = 1200123; - -struct dom_sid test_smb_sid_2nd = {1, 5, {0, 0, 0, 0, 0, 5}, - {21, 2127521184, 1604012920, 1887927527, 201456, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; -const uint32_t test_id_2nd = 1200456; - -struct local_mapping_ranges test_map = {{1200000, 1399999}, - {1000, 200999}, - {201000, 400999}}; - -static void *idmap_talloc(size_t size, void *pvt) -{ - return talloc_size(pvt, size); -} - -static void idmap_talloc_free(void *ptr, void *pvt) -{ - talloc_free(ptr); -} - -struct pac_ctx *pac_ctx; - -#define IDMAP_RANGE_MIN 1234 -#define IDMAP_RANGE_MAX 9876543 - -void pac_setup(void) { - enum idmap_error_code err; - struct sss_idmap_range remote_range = {IDMAP_RANGE_MIN, IDMAP_RANGE_MAX}; - struct sss_domain_info *sd; - - pac_ctx = talloc_zero(global_talloc_context, struct pac_ctx); - fail_unless(pac_ctx != NULL, "talloc_zero failed.\n"); - - pac_ctx->rctx = talloc_zero(pac_ctx, struct resp_ctx); - fail_unless(pac_ctx->rctx != NULL, "talloc_zero failed."); - - pac_ctx->rctx->domains = talloc_zero(pac_ctx->rctx, struct sss_domain_info); - fail_unless(pac_ctx->rctx->domains != NULL, "talloc_zero failed."); - - pac_ctx->rctx->domains->name = talloc_strdup(pac_ctx->rctx->domains, - "TEST.DOM"); - fail_unless(pac_ctx->rctx->domains->name != NULL, "talloc_strdup failed."); - - pac_ctx->rctx->domains->flat_name = talloc_strdup(pac_ctx->rctx->domains, - "TESTDOM"); - fail_unless(pac_ctx->rctx->domains->flat_name != NULL, - "talloc_strdup failed."); - - pac_ctx->rctx->domains->domain_id = talloc_strdup(pac_ctx->rctx->domains, - test_dom_sid_str); - fail_unless(pac_ctx->rctx->domains->domain_id != NULL, - "talloc_strdup failed."); - - sd = talloc_zero(pac_ctx->rctx->domains, struct sss_domain_info); - fail_unless(sd != NULL, "talloc_zero failed."); - - sd->name = talloc_strdup(sd, "remote.dom"); - fail_unless(sd->name != NULL, "talloc_strdup failed"); - - sd->flat_name = talloc_strdup(sd, "REMOTEDOM"); - fail_unless(sd->flat_name != NULL, "talloc_strdup failed"); - - sd->domain_id = talloc_strdup(sd, test_remote_dom_sid_str); - fail_unless(sd->domain_id != NULL, "talloc_strdup failed"); - - pac_ctx->rctx->domains->subdomains = sd; - - err = sss_idmap_init(idmap_talloc, pac_ctx, idmap_talloc_free, - &pac_ctx->idmap_ctx); - - fail_unless(err == IDMAP_SUCCESS, "sss_idmap_init failed."); - fail_unless(pac_ctx->idmap_ctx != NULL, "sss_idmap_init returned NULL."); - - err = sss_idmap_add_domain(pac_ctx->idmap_ctx, "remote.dom", - test_remote_dom_sid_str, &remote_range); - - pac_ctx->my_dom_sid = &test_dom_sid; - - pac_ctx->range_map = &test_map; -} - -void pac_teardown(void) -{ - talloc_free(pac_ctx); -} - - -START_TEST(pac_test_local_sid_to_id) -{ - int ret; - uint32_t id; - - ret = local_sid_to_id(&test_map, &test_smb_sid, &id); - fail_unless(ret == EOK, - "Failed to convert local sid to id."); - fail_unless(id == test_id, "Wrong id returne, expected [%d], got [%d].", - test_id, id); -} -END_TEST - -START_TEST(pac_test_seondary_local_sid_to_id) -{ - int ret; - uint32_t id; - - ret = local_sid_to_id(&test_map, &test_smb_sid_2nd, &id); - fail_unless(ret == EOK, - "Failed to convert local sid to id."); - fail_unless(id == test_id_2nd, "Wrong id returne, expected [%d], got [%d].", - test_id_2nd, id); -} -END_TEST - -START_TEST(pac_test_get_gids_to_add_and_remove) -{ - TALLOC_CTX *mem_ctx; - int ret; - size_t c; - size_t add_gid_count = 0; - struct pac_dom_grps *add_gids = NULL; - size_t del_gid_count = 0; - struct grp_info **del_gids = NULL; - struct sss_domain_info grp_dom; - - memset(&grp_dom, 0, sizeof(grp_dom)); - - gid_t gid_list_2[] = {2}; - gid_t gid_list_3[] = {3}; - gid_t gid_list_23[] = {2, 3}; - struct pac_dom_grps empty_dom = {NULL, 0, NULL}; - - struct pac_dom_grps pac_grp_2 = {&grp_dom, 1, gid_list_2}; - struct pac_dom_grps pac_grp_3 = {&grp_dom, 1, gid_list_3}; - struct pac_dom_grps pac_grp_23 = {&grp_dom, 2, gid_list_23}; - - struct pac_dom_grps dom_grp_list_2[] = {pac_grp_2, empty_dom}; - struct pac_dom_grps dom_grp_list_3[] = {pac_grp_3, empty_dom}; - struct pac_dom_grps dom_grp_list_23[] = {pac_grp_23, empty_dom}; - - struct grp_info grp_info_1 = {1, NULL, NULL}; - struct grp_info grp_info_2 = {2, NULL, NULL}; - struct grp_info grp_list_1[] = {grp_info_1}; - struct grp_info grp_list_12[] = {grp_info_1, grp_info_2}; - - struct a_and_r_data { - size_t cur_gid_count; - struct grp_info *cur_gids; - size_t gid_count; - struct pac_dom_grps *gids; - int exp_ret; - size_t exp_add_gid_count; - struct pac_dom_grps *exp_add_gids; - size_t exp_del_gid_count; - struct grp_info *exp_del_gids; - } a_and_r_data[] = { - {1, grp_list_1, 1, dom_grp_list_2, EOK, 1, dom_grp_list_2, 1, grp_list_1}, - {1, grp_list_1, 0, NULL, EOK, 0, NULL, 1, grp_list_1}, - {0, NULL, 1, dom_grp_list_2, EOK, 1, dom_grp_list_2, 0, NULL}, - {2, grp_list_12, 1, dom_grp_list_2, EOK, 0, NULL, 1, grp_list_1}, - {2, grp_list_12, 2, dom_grp_list_23, EOK, 1, dom_grp_list_3, 1, grp_list_1}, - {0, NULL, 0, NULL, 0, 0, NULL, 0, NULL} - }; - - mem_ctx = talloc_new(NULL); - fail_unless(mem_ctx != NULL, "talloc_new failed."); - - ret = diff_gid_lists(mem_ctx, 0, NULL, 0, NULL, - &add_gid_count, &add_gids, - &del_gid_count, &del_gids); - fail_unless(ret == EOK, "get_gids_to_add_and_remove failed with empty " \ - "groups."); - - ret = diff_gid_lists(mem_ctx, 1, NULL, 0, NULL, - &add_gid_count, &add_gids, - &del_gid_count, &del_gids); - fail_unless(ret == EINVAL, "get_gids_to_add_and_remove failed with " \ - "invalid current groups."); - - ret = diff_gid_lists(mem_ctx, 0, NULL, 1, NULL, - &add_gid_count, &add_gids, - &del_gid_count, &del_gids); - fail_unless(ret == EINVAL, "get_gids_to_add_and_remove failed with " \ - "invalid new groups."); - - for (c = 0; a_and_r_data[c].cur_gids != NULL || - a_and_r_data[c].gids != NULL; c++) { - ret = diff_gid_lists(mem_ctx, - a_and_r_data[c].cur_gid_count, - a_and_r_data[c].cur_gids, - a_and_r_data[c].gid_count, - a_and_r_data[c].gids, - &add_gid_count, &add_gids, - &del_gid_count, &del_gids); - fail_unless(ret == a_and_r_data[c].exp_ret, - "Unexpected return value for test data #%d, " \ - "expected [%d], got [%d]", - c, a_and_r_data[c].exp_ret, ret); - fail_unless(add_gid_count == a_and_r_data[c].exp_add_gid_count, - "Unexpected numer of groups to add for test data #%d, " \ - "expected [%d], got [%d]", - c, a_and_r_data[c].exp_add_gid_count, add_gid_count); - fail_unless(del_gid_count == a_and_r_data[c].exp_del_gid_count, - "Unexpected numer of groups to delete for test data #%d, " \ - "expected [%d], got [%d]", - c, a_and_r_data[c].exp_del_gid_count, del_gid_count); - - /* The lists might be returned in any order, to make tests simple we - * only look at lists with 1 element. TODO: add code to compare lists - * with more than 1 member. */ - if (add_gid_count == 1) { - fail_unless(add_gids[0].gids[0] == a_and_r_data[c].exp_add_gids[0].gids[0], - "Unexpected gid to add for test data #%d, " \ - "expected [%d], got [%d]", - c, a_and_r_data[c].exp_add_gids[0].gids[0], add_gids[0].gids[0]); - } - - if (del_gid_count == 1) { - fail_unless(del_gids[0]->gid == a_and_r_data[c].exp_del_gids[0].gid, - "Unexpected gid to delete for test data #%d, " \ - "expected [%d], got [%d]", - c, a_and_r_data[c].exp_del_gids[0].gid, - del_gids[0]->gid); - } - } - - talloc_free(mem_ctx); -} -END_TEST - -#define NUM_DOMAINS 10 -START_TEST(pac_test_find_domain_by_id) -{ - struct sss_domain_info *domains; - struct sss_domain_info *dom; - size_t c; - char *id; - - dom = find_domain_by_id(NULL, NULL); - fail_unless(dom == NULL, "Domain returned without any input."); - - dom = find_domain_by_id(NULL, "id"); - fail_unless(dom == NULL, "Domain returned without domain list."); - - domains = NULL; - for (c = 0; c < NUM_DOMAINS; c++) { - dom = talloc_zero(domains, struct sss_domain_info); - fail_unless(dom != NULL, "talloc_zero failed."); - - dom->domain_id = talloc_asprintf(dom, "ID-of-domains-%zu", c); - fail_unless(dom->domain_id != NULL, "talloc_aprintf failed."); - - DLIST_ADD(domains, dom); - } - - dom = find_domain_by_id(domains, NULL); - fail_unless(dom == NULL, "Domain returned without search domain."); - - dom = find_domain_by_id(domains, "DOES-NOT_EXISTS"); - fail_unless(dom == NULL, "Domain returned with non existing id."); - - for (c = 0; c < NUM_DOMAINS; c++) { - id = talloc_asprintf(global_talloc_context, "ID-of-domains-%zu", c); - fail_unless(id != NULL, "talloc_asprintf failed.\n"); - - dom = find_domain_by_id(domains, id); - fail_unless(dom != NULL, "Domain %zu not found by id.", c); - fail_unless((strcmp(dom->domain_id, id) == 0), - "Wrong domain returned for id [%s].", id); - - talloc_free(id); - } - - talloc_free(domains); -} -END_TEST - -START_TEST(pac_test_get_gids_from_pac) -{ - int ret; - size_t c; - size_t d; - size_t g; - size_t t; - size_t gid_count; - struct pac_dom_grps *gids; - struct PAC_LOGON_INFO *logon_info; - bool found; - gid_t exp_gid; - struct timeval start_time; - struct timeval end_time; - struct timeval diff_time; - - ret = get_gids_from_pac(NULL, NULL, NULL, NULL, NULL, NULL, NULL); - fail_unless(ret == EINVAL, "Unexpected return value for NULL parameters"); - - logon_info = talloc_zero(global_talloc_context, struct PAC_LOGON_INFO); - fail_unless(logon_info != NULL, "talloc_zero failed.\n"); - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EOK, "Failed with empty PAC"); - fail_unless(gid_count == 0, "O groups expected, got [%d]", gid_count); - fail_unless(gids == NULL, "Expected NULL gid array."); - - logon_info->info3.base.domain_sid = &test_smb_sid_2nd; /* unknown SID */ - logon_info->info3.base.groups.count = 10; - logon_info->info3.base.groups.rids = talloc_array(logon_info, - struct samr_RidWithAttribute, - logon_info->info3.base.groups.count); - fail_unless(logon_info->info3.base.groups.rids != NULL, "talloc_array failed."); - - for (c = 0; c < logon_info->info3.base.groups.count; c++) { - logon_info->info3.base.groups.rids[c].rid = 500 + c; - } - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EINVAL, "Unexpected return code [%d] with unknown SID.", - ret); - - /* change SID to a known one */ - logon_info->info3.base.domain_sid = &test_remote_dom_sid; - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EOK, "Failed with 10 RIDs in PAC"); - fail_unless(gid_count == logon_info->info3.base.groups.count, - "[%d] groups expected, got [%d]", - logon_info->info3.base.groups.count, gid_count); - fail_unless(gids != NULL, "Expected gid array."); - - for (c = 0; c < logon_info->info3.base.groups.count; c++) { - found = false; - exp_gid = IDMAP_RANGE_MIN + 500 + c; - for (g = 0; g < gid_count; g++) { - if (gids[1].gids[g] == exp_gid) { - found = true; - break; - } - } - fail_unless(found, "[%d] not found in group list", exp_gid); - } - - talloc_free(gids); - gids = NULL; - - /* duplicated RIDs */ - for (c = 0; c < logon_info->info3.base.groups.count; c++) { - logon_info->info3.base.groups.rids[c].rid = 500; - } - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EOK, "Failed with 10 duplicated RIDs in PAC"); - fail_unless(gid_count == 1, "[%d] groups expected, got [%d]", 1, gid_count); - fail_unless(gids != NULL, "Expected gid array."); - fail_unless(gids[1].gids[0] == IDMAP_RANGE_MIN + 500, - "Wrong gid returned, got [%d], expected [%d].", gids[1].gids[0], - IDMAP_RANGE_MIN + 500); - talloc_free(gids); - gids = NULL; - - logon_info->info3.sidcount = 2; - logon_info->info3.sids = talloc_zero_array(logon_info, struct netr_SidAttr, - logon_info->info3.sidcount); - fail_unless(logon_info->info3.sids != NULL, "talloc_zero_array failed."); - - logon_info->info3.sids[0].sid = &test_smb_sid; - logon_info->info3.sids[1].sid = &test_smb_sid_2nd; - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EOK, "Failed with 10 duplicated RIDs and local SIDS in PAC"); - fail_unless(gid_count == 3, "[%d] groups expected, got [%d]", 3, gid_count); - fail_unless(gids != NULL, "Expected gid array."); - - gid_t exp_gids[] = {IDMAP_RANGE_MIN + 500, test_id, test_id_2nd, 0}; - - for (c = 0; exp_gids[c] != 0; c++) { - found = false; - for (d = 0; d < 2; d++) { - for (g = 0; g < gids[d].gid_count; g++) { - if (gids[d].gids[g] == exp_gids[c]) { - found = true; - break; - } - } - if (found) { - break; - } - } - fail_unless(found, "[%d] not found in group list", exp_gids[c]); - } - - talloc_free(gids); - gids = NULL; - - talloc_free(logon_info->info3.base.groups.rids); - - for (t = 0; t < 7; t++) { - logon_info->info3.base.groups.count = powl(10, t); - logon_info->info3.base.groups.rids = talloc_array(logon_info, - struct samr_RidWithAttribute, - logon_info->info3.base.groups.count); - fail_unless(logon_info->info3.base.groups.rids != NULL, "talloc_array failed."); - - for (c = 0; c < logon_info->info3.base.groups.count; c++) { - logon_info->info3.base.groups.rids[c].rid = 500 + c; - } - - ret = gettimeofday(&start_time, NULL); - fail_unless(ret == 0, "gettimeofday failed."); - - ret = get_gids_from_pac(global_talloc_context, pac_ctx, pac_ctx->range_map, - pac_ctx->my_dom_sid, logon_info, &gid_count, &gids); - fail_unless(ret == EOK, "Unexpected return code [%d].", ret); - - ret = gettimeofday(&end_time, NULL); - fail_unless(ret == 0, "gettimeofday failed."); - - timersub(&end_time, &start_time, &diff_time); - fprintf(stderr, "Testcase [%zu], number of groups [%u], " \ - "duration [%ds %dus]\n", t, - logon_info->info3.base.groups.count, - (int) diff_time.tv_sec, - (int) diff_time.tv_usec); - - talloc_free(gids); - gids = NULL; - - talloc_free(logon_info->info3.base.groups.rids); - } - - talloc_free(logon_info); -} -END_TEST - -Suite *idmap_test_suite (void) -{ - Suite *s = suite_create ("PAC responder"); - - TCase *tc_pac = tcase_create("PAC responder tests"); - tcase_add_checked_fixture(tc_pac, - ck_leak_check_setup, - ck_leak_check_teardown); - - tcase_add_checked_fixture(tc_pac, - pac_setup, - pac_teardown); - - tcase_add_test(tc_pac, pac_test_local_sid_to_id); - tcase_add_test(tc_pac, pac_test_seondary_local_sid_to_id); - tcase_add_test(tc_pac, pac_test_get_gids_to_add_and_remove); - tcase_add_test(tc_pac, pac_test_find_domain_by_id); - tcase_add_test(tc_pac, pac_test_get_gids_from_pac); - - suite_add_tcase(s, tc_pac); - - return s; -} - -int main(int argc, const char *argv[]) -{ - int number_failed; - - tests_set_cwd(); - - Suite *s = idmap_test_suite(); - SRunner *sr = srunner_create(s); - - /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */ - srunner_run_all(sr, CK_ENV); - number_failed = srunner_ntests_failed (sr); - srunner_free (sr); - - return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; -} |