LCOV - code coverage report
Current view: top level - tests - ipa_hbac-tests.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 359 359 100.0 %
Date: 2012-11-29 Functions: 15 15 100.0 %
Branches: 16 32 50.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :     SSSD
       3                 :            : 
       4                 :            :     Authors:
       5                 :            :         Stephen Gallagher <sgallagh@redhat.com>
       6                 :            : 
       7                 :            :     Copyright (C) 2011 Red Hat
       8                 :            : 
       9                 :            :     This program is free software; you can redistribute it and/or modify
      10                 :            :     it under the terms of the GNU General Public License as published by
      11                 :            :     the Free Software Foundation; either version 3 of the License, or
      12                 :            :     (at your option) any later version.
      13                 :            : 
      14                 :            :     This program is distributed in the hope that it will be useful,
      15                 :            :     but WITHOUT ANY WARRANTY; without even the implied warranty of
      16                 :            :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17                 :            :     GNU General Public License for more details.
      18                 :            : 
      19                 :            :     You should have received a copy of the GNU General Public License
      20                 :            :     along with this program.  If not, see <http://www.gnu.org/licenses/>.
      21                 :            : */
      22                 :            : #include <stdlib.h>
      23                 :            : #include <check.h>
      24                 :            : #include <unistd.h>
      25                 :            : #include <sys/types.h>
      26                 :            : #include <sys/stat.h>
      27                 :            : #include <talloc.h>
      28                 :            : 
      29                 :            : #include "tests/common.h"
      30                 :            : #include "providers/ipa/ipa_hbac.h"
      31                 :            : 
      32                 :            : #define HBAC_TEST_USER "testuser"
      33                 :            : #define HBAC_TEST_INVALID_USER "nosuchuser"
      34                 :            : 
      35                 :            : #define HBAC_TEST_GROUP1 "testgroup1"
      36                 :            : #define HBAC_TEST_GROUP2 "testgroup2"
      37                 :            : #define HBAC_TEST_INVALID_GROUP "nosuchgroup"
      38                 :            : 
      39                 :            : #define HBAC_TEST_SERVICE "testservice"
      40                 :            : #define HBAC_TEST_INVALID_SERVICE "nosuchservice"
      41                 :            : 
      42                 :            : #define HBAC_TEST_SERVICEGROUP1 "login_services"
      43                 :            : #define HBAC_TEST_SERVICEGROUP2 "all_services"
      44                 :            : #define HBAC_TEST_INVALID_SERVICEGROUP "nosuchservicegroup"
      45                 :            : 
      46                 :            : #define HBAC_TEST_SRCHOST "client.example.com"
      47                 :            : #define HBAC_TEST_INVALID_SRCHOST "nosuchsrchost"
      48                 :            : 
      49                 :            : #define HBAC_TEST_SRCHOSTGROUP1 "site_hosts"
      50                 :            : #define HBAC_TEST_SRCHOSTGROUP2 "corp_hosts"
      51                 :            : #define HBAC_TEST_INVALID_SRCHOSTGROUP "nosuchsrchostgroup"
      52                 :            : 
      53                 :            : 
      54                 :            : /* These don't make sense for a user/group/service but they do the job and
      55                 :            :  * every one is from a different codepage */
      56                 :            : /* Latin Extended A - "Czech" */
      57                 :            : const uint8_t user_utf8_lowcase[] = { 0xC4, 0x8D, 'e', 'c', 'h', 0x0 };
      58                 :            : const uint8_t user_utf8_upcase[] = { 0xC4, 0x8C, 'e', 'c', 'h', 0x0 };
      59                 :            : const uint8_t user_utf8_lowcase_neg[] = { 0xC4, 0x8E, 'e', 'c', 'h', 0x0 };
      60                 :            : /* Latin 1 Supplement - "Munchen" */
      61                 :            : const uint8_t service_utf8_lowcase[] = { 'm', 0xC3, 0xBC, 'n', 'c', 'h', 'e', 'n', 0x0 };
      62                 :            : const uint8_t service_utf8_upcase[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
      63                 :            : /* Greek - "AlphaBetaGamma" */
      64                 :            : const uint8_t srchost_utf8_lowcase[] = { 0xCE, 0xB1, 0xCE, 0xB2, 0xCE, 0xB3, 0x0  };
      65                 :            : const uint8_t srchost_utf8_upcase[] = { 0xCE, 0x91, 0xCE, 0x92, 0xCE, 0x93, 0x0 };
      66                 :            : /* Turkish "capital I" and "dotless i" */
      67                 :            : const uint8_t user_lowcase_tr[] = { 0xC4, 0xB1, 0x0 };
      68                 :            : const uint8_t user_upcase_tr[] = { 0x49, 0x0 };
      69                 :            : 
      70                 :          8 : static void get_allow_all_rule(TALLOC_CTX *mem_ctx,
      71                 :            :                                struct hbac_rule **allow_rule)
      72                 :            : {
      73                 :            :     struct hbac_rule *rule;
      74                 :            :     /* Create a rule that ALLOWs all services, users and
      75                 :            :      * remote hosts.
      76                 :            :      */
      77                 :          8 :     rule = talloc_zero(mem_ctx, struct hbac_rule);
      78                 :          8 :     fail_if (rule == NULL);
      79                 :            : 
      80                 :          8 :     rule->enabled = true;
      81                 :            : 
      82                 :          8 :     rule->services = talloc_zero(rule, struct hbac_rule_element);
      83                 :          8 :     fail_if (rule->services == NULL);
      84                 :          8 :     rule->services->category = HBAC_CATEGORY_ALL;
      85                 :          8 :     rule->services->names = NULL;
      86                 :          8 :     rule->services->groups = NULL;
      87                 :            : 
      88                 :          8 :     rule->users = talloc_zero(rule, struct hbac_rule_element);
      89                 :          8 :     fail_if (rule->users == NULL);
      90                 :          8 :     rule->users->category = HBAC_CATEGORY_ALL;
      91                 :          8 :     rule->users->names = NULL;
      92                 :          8 :     rule->users->groups = NULL;
      93                 :            : 
      94                 :          8 :     rule->targethosts = talloc_zero(rule, struct hbac_rule_element);
      95                 :          8 :     fail_if (rule->targethosts == NULL);
      96                 :          8 :     rule->targethosts->category = HBAC_CATEGORY_ALL;
      97                 :          8 :     rule->targethosts->names = NULL;
      98                 :          8 :     rule->targethosts->groups = NULL;
      99                 :            : 
     100                 :          8 :     rule->srchosts = talloc_zero(rule, struct hbac_rule_element);
     101                 :          8 :     fail_if (rule->srchosts == NULL);
     102                 :          8 :     rule->srchosts->category = HBAC_CATEGORY_ALL;
     103                 :          8 :     rule->srchosts->names = NULL;
     104                 :          8 :     rule->srchosts->groups = NULL;
     105                 :            : 
     106                 :          8 :     *allow_rule = rule;
     107                 :          8 : }
     108                 :            : 
     109                 :          8 : static void get_test_user(TALLOC_CTX *mem_ctx,
     110                 :            :                           struct hbac_request_element **user)
     111                 :            : {
     112                 :            :     struct hbac_request_element *new_user;
     113                 :            : 
     114                 :          8 :     new_user = talloc_zero(mem_ctx, struct hbac_request_element);
     115                 :          8 :     fail_if (new_user == NULL);
     116                 :            : 
     117                 :          8 :     new_user->name = talloc_strdup(new_user, HBAC_TEST_USER);
     118                 :          8 :     fail_if(new_user->name == NULL);
     119                 :            : 
     120                 :          8 :     new_user->groups = talloc_array(new_user, const char *, 3);
     121                 :          8 :     fail_if(new_user->groups == NULL);
     122                 :            : 
     123                 :          8 :     new_user->groups[0] = talloc_strdup(new_user->groups, HBAC_TEST_GROUP1);
     124                 :          8 :     fail_if(new_user->groups[0] == NULL);
     125                 :            : 
     126                 :          8 :     new_user->groups[1] = talloc_strdup(new_user->groups, HBAC_TEST_GROUP2);
     127                 :          8 :     fail_if(new_user->groups[1] == NULL);
     128                 :            : 
     129                 :          8 :     new_user->groups[2] = NULL;
     130                 :            : 
     131                 :          8 :     *user = new_user;
     132                 :          8 : }
     133                 :            : 
     134                 :          8 : static void get_test_service(TALLOC_CTX *mem_ctx,
     135                 :            :                              struct hbac_request_element **service)
     136                 :            : {
     137                 :            :     struct hbac_request_element *new_service;
     138                 :            : 
     139                 :          8 :     new_service = talloc_zero(mem_ctx, struct hbac_request_element);
     140                 :          8 :     fail_if (new_service == NULL);
     141                 :            : 
     142                 :          8 :     new_service->name = talloc_strdup(new_service, HBAC_TEST_SERVICE);
     143                 :          8 :     fail_if(new_service->name == NULL);
     144                 :            : 
     145                 :          8 :     new_service->groups = talloc_array(new_service, const char *, 3);
     146                 :          8 :     fail_if(new_service->groups == NULL);
     147                 :            : 
     148                 :          8 :     new_service->groups[0] = talloc_strdup(new_service->groups, HBAC_TEST_SERVICEGROUP1);
     149                 :          8 :     fail_if(new_service->groups[0] == NULL);
     150                 :            : 
     151                 :          8 :     new_service->groups[1] = talloc_strdup(new_service->groups, HBAC_TEST_SERVICEGROUP2);
     152                 :          8 :     fail_if(new_service->groups[1] == NULL);
     153                 :            : 
     154                 :          8 :     new_service->groups[2] = NULL;
     155                 :            : 
     156                 :          8 :     *service = new_service;
     157                 :          8 : }
     158                 :            : 
     159                 :          8 : static void get_test_srchost(TALLOC_CTX *mem_ctx,
     160                 :            :                              struct hbac_request_element **srchost)
     161                 :            : {
     162                 :            :     struct hbac_request_element *new_srchost;
     163                 :            : 
     164                 :          8 :     new_srchost = talloc_zero(mem_ctx, struct hbac_request_element);
     165                 :          8 :     fail_if (new_srchost == NULL);
     166                 :            : 
     167                 :          8 :     new_srchost->name = talloc_strdup(new_srchost, "client.example.com");
     168                 :          8 :     fail_if(new_srchost->name == NULL);
     169                 :            : 
     170                 :          8 :     new_srchost->groups = talloc_array(new_srchost, const char *, 3);
     171                 :          8 :     fail_if(new_srchost->groups == NULL);
     172                 :            : 
     173                 :          8 :     new_srchost->groups[0] = talloc_strdup(new_srchost->groups, "site_hosts");
     174                 :          8 :     fail_if(new_srchost->groups[0] == NULL);
     175                 :            : 
     176                 :          8 :     new_srchost->groups[1] = talloc_strdup(new_srchost->groups, "corp_hosts");
     177                 :          8 :     fail_if(new_srchost->groups[1] == NULL);
     178                 :            : 
     179                 :          8 :     new_srchost->groups[2] = NULL;
     180                 :            : 
     181                 :          8 :     *srchost = new_srchost;
     182                 :          8 : }
     183                 :            : 
     184                 :          1 : START_TEST(ipa_hbac_test_allow_all)
     185                 :            : {
     186                 :            :     enum hbac_eval_result result;
     187                 :            :     TALLOC_CTX *test_ctx;
     188                 :            :     struct hbac_rule **rules;
     189                 :            :     struct hbac_eval_req *eval_req;
     190                 :            :     struct hbac_info *info;
     191                 :            :     bool is_valid;
     192                 :            :     uint32_t missing_attrs;
     193                 :            : 
     194                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     195                 :            : 
     196                 :            :     /* Create a request */
     197                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     198                 :          1 :     fail_if (eval_req == NULL);
     199                 :            : 
     200                 :          1 :     get_test_user(eval_req, &eval_req->user);
     201                 :          1 :     get_test_service(eval_req, &eval_req->service);
     202                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     203                 :            : 
     204                 :            :     /* Create the rules to evaluate against */
     205                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     206                 :          1 :     fail_if (rules == NULL);
     207                 :            : 
     208                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     209                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow All");
     210                 :          1 :     fail_if(rules[0]->name == NULL);
     211                 :          1 :     rules[1] = NULL;
     212                 :            : 
     213                 :            :     /* Validate this rule */
     214                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     215                 :          1 :     fail_unless(is_valid);
     216                 :          1 :     fail_unless(missing_attrs == 0);
     217                 :            : 
     218                 :            :     /* Evaluate the rules */
     219                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     220         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     221                 :            :                 "Expected [%s], got [%s]; "
     222                 :            :                 "Error: [%s]",
     223                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     224                 :            :                 hbac_result_string(result),
     225                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     226                 :            : 
     227                 :          1 :     talloc_free(test_ctx);
     228                 :            : }
     229                 :          1 : END_TEST
     230                 :            : 
     231                 :          1 : START_TEST(ipa_hbac_test_allow_user)
     232                 :            : {
     233                 :            :     enum hbac_eval_result result;
     234                 :            :     TALLOC_CTX *test_ctx;
     235                 :            :     struct hbac_rule **rules;
     236                 :            :     struct hbac_eval_req *eval_req;
     237                 :            :     struct hbac_info *info;
     238                 :            :     bool is_valid;
     239                 :            :     uint32_t missing_attrs;
     240                 :            : 
     241                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     242                 :            : 
     243                 :            :     /* Create a request */
     244                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     245                 :          1 :     fail_if (eval_req == NULL);
     246                 :            : 
     247                 :          1 :     get_test_user(eval_req, &eval_req->user);
     248                 :          1 :     get_test_service(eval_req, &eval_req->service);
     249                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     250                 :            : 
     251                 :            :     /* Create the rules to evaluate against */
     252                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     253                 :          1 :     fail_if (rules == NULL);
     254                 :            : 
     255                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     256                 :            : 
     257                 :            :     /* Modify the rule to allow only a specific user */
     258                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow user");
     259                 :          1 :     fail_if(rules[0]->name == NULL);
     260                 :          1 :     rules[0]->users->category = HBAC_CATEGORY_NULL;
     261                 :            : 
     262                 :          1 :     rules[0]->users->names = talloc_array(rules[0], const char *, 2);
     263                 :          1 :     fail_if(rules[0]->users->names == NULL);
     264                 :            : 
     265                 :          1 :     rules[0]->users->names[0] = HBAC_TEST_USER;
     266                 :          1 :     rules[0]->users->names[1] = NULL;
     267                 :            : 
     268                 :          1 :     rules[1] = NULL;
     269                 :            : 
     270                 :            :     /* Validate this rule */
     271                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     272                 :          1 :     fail_unless(is_valid);
     273                 :          1 :     fail_unless(missing_attrs == 0);
     274                 :            : 
     275                 :            :     /* Evaluate the rules */
     276                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     277         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     278                 :            :                 "Expected [%s], got [%s]; "
     279                 :            :                 "Error: [%s]",
     280                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     281                 :            :                 hbac_result_string(result),
     282                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     283                 :            : 
     284                 :            :     /* Negative test */
     285                 :          1 :     rules[0]->users->names[0] = HBAC_TEST_INVALID_USER;
     286                 :            : 
     287                 :            :     /* Validate this rule */
     288                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     289                 :          1 :     fail_unless(is_valid);
     290                 :          1 :     fail_unless(missing_attrs == 0);
     291                 :            : 
     292                 :            :     /* Evaluate the rules */
     293                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     294         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     295                 :            :                 "Expected [%s], got [%s]; "
     296                 :            :                 "Error: [%s]",
     297                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     298                 :            :                 hbac_result_string(result),
     299                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     300                 :            : 
     301                 :          1 :     talloc_free(test_ctx);
     302                 :            : }
     303                 :          1 : END_TEST
     304                 :            : 
     305                 :          1 : START_TEST(ipa_hbac_test_allow_utf8)
     306                 :            : {
     307                 :            :     enum hbac_eval_result result;
     308                 :            :     TALLOC_CTX *test_ctx;
     309                 :            :     struct hbac_rule **rules;
     310                 :            :     struct hbac_eval_req *eval_req;
     311                 :            :     struct hbac_info *info;
     312                 :            :     bool is_valid;
     313                 :            :     uint32_t missing_attrs;
     314                 :            : 
     315                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     316                 :            : 
     317                 :            :     /* Create a request */
     318                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     319                 :          1 :     fail_if (eval_req == NULL);
     320                 :            : 
     321                 :          1 :     get_test_user(eval_req, &eval_req->user);
     322                 :          1 :     get_test_service(eval_req, &eval_req->service);
     323                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     324                 :            : 
     325                 :            :     /* Override the with UTF8 values */
     326                 :          1 :     eval_req->user->name = (const char *) &user_utf8_lowcase;
     327                 :          1 :     eval_req->srchost->name = (const char *) &srchost_utf8_lowcase;
     328                 :          1 :     eval_req->service->name = (const char *) &service_utf8_lowcase;
     329                 :            : 
     330                 :            :     /* Create the rules to evaluate against */
     331                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     332                 :          1 :     fail_if (rules == NULL);
     333                 :            : 
     334                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     335                 :            : 
     336                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow user");
     337                 :          1 :     fail_if(rules[0]->name == NULL);
     338                 :          1 :     rules[0]->users->category = HBAC_CATEGORY_NULL;
     339                 :            : 
     340                 :            :     /* Modify the rule to allow only a specific user */
     341                 :          1 :     rules[0]->users->names = talloc_array(rules[0], const char *, 2);
     342                 :          1 :     fail_if(rules[0]->users->names == NULL);
     343                 :            : 
     344                 :          1 :     rules[0]->users->names[0] = (const char *) &user_utf8_upcase;
     345                 :          1 :     rules[0]->users->names[1] = NULL;
     346                 :            : 
     347                 :            :     /* Modify the rule to allow only a specific service */
     348                 :          1 :     rules[0]->services->category = HBAC_CATEGORY_NULL;
     349                 :            : 
     350                 :          1 :     rules[0]->services->names = talloc_array(rules[0], const char *, 2);
     351                 :          1 :     fail_if(rules[0]->services->names == NULL);
     352                 :            : 
     353                 :          1 :     rules[0]->services->names[0] = (const char *) &service_utf8_upcase;
     354                 :          1 :     rules[0]->services->names[1] = NULL;
     355                 :            : 
     356                 :            :     /* Modify the rule to allow only a specific service */
     357                 :          1 :     rules[0]->srchosts->category = HBAC_CATEGORY_NULL;
     358                 :            : 
     359                 :          1 :     rules[0]->srchosts->names = talloc_array(rules[0], const char *, 2);
     360                 :          1 :     fail_if(rules[0]->services->names == NULL);
     361                 :            : 
     362                 :          1 :     rules[0]->srchosts->names[0] = (const char *) &srchost_utf8_upcase;
     363                 :          1 :     rules[0]->services->names[1] = NULL;
     364                 :            : 
     365                 :          1 :     rules[1] = NULL;
     366                 :            : 
     367                 :            :     /* Validate this rule */
     368                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     369                 :          1 :     fail_unless(is_valid);
     370                 :          1 :     fail_unless(missing_attrs == 0);
     371                 :            : 
     372                 :            :     /* Evaluate the rules */
     373                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     374         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     375                 :            :                 "Expected [%s], got [%s]; "
     376                 :            :                 "Error: [%s]",
     377                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     378                 :            :                 hbac_result_string(result),
     379                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     380                 :            : 
     381                 :            :     /* Negative test - a different letter */
     382                 :          1 :     rules[0]->users->names[0] = (const char *) &user_utf8_lowcase_neg;
     383                 :            : 
     384                 :            :     /* Evaluate the rules */
     385                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     386         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     387                 :            :                 "Expected [%s], got [%s]; "
     388                 :            :                 "Error: [%s]",
     389                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     390                 :            :                 hbac_result_string(result),
     391                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     392                 :            : 
     393                 :            :     /* Negative test - Turkish dotless i. We cannot know that capital I
     394                 :            :      * casefolds into dotless i unless we know the language is Turkish */
     395                 :          1 :     eval_req->user->name = (const char *) &user_lowcase_tr;
     396                 :          1 :     rules[0]->users->names[0] = (const char *) &user_upcase_tr;
     397                 :            : 
     398                 :            :     /* Validate this rule */
     399                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     400                 :          1 :     fail_unless(is_valid);
     401                 :          1 :     fail_unless(missing_attrs == 0);
     402                 :            : 
     403                 :            :     /* Evaluate the rules */
     404                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     405         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     406                 :            :                 "Expected [%s], got [%s]; "
     407                 :            :                 "Error: [%s]",
     408                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     409                 :            :                 hbac_result_string(result),
     410                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     411                 :            : 
     412                 :          1 :     talloc_free(test_ctx);
     413                 :            : }
     414                 :          1 : END_TEST
     415                 :            : 
     416                 :          1 : START_TEST(ipa_hbac_test_allow_group)
     417                 :            : {
     418                 :            :     enum hbac_eval_result result;
     419                 :            :     TALLOC_CTX *test_ctx;
     420                 :            :     struct hbac_rule **rules;
     421                 :            :     struct hbac_eval_req *eval_req;
     422                 :            :     struct hbac_info *info;
     423                 :            :     bool is_valid;
     424                 :            :     uint32_t missing_attrs;
     425                 :            : 
     426                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     427                 :            : 
     428                 :            :     /* Create a request */
     429                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     430                 :          1 :     fail_if (eval_req == NULL);
     431                 :            : 
     432                 :          1 :     get_test_user(eval_req, &eval_req->user);
     433                 :          1 :     get_test_service(eval_req, &eval_req->service);
     434                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     435                 :            : 
     436                 :            :     /* Create the rules to evaluate against */
     437                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     438                 :          1 :     fail_if (rules == NULL);
     439                 :            : 
     440                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     441                 :            : 
     442                 :            :     /* Modify the rule to allow only a group of users */
     443                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow group");
     444                 :          1 :     fail_if(rules[0]->name == NULL);
     445                 :          1 :     rules[0]->users->category = HBAC_CATEGORY_NULL;
     446                 :            : 
     447                 :          1 :     rules[0]->users->names = NULL;
     448                 :          1 :     rules[0]->users->groups = talloc_array(rules[0], const char *, 2);
     449                 :          1 :     fail_if(rules[0]->users->groups == NULL);
     450                 :            : 
     451                 :          1 :     rules[0]->users->groups[0] = HBAC_TEST_GROUP1;
     452                 :          1 :     rules[0]->users->groups[1] = NULL;
     453                 :            : 
     454                 :          1 :     rules[1] = NULL;
     455                 :            : 
     456                 :            :     /* Validate this rule */
     457                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     458                 :          1 :     fail_unless(is_valid);
     459                 :          1 :     fail_unless(missing_attrs == 0);
     460                 :            : 
     461                 :            :     /* Evaluate the rules */
     462                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     463         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     464                 :            :                 "Expected [%s], got [%s]; "
     465                 :            :                 "Error: [%s]",
     466                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     467                 :            :                 hbac_result_string(result),
     468                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     469                 :            : 
     470                 :            :     /* Negative test */
     471                 :          1 :     rules[0]->users->groups[0] = HBAC_TEST_INVALID_GROUP;
     472                 :            : 
     473                 :            :     /* Validate this rule */
     474                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     475                 :          1 :     fail_unless(is_valid);
     476                 :          1 :     fail_unless(missing_attrs == 0);
     477                 :            : 
     478                 :            :     /* Evaluate the rules */
     479                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     480         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     481                 :            :                 "Expected [%s], got [%s]; "
     482                 :            :                 "Error: [%s]",
     483                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     484                 :            :                 hbac_result_string(result),
     485                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     486                 :            : 
     487                 :          1 :     talloc_free(test_ctx);
     488                 :            : }
     489                 :          1 : END_TEST
     490                 :            : 
     491                 :          1 : START_TEST(ipa_hbac_test_allow_svc)
     492                 :            : {
     493                 :            :     enum hbac_eval_result result;
     494                 :            :     TALLOC_CTX *test_ctx;
     495                 :            :     struct hbac_rule **rules;
     496                 :            :     struct hbac_eval_req *eval_req;
     497                 :            :     struct hbac_info *info;
     498                 :            :     bool is_valid;
     499                 :            :     uint32_t missing_attrs;
     500                 :            : 
     501                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     502                 :            : 
     503                 :            :     /* Create a request */
     504                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     505                 :          1 :     fail_if (eval_req == NULL);
     506                 :            : 
     507                 :          1 :     get_test_user(eval_req, &eval_req->user);
     508                 :          1 :     get_test_service(eval_req, &eval_req->service);
     509                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     510                 :            : 
     511                 :            :     /* Create the rules to evaluate against */
     512                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     513                 :          1 :     fail_if (rules == NULL);
     514                 :            : 
     515                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     516                 :            : 
     517                 :            :     /* Modify the rule to allow only a specific service */
     518                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow service");
     519                 :          1 :     fail_if(rules[0]->name == NULL);
     520                 :          1 :     rules[0]->services->category = HBAC_CATEGORY_NULL;
     521                 :            : 
     522                 :          1 :     rules[0]->services->names = talloc_array(rules[0], const char *, 2);
     523                 :          1 :     fail_if(rules[0]->services->names == NULL);
     524                 :            : 
     525                 :          1 :     rules[0]->services->names[0] = HBAC_TEST_SERVICE;
     526                 :          1 :     rules[0]->services->names[1] = NULL;
     527                 :            : 
     528                 :          1 :     rules[1] = NULL;
     529                 :            : 
     530                 :            :     /* Validate this rule */
     531                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     532                 :          1 :     fail_unless(is_valid);
     533                 :          1 :     fail_unless(missing_attrs == 0);
     534                 :            : 
     535                 :            :     /* Evaluate the rules */
     536                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     537         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     538                 :            :                 "Expected [%s], got [%s]; "
     539                 :            :                 "Error: [%s]",
     540                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     541                 :            :                 hbac_result_string(result),
     542                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     543                 :            : 
     544                 :            :     /* Negative test */
     545                 :          1 :     rules[0]->services->names[0] = HBAC_TEST_INVALID_SERVICE;
     546                 :            : 
     547                 :            :     /* Validate this rule */
     548                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     549                 :          1 :     fail_unless(is_valid);
     550                 :          1 :     fail_unless(missing_attrs == 0);
     551                 :            : 
     552                 :            :     /* Evaluate the rules */
     553                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     554         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     555                 :            :                 "Expected [%s], got [%s]; "
     556                 :            :                 "Error: [%s]",
     557                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     558                 :            :                 hbac_result_string(result),
     559                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     560                 :            : 
     561                 :          1 :     talloc_free(test_ctx);
     562                 :            : }
     563                 :          1 : END_TEST
     564                 :            : 
     565                 :          1 : START_TEST(ipa_hbac_test_allow_svcgroup)
     566                 :            : {
     567                 :            :     enum hbac_eval_result result;
     568                 :            :     TALLOC_CTX *test_ctx;
     569                 :            :     struct hbac_rule **rules;
     570                 :            :     struct hbac_eval_req *eval_req;
     571                 :            :     struct hbac_info *info;
     572                 :            :     bool is_valid;
     573                 :            :     uint32_t missing_attrs;
     574                 :            : 
     575                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     576                 :            : 
     577                 :            :     /* Create a request */
     578                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     579                 :          1 :     fail_if (eval_req == NULL);
     580                 :            : 
     581                 :          1 :     get_test_user(eval_req, &eval_req->user);
     582                 :          1 :     get_test_service(eval_req, &eval_req->service);
     583                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     584                 :            : 
     585                 :            :     /* Create the rules to evaluate against */
     586                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     587                 :          1 :     fail_if (rules == NULL);
     588                 :            : 
     589                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     590                 :            : 
     591                 :            :     /* Modify the rule to allow only a group of users */
     592                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow servicegroup");
     593                 :          1 :     fail_if(rules[0]->name == NULL);
     594                 :          1 :     rules[0]->services->category = HBAC_CATEGORY_NULL;
     595                 :            : 
     596                 :          1 :     rules[0]->services->names = NULL;
     597                 :          1 :     rules[0]->services->groups = talloc_array(rules[0], const char *, 2);
     598                 :          1 :     fail_if(rules[0]->services->groups == NULL);
     599                 :            : 
     600                 :          1 :     rules[0]->services->groups[0] = HBAC_TEST_SERVICEGROUP1;
     601                 :          1 :     rules[0]->services->groups[1] = NULL;
     602                 :            : 
     603                 :          1 :     rules[1] = NULL;
     604                 :            : 
     605                 :            :     /* Validate this rule */
     606                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     607                 :          1 :     fail_unless(is_valid);
     608                 :          1 :     fail_unless(missing_attrs == 0);
     609                 :            : 
     610                 :            :     /* Evaluate the rules */
     611                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     612         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     613                 :            :                 "Expected [%s], got [%s]; "
     614                 :            :                 "Error: [%s]",
     615                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     616                 :            :                 hbac_result_string(result),
     617                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     618                 :            : 
     619                 :            :     /* Negative test */
     620                 :          1 :     rules[0]->services->groups[0] = HBAC_TEST_INVALID_SERVICEGROUP;
     621                 :            : 
     622                 :            :     /* Validate this rule */
     623                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     624                 :          1 :     fail_unless(is_valid);
     625                 :          1 :     fail_unless(missing_attrs == 0);
     626                 :            : 
     627                 :            :     /* Evaluate the rules */
     628                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     629         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     630                 :            :                 "Expected [%s], got [%s]; "
     631                 :            :                 "Error: [%s]",
     632                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     633                 :            :                 hbac_result_string(result),
     634                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     635                 :            : 
     636                 :          1 :     talloc_free(test_ctx);
     637                 :            : }
     638                 :          1 : END_TEST
     639                 :            : 
     640                 :          1 : START_TEST(ipa_hbac_test_allow_srchost)
     641                 :            : {
     642                 :            :     enum hbac_eval_result result;
     643                 :            :     TALLOC_CTX *test_ctx;
     644                 :            :     struct hbac_rule **rules;
     645                 :            :     struct hbac_eval_req *eval_req;
     646                 :            :     struct hbac_info *info;
     647                 :            :     bool is_valid;
     648                 :            :     uint32_t missing_attrs;
     649                 :            : 
     650                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     651                 :            : 
     652                 :            :     /* Create a request */
     653                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     654                 :          1 :     fail_if (eval_req == NULL);
     655                 :            : 
     656                 :          1 :     get_test_user(eval_req, &eval_req->user);
     657                 :          1 :     get_test_service(eval_req, &eval_req->service);
     658                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     659                 :            : 
     660                 :            :     /* Create the rules to evaluate against */
     661                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     662                 :          1 :     fail_if (rules == NULL);
     663                 :            : 
     664                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     665                 :            : 
     666                 :            :     /* Modify the rule to allow only a specific service */
     667                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow srchost");
     668                 :          1 :     fail_if(rules[0]->name == NULL);
     669                 :          1 :     rules[0]->srchosts->category = HBAC_CATEGORY_NULL;
     670                 :            : 
     671                 :          1 :     rules[0]->srchosts->names = talloc_array(rules[0], const char *, 2);
     672                 :          1 :     fail_if(rules[0]->srchosts->names == NULL);
     673                 :            : 
     674                 :          1 :     rules[0]->srchosts->names[0] = HBAC_TEST_SRCHOST;
     675                 :          1 :     rules[0]->srchosts->names[1] = NULL;
     676                 :            : 
     677                 :          1 :     rules[1] = NULL;
     678                 :            : 
     679                 :            :     /* Validate this rule */
     680                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     681                 :          1 :     fail_unless(is_valid);
     682                 :          1 :     fail_unless(missing_attrs == 0);
     683                 :            : 
     684                 :            :     /* Evaluate the rules */
     685                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     686         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     687                 :            :                 "Expected [%s], got [%s]; "
     688                 :            :                 "Error: [%s]",
     689                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     690                 :            :                 hbac_result_string(result),
     691                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     692                 :            : 
     693                 :            :     /* Negative test */
     694                 :          1 :     rules[0]->srchosts->names[0] = HBAC_TEST_INVALID_SRCHOST;
     695                 :            : 
     696                 :            :     /* Validate this rule */
     697                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     698                 :          1 :     fail_unless(is_valid);
     699                 :          1 :     fail_unless(missing_attrs == 0);
     700                 :            : 
     701                 :            :     /* Evaluate the rules */
     702                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     703         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     704                 :            :                 "Expected [%s], got [%s]; "
     705                 :            :                 "Error: [%s](%s)",
     706                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     707                 :            :                 hbac_result_string(result),
     708                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     709                 :            : 
     710                 :          1 :     talloc_free(test_ctx);
     711                 :            : }
     712                 :          1 : END_TEST
     713                 :            : 
     714                 :          1 : START_TEST(ipa_hbac_test_allow_srchostgroup)
     715                 :            : {
     716                 :            :     enum hbac_eval_result result;
     717                 :            :     TALLOC_CTX *test_ctx;
     718                 :            :     struct hbac_rule **rules;
     719                 :            :     struct hbac_eval_req *eval_req;
     720                 :            :     struct hbac_info *info;
     721                 :            :     bool is_valid;
     722                 :            :     uint32_t missing_attrs;
     723                 :            : 
     724                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     725                 :            : 
     726                 :            :     /* Create a request */
     727                 :          1 :     eval_req = talloc_zero(test_ctx, struct hbac_eval_req);
     728                 :          1 :     fail_if (eval_req == NULL);
     729                 :            : 
     730                 :          1 :     get_test_user(eval_req, &eval_req->user);
     731                 :          1 :     get_test_service(eval_req, &eval_req->service);
     732                 :          1 :     get_test_srchost(eval_req, &eval_req->srchost);
     733                 :            : 
     734                 :            :     /* Create the rules to evaluate against */
     735                 :          1 :     rules = talloc_array(test_ctx, struct hbac_rule *, 2);
     736                 :          1 :     fail_if (rules == NULL);
     737                 :            : 
     738                 :          1 :     get_allow_all_rule(rules, &rules[0]);
     739                 :            : 
     740                 :            :     /* Modify the rule to allow only a group of users */
     741                 :          1 :     rules[0]->name = talloc_strdup(rules[0], "Allow srchostgroup");
     742                 :          1 :     fail_if(rules[0]->name == NULL);
     743                 :          1 :     rules[0]->srchosts->category = HBAC_CATEGORY_NULL;
     744                 :            : 
     745                 :          1 :     rules[0]->srchosts->names = NULL;
     746                 :          1 :     rules[0]->srchosts->groups = talloc_array(rules[0], const char *, 2);
     747                 :          1 :     fail_if(rules[0]->srchosts->groups == NULL);
     748                 :            : 
     749                 :          1 :     rules[0]->srchosts->groups[0] = HBAC_TEST_SRCHOSTGROUP1;
     750                 :          1 :     rules[0]->srchosts->groups[1] = NULL;
     751                 :            : 
     752                 :          1 :     rules[1] = NULL;
     753                 :            : 
     754                 :            :     /* Validate this rule */
     755                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     756                 :          1 :     fail_unless(is_valid);
     757                 :          1 :     fail_unless(missing_attrs == 0);
     758                 :            : 
     759                 :            :     /* Evaluate the rules */
     760                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     761         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_ALLOW,
     762                 :            :                 "Expected [%s], got [%s]; "
     763                 :            :                 "Error: [%s]",
     764                 :            :                 hbac_result_string(HBAC_EVAL_ALLOW),
     765                 :            :                 hbac_result_string(result),
     766                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     767                 :            : 
     768                 :            :     /* Negative test */
     769                 :          1 :     rules[0]->srchosts->groups[0] = HBAC_TEST_INVALID_SRCHOSTGROUP;
     770                 :            : 
     771                 :            :     /* Validate this rule */
     772                 :          1 :     is_valid = hbac_rule_is_complete(rules[0], &missing_attrs);
     773                 :          1 :     fail_unless(is_valid);
     774                 :          1 :     fail_unless(missing_attrs == 0);
     775                 :            : 
     776                 :            :     /* Evaluate the rules */
     777                 :          1 :     result = hbac_evaluate(rules, eval_req, &info);
     778         [ +  - ]:          1 :     fail_unless(result == HBAC_EVAL_DENY,
     779                 :            :                 "Expected [%s], got [%s]; "
     780                 :            :                 "Error: [%s]",
     781                 :            :                 hbac_result_string(HBAC_EVAL_DENY),
     782                 :            :                 hbac_result_string(result),
     783                 :            :                 info ? hbac_error_string(info->code):"Unknown");
     784                 :            : 
     785                 :          1 :     talloc_free(test_ctx);
     786                 :            : }
     787                 :          1 : END_TEST
     788                 :            : 
     789                 :          1 : START_TEST(ipa_hbac_test_incomplete)
     790                 :            : {
     791                 :            :     TALLOC_CTX *test_ctx;
     792                 :            :     struct hbac_rule *rule;
     793                 :            :     bool is_valid;
     794                 :            :     uint32_t missing_attrs;
     795                 :            : 
     796                 :          1 :     test_ctx = talloc_new(global_talloc_context);
     797                 :            : 
     798                 :          1 :     rule = talloc_zero(test_ctx, struct hbac_rule);
     799                 :            : 
     800                 :            :     /* Validate this rule */
     801                 :          1 :     is_valid = hbac_rule_is_complete(rule, &missing_attrs);
     802                 :          1 :     fail_if(is_valid);
     803                 :          1 :     fail_unless(missing_attrs | HBAC_RULE_ELEMENT_USERS);
     804                 :          1 :     fail_unless(missing_attrs | HBAC_RULE_ELEMENT_SERVICES);
     805                 :          1 :     fail_unless(missing_attrs | HBAC_RULE_ELEMENT_TARGETHOSTS);
     806                 :          1 :     fail_unless(missing_attrs | HBAC_RULE_ELEMENT_SOURCEHOSTS);
     807                 :            : 
     808                 :          1 :     talloc_free(test_ctx);
     809                 :            : }
     810                 :          1 : END_TEST
     811                 :            : 
     812                 :         10 : Suite *hbac_test_suite (void)
     813                 :            : {
     814                 :         10 :     Suite *s = suite_create ("HBAC");
     815                 :            : 
     816                 :         10 :     TCase *tc_hbac = tcase_create("HBAC_rules");
     817                 :         10 :     tcase_add_checked_fixture(tc_hbac,
     818                 :            :                               leak_check_setup,
     819                 :            :                               leak_check_teardown);
     820                 :            : 
     821                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_all);
     822                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_user);
     823                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_group);
     824                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_svc);
     825                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_svcgroup);
     826                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_srchost);
     827                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_srchostgroup);
     828                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_allow_utf8);
     829                 :         10 :     tcase_add_test(tc_hbac, ipa_hbac_test_incomplete);
     830                 :            : 
     831                 :         10 :     suite_add_tcase(s, tc_hbac);
     832                 :         10 :     return s;
     833                 :            : }
     834                 :            : 
     835                 :         10 : int main(int argc, const char *argv[])
     836                 :            : {
     837                 :            :     int number_failed;
     838                 :            : 
     839                 :         10 :     tests_set_cwd();
     840                 :            : 
     841                 :         10 :     Suite *s = hbac_test_suite();
     842                 :         10 :     SRunner *sr = srunner_create(s);
     843                 :            : 
     844                 :            :     /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
     845                 :         10 :     srunner_run_all(sr, CK_ENV);
     846                 :          1 :     number_failed = srunner_ntests_failed (sr);
     847                 :          1 :     srunner_free (sr);
     848                 :            : 
     849                 :          1 :     return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
     850                 :            : }

Generated by: LCOV version 1.9