cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl/*
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl Authors:
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl Pavel Reichl <preichl@redhat.com>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl Copyright (C) 2013 Red Hat
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl SSSD tests - Search bases
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl This program is free software; you can redistribute it and/or modify
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl it under the terms of the GNU General Public License as published by
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl the Free Software Foundation; either version 3 of the License, or
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl (at your option) any later version.
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl This program is distributed in the hope that it will be useful,
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl but WITHOUT ANY WARRANTY; without even the implied warranty of
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl GNU General Public License for more details.
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl You should have received a copy of the GNU General Public License
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl along with this program. If not, see <http://www.gnu.org/licenses/>.
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl*/
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <stdarg.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <stdlib.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <stddef.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <setjmp.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <unistd.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <sys/types.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <cmocka.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include <ldap.h>
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "util/find_uid.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "util/sss_ldap.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "tests/common.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "providers/ldap/ldap_common.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "providers/ldap/sdap.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "dhash.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl#include "tests/common_check.h"
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlenum sss_test_get_by_dn {
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl DN_NOT_IN_DOMS, /* dn is not in any domain */
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl DN_IN_DOM1, /* dn is in the domain based on dns */
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl DN_IN_DOM2, /* dn is in the domain based on dns2 */
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlstatic struct sdap_search_base** generate_bases(TALLOC_CTX *mem_ctx,
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char** dns, size_t n)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_search_base **search_bases;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl errno_t err;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl int i;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl search_bases = talloc_array(mem_ctx, struct sdap_search_base *, n + 1);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(search_bases);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl for (i=0; i < n; ++i) {
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl err = sdap_create_search_base(mem_ctx, dns[i], LDAP_SCOPE_SUBTREE,
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl NULL, &search_bases[i]);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl if (err != EOK) {
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl fprintf(stderr, "Failed to create search base\n");
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl }
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_int_equal(err, EOK);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl }
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl search_bases[n] = NULL;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl return search_bases;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlstatic bool do_test_search_bases(const char* dn, const char** dns, size_t n)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl TALLOC_CTX *tmp_ctx;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_search_base **search_bases;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl bool ret;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl tmp_ctx = talloc_new(NULL);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(tmp_ctx);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl search_bases = generate_bases(tmp_ctx, dns, n);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl check_leaks_push(tmp_ctx);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ret = sss_ldap_dn_in_search_bases(tmp_ctx, dn, search_bases, NULL);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_true(check_leaks_pop(tmp_ctx) == true);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl talloc_free(tmp_ctx);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl return ret;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlvoid test_search_bases_fail(void **state)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dn = "cn=user, dc=sub, dc=ad, dc=pb";
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns[] = {"dc=example, dc=com", "dc=subdom, dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl bool ret;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ret = do_test_search_bases(dn, dns, 2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_false(ret);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlvoid test_search_bases_success(void **state)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dn = "cn=user, dc=sub, dc=ad, dc=pb";
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns[] = {"", "dc=ad, dc=pb", "dc=sub, dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl bool ret;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl ret = do_test_search_bases(dn, dns, 3);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_true(ret);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlstatic void do_test_get_by_dn(const char *dn, const char **dns, size_t n,
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char **dns2, size_t n2, int expected_result)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl TALLOC_CTX *tmp_ctx;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_options *opts;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_domain *sdom;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_domain *sdom2;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_domain *res_sdom;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_search_base **search_bases;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl struct sdap_search_base **search_bases2;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl tmp_ctx = talloc_new(NULL);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(tmp_ctx);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl search_bases = generate_bases(tmp_ctx, dns, n);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl search_bases2 = generate_bases(tmp_ctx, dns2, n2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom = talloc_zero(tmp_ctx, struct sdap_domain);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(sdom);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom2 = talloc_zero(tmp_ctx, struct sdap_domain);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(sdom2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom->search_bases = search_bases;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom->next = sdom2;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom->prev = NULL;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom2->search_bases = search_bases2;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom2->next = NULL;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl sdom2->prev = sdom;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl opts = talloc(tmp_ctx, struct sdap_options);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_non_null(opts);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl opts->sdom = sdom;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl res_sdom = sdap_domain_get_by_dn(opts, dn);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl switch (expected_result) {
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl case DN_NOT_IN_DOMS:
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_null(res_sdom);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl break;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl case DN_IN_DOM1:
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_true(res_sdom == sdom);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl break;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl case DN_IN_DOM2:
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl assert_true(res_sdom == sdom2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl break;
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl }
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl talloc_free(tmp_ctx);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlvoid test_get_by_dn(void **state)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dn = "cn=user, dc=sub, dc=ad, dc=pb";
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns[] = {"dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns2[] = {"dc=sub, dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl do_test_get_by_dn(dn, dns, 1, dns2, 1, DN_IN_DOM2);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlvoid test_get_by_dn2(void **state)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dn = "cn=user, dc=ad, dc=com";
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns[] = {"dc=ad, dc=com"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns2[] = {"dc=sub, dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl do_test_get_by_dn(dn, dns, 1, dns2, 1, DN_IN_DOM1);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlvoid test_get_by_dn_fail(void **state)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dn = "cn=user, dc=sub, dc=example, dc=com";
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns[] = {"dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl const char *dns2[] = {"dc=sub, dc=ad, dc=pb"};
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl do_test_get_by_dn(dn, dns, 1, dns2, 1, DN_NOT_IN_DOMS);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichlint main(void)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl{
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek const struct CMUnitTest tests[] = {
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek cmocka_unit_test(test_search_bases_fail),
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek cmocka_unit_test(test_search_bases_success),
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek cmocka_unit_test(test_get_by_dn_fail),
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek cmocka_unit_test(test_get_by_dn),
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek cmocka_unit_test(test_get_by_dn2)
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl };
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl
4e5e846de22407f825fe3b4040d79606818a2419Jakub Hrozek return cmocka_run_group_tests(tests, NULL, NULL);
cebdc563a094d305b91da5b5af4d95d8e3a1bf27Pavel Reichl}