acltext.y 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. /*
  10. * This grammar is intended to parse the version 3.0
  11. * and version 2.0 ACL text files and output an ACLListHandle_t
  12. * structure.
  13. */
  14. %{
  15. #include <string.h>
  16. #include <netsite.h>
  17. #include <base/util.h>
  18. #include <base/plist.h>
  19. #include <libaccess/acl.h>
  20. #include "aclpriv.h"
  21. #include <libaccess/aclproto.h>
  22. #include <libaccess/nserror.h>
  23. #include "parse.h"
  24. #include "aclscan.h"
  25. #define MAX_LIST_SIZE 255
  26. static ACLListHandle_t *curr_acl_list; /* current acl list */
  27. static ACLHandle_t *curr_acl; /* current acl */
  28. static ACLExprHandle_t *curr_expr; /* current expression */
  29. static PFlags_t pflags; /* current authorization flags */
  30. static char *curr_args_list[MAX_LIST_SIZE]; /* current args */
  31. static char *curr_user_list[MAX_LIST_SIZE]; /* current users v2 */
  32. static char *curr_ip_dns_list[MAX_LIST_SIZE]; /* current ip/dns v2 */
  33. static PList_t curr_auth_info; /* current authorization method */
  34. static int use_generic_rights; /* use generic rights for conversion */
  35. int acl_PushListHandle(ACLListHandle_t *handle)
  36. {
  37. curr_acl_list = handle;
  38. return(0);
  39. }
  40. static void
  41. acl_string_lower(char *s)
  42. {
  43. int ii;
  44. int len;
  45. len = strlen(s);
  46. for (ii = 0; ii < len; ii++)
  47. s[ii] = tolower(s[ii]);
  48. return;
  49. }
  50. static void
  51. acl_clear_args(char **args_list)
  52. {
  53. args_list[0] = NULL;
  54. }
  55. static void
  56. acl_add_arg(char **args_list, char *arg)
  57. {
  58. static int args_index;
  59. if ( args_list[0] == NULL ) {
  60. args_index = 0;
  61. }
  62. args_list[args_index] = arg;
  63. args_index++;
  64. args_list[args_index] = NULL;
  65. }
  66. static void
  67. acl_free_args(char **args_list)
  68. {
  69. int ii;
  70. for (ii = 0; ii < MAX_LIST_SIZE; ii++) {
  71. if ( args_list[ii] )
  72. free(args_list[ii]);
  73. else
  74. break;
  75. }
  76. }
  77. static int
  78. acl_set_args(ACLExprHandle_t *expr, char **args_list)
  79. {
  80. int ii;
  81. if (expr == NULL)
  82. return(-1);
  83. for (ii = 0; ii < MAX_LIST_SIZE; ii++) {
  84. if ( args_list[ii] ) {
  85. if ( ACL_ExprAddArg(NULL, expr, args_list[ii]) < 0 ) {
  86. yyerror("ACL_ExprAddArg() failed");
  87. return(-1);
  88. }
  89. } else
  90. break;
  91. }
  92. return(0);
  93. }
  94. static int
  95. acl_set_users_or_groups(ACLExprHandle_t *expr, char **user_list)
  96. {
  97. int ii;
  98. int jj;
  99. if (expr == NULL)
  100. return(-1);
  101. for (ii = 0; ii < MAX_LIST_SIZE; ii++) {
  102. if ( user_list[ii] ) {
  103. if ( ACL_ExprTerm(NULL, expr, "user", CMP_OP_EQ,
  104. user_list[ii]) < 0 ) {
  105. yyerror("ACL_ExprTerm() failed");
  106. acl_free_args(user_list);
  107. return(-1);
  108. }
  109. if ( ACL_ExprTerm(NULL, expr, "group", CMP_OP_EQ,
  110. user_list[ii]) < 0 ) {
  111. yyerror("ACL_ExprTerm() failed");
  112. acl_free_args(user_list);
  113. return(-1);
  114. }
  115. } else
  116. break;
  117. }
  118. acl_free_args(user_list);
  119. for (jj = 0; jj < (ii * 2) - 1; jj++) {
  120. if ( ACL_ExprOr(NULL, expr) < 0 ) {
  121. yyerror("ACL_ExprOr() failed");
  122. return(-1);
  123. }
  124. }
  125. return(0);
  126. }
  127. static int
  128. acl_set_ip_dns(ACLExprHandle_t *expr, char **ip_dns)
  129. {
  130. int ii;
  131. int jj;
  132. int len;
  133. const char *attr;
  134. char *val;
  135. if (expr == NULL)
  136. return(-1);
  137. for (ii = 0; ii < MAX_LIST_SIZE; ii++) {
  138. if ( ip_dns[ii] ) {
  139. attr = "ip";
  140. val = ip_dns[ii];
  141. len = strlen(val);
  142. for (jj = 0; jj < len; jj++) {
  143. if ( strchr("0123456789.*", val[jj]) == 0 ) {
  144. attr = "dns";
  145. break;
  146. }
  147. }
  148. if ( ACL_ExprTerm(NULL, expr, attr, CMP_OP_EQ,
  149. val) < 0 ) {
  150. yyerror("ACL_ExprTerm() failed");
  151. acl_free_args(ip_dns);
  152. return(-1);
  153. }
  154. } else
  155. break;
  156. }
  157. acl_free_args(ip_dns);
  158. for (jj = 0; jj < ii - 1; jj++) {
  159. if ( ACL_ExprOr(NULL, expr) < 0 ) {
  160. yyerror("ACL_ExprOr() failed");
  161. return(-1);
  162. }
  163. }
  164. return(0);
  165. }
  166. %}
  167. %union {
  168. char *string;
  169. int ival;
  170. }
  171. %token ACL_ABSOLUTE_TOK
  172. %token ACL_ACL_TOK
  173. %token ACL_ALLOW_TOK
  174. %token ACL_ALWAYS_TOK
  175. %token ACL_AND_TOK
  176. %token ACL_AT_TOK
  177. %token ACL_AUTHENTICATE_TOK
  178. %token ACL_CONTENT_TOK
  179. %token ACL_DEFAULT_TOK
  180. %token ACL_DENY_TOK
  181. %token ACL_GROUP_TOK
  182. %token ACL_IN_TOK
  183. %token ACL_INHERIT_TOK
  184. %token ACL_NOT_TOK
  185. %token ACL_NULL_TOK
  186. %token ACL_OR_TOK
  187. %token <string> ACL_QSTRING_TOK
  188. %token ACL_READ_TOK
  189. %token ACL_TERMINAL_TOK
  190. %token <string> ACL_VARIABLE_TOK
  191. %token ACL_VERSION_TOK
  192. %token ACL_WRITE_TOK
  193. %token ACL_WITH_TOK
  194. %token <ival> ACL_EQ_TOK
  195. %token <ival> ACL_GE_TOK
  196. %token <ival> ACL_GT_TOK
  197. %token <ival> ACL_LE_TOK
  198. %token <ival> ACL_LT_TOK
  199. %token <ival> ACL_NE_TOK
  200. %%
  201. /*
  202. * If no version is specified then we have a version 2.0 ACL.
  203. */
  204. start: | start_acl_v2
  205. | ACL_VERSION_TOK ACL_VARIABLE_TOK
  206. {
  207. free($<string>2);
  208. }
  209. ';' start_acl_v3
  210. ;
  211. /*
  212. ************************************************************
  213. * Parse version 2.0 ACL
  214. ************************************************************
  215. */
  216. start_acl_v2: acl_list_v2
  217. ;
  218. acl_list_v2: acl_v2
  219. | acl_list_v2 acl_v2
  220. ;
  221. acl_v2: ACL_ACL_TOK acl_name_v2
  222. '(' arg_list_v2 ')' '{' directive_list_v2 '}'
  223. {
  224. acl_free_args(curr_args_list);
  225. }
  226. ;
  227. acl_name_v2: ACL_VARIABLE_TOK
  228. {
  229. curr_acl = ACL_AclNew(NULL, $<string>1);
  230. free($<string>1);
  231. if ( ACL_ListAppend(NULL, curr_acl_list, curr_acl, 0) < 0 ) {
  232. yyerror("Couldn't add ACL to list.");
  233. return(-1);
  234. }
  235. acl_clear_args(curr_args_list);
  236. use_generic_rights = 0;
  237. if (strstr(curr_acl->tag, "READ")) {
  238. use_generic_rights++;
  239. acl_add_arg(curr_args_list, PERM_STRDUP("read"));
  240. acl_add_arg(curr_args_list, PERM_STRDUP("execute"));
  241. acl_add_arg(curr_args_list, PERM_STRDUP("list"));
  242. acl_add_arg(curr_args_list, PERM_STRDUP("info"));
  243. } if (strstr(curr_acl->tag, "WRITE")) {
  244. use_generic_rights++;
  245. acl_add_arg(curr_args_list, PERM_STRDUP("write"));
  246. acl_add_arg(curr_args_list, PERM_STRDUP("delete"));
  247. }
  248. }
  249. | ACL_QSTRING_TOK
  250. {
  251. curr_acl = ACL_AclNew(NULL, $<string>1);
  252. free($<string>1);
  253. if ( ACL_ListAppend(NULL, curr_acl_list, curr_acl, 0) < 0 ) {
  254. yyerror("Couldn't add ACL to list.");
  255. return(-1);
  256. }
  257. acl_clear_args(curr_args_list);
  258. use_generic_rights = 0;
  259. if (strstr(curr_acl->tag, "READ")) {
  260. use_generic_rights++;
  261. acl_add_arg(curr_args_list, PERM_STRDUP("read"));
  262. acl_add_arg(curr_args_list, PERM_STRDUP("execute"));
  263. acl_add_arg(curr_args_list, PERM_STRDUP("list"));
  264. acl_add_arg(curr_args_list, PERM_STRDUP("info"));
  265. } if (strstr(curr_acl->tag, "WRITE")) {
  266. use_generic_rights++;
  267. acl_add_arg(curr_args_list, PERM_STRDUP("write"));
  268. acl_add_arg(curr_args_list, PERM_STRDUP("delete"));
  269. }
  270. }
  271. ;
  272. arg_list_v2: arg_v2
  273. | arg_v2 ',' arg_list_v2
  274. ;
  275. arg_v2: ACL_VARIABLE_TOK
  276. {
  277. char acl_tmp_arg[255];
  278. char *acl_new_arg;
  279. if (!use_generic_rights) {
  280. acl_string_lower($<string>1);
  281. snprintf(acl_tmp_arg, sizeof(acl_tmp_arg), "http_%s", $<string>1);
  282. acl_tmp_arg[sizeof(acl_tmp_arg)-1] = '\0';
  283. PERM_FREE($<string>1);
  284. acl_new_arg = PERM_STRDUP(acl_tmp_arg);
  285. acl_add_arg(curr_args_list, acl_new_arg);
  286. } else {
  287. PERM_FREE($<string>1);
  288. }
  289. }
  290. | ACL_QSTRING_TOK
  291. {
  292. if (!use_generic_rights) {
  293. acl_add_arg(curr_args_list, $<string>1);
  294. } else {
  295. PERM_FREE($<string>1);
  296. }
  297. }
  298. ;
  299. directive_list_v2: directive_v2 ';'
  300. | directive_v2 ';' directive_list_v2
  301. ;
  302. directive_v2: auth_method_v2
  303. | auth_statement_v2
  304. ;
  305. auth_statement_v2: ACL_ALWAYS_TOK auth_type_v2
  306. {
  307. if ( ACL_ExprSetPFlags(NULL, curr_expr,
  308. ACL_PFLAG_ABSOLUTE) < 0 ) {
  309. yyerror("Could not set authorization processing flags");
  310. return(-1);
  311. }
  312. }
  313. host_spec_list_action_v2
  314. | ACL_DEFAULT_TOK auth_type_v2 host_spec_list_action_v2
  315. ;
  316. auth_type_v2: ACL_ALLOW_TOK
  317. {
  318. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_ALLOW) ;
  319. if ( curr_expr == NULL ) {
  320. yyerror("ACL_ExprNew(allow) failed");
  321. return(-1);
  322. }
  323. acl_clear_args(curr_user_list);
  324. acl_clear_args(curr_ip_dns_list);
  325. }
  326. | ACL_DENY_TOK
  327. {
  328. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_DENY) ;
  329. if ( curr_expr == NULL ) {
  330. yyerror("ACL_ExprNew(allow) failed");
  331. return(-1);
  332. }
  333. acl_clear_args(curr_user_list);
  334. acl_clear_args(curr_ip_dns_list);
  335. }
  336. ;
  337. auth_method_v2:
  338. ACL_ALWAYS_TOK ACL_AUTHENTICATE_TOK ACL_IN_TOK
  339. {
  340. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_AUTH) ;
  341. if ( curr_expr == NULL ) {
  342. yyerror("ACL_ExprNew(auth) failed");
  343. return(-1);
  344. }
  345. if ( ACL_ExprSetPFlags(NULL, curr_expr,
  346. ACL_PFLAG_ABSOLUTE) < 0 ) {
  347. yyerror("Could not set authorization processing flags");
  348. return(-1);
  349. }
  350. curr_auth_info = PListCreate(NULL, ACL_ATTR_INDEX_MAX, 0, 0);
  351. if ( ACL_ExprAddAuthInfo(curr_expr, curr_auth_info) < 0 ) {
  352. yyerror("Could not set authorization info");
  353. return(-1);
  354. }
  355. }
  356. realm_definition_v2
  357. | ACL_DEFAULT_TOK ACL_AUTHENTICATE_TOK ACL_IN_TOK
  358. {
  359. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_AUTH) ;
  360. if ( curr_expr == NULL ) {
  361. yyerror("ACL_ExprNew(auth) failed");
  362. return(-1);
  363. }
  364. curr_auth_info = PListCreate(NULL, ACL_ATTR_INDEX_MAX, 0, 0);
  365. if ( ACL_ExprAddAuthInfo(curr_expr, curr_auth_info) < 0 ) {
  366. yyerror("Could not set authorization info");
  367. return(-1);
  368. }
  369. }
  370. realm_definition_v2
  371. ;
  372. host_spec_list_action_v2: user_expr_v2 ACL_AT_TOK host_spec_list_v2
  373. {
  374. if ( acl_set_users_or_groups(curr_expr, curr_user_list) < 0 ) {
  375. yyerror("acl_set_users_or_groups() failed");
  376. return(-1);
  377. }
  378. if ( acl_set_ip_dns(curr_expr, curr_ip_dns_list) < 0 ) {
  379. yyerror("acl_set_ip_dns() failed");
  380. return(-1);
  381. }
  382. if ( ACL_ExprAnd(NULL, curr_expr) < 0 ) {
  383. yyerror("ACL_ExprAnd() failed");
  384. return(-1);
  385. }
  386. if ( acl_set_args(curr_expr, curr_args_list) < 0 ) {
  387. yyerror("acl_set_args() failed");
  388. return(-1);
  389. }
  390. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  391. yyerror("Could not add authorization");
  392. return(-1);
  393. }
  394. }
  395. | user_expr_v2
  396. {
  397. if ( acl_set_users_or_groups(curr_expr, curr_user_list) < 0 ) {
  398. yyerror("acl_set_users_or_groups() failed");
  399. return(-1);
  400. }
  401. if ( acl_set_args(curr_expr, curr_args_list) < 0 ) {
  402. yyerror("acl_set_args() failed");
  403. return(-1);
  404. }
  405. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  406. yyerror("Could not add authorization");
  407. return(-1);
  408. }
  409. }
  410. ;
  411. user_expr_v2: user_v2
  412. | '(' user_list_v2 ')'
  413. ;
  414. user_list_v2: user_v2
  415. | user_v2 ',' user_list_v2
  416. ;
  417. user_v2: ACL_VARIABLE_TOK
  418. {
  419. acl_add_arg(curr_user_list, $<string>1);
  420. }
  421. | ACL_QSTRING_TOK
  422. {
  423. acl_add_arg(curr_user_list, $<string>1);
  424. }
  425. ;
  426. host_spec_list_v2: dns_spec_v2
  427. | ip_spec_v2
  428. | '(' dns_ip_spec_list_v2 ')'
  429. ;
  430. dns_spec_v2: ACL_VARIABLE_TOK
  431. {
  432. acl_add_arg(curr_ip_dns_list, $<string>1);
  433. }
  434. | ACL_QSTRING_TOK
  435. {
  436. acl_add_arg(curr_ip_dns_list, $<string>1);
  437. }
  438. ;
  439. ip_spec_v2: ACL_VARIABLE_TOK ACL_VARIABLE_TOK
  440. {
  441. char tmp_str[255];
  442. util_sprintf(tmp_str, "%s+%s", $<string>1, $<string>2);
  443. free($<string>1);
  444. free($<string>2);
  445. acl_add_arg(curr_ip_dns_list, PERM_STRDUP(tmp_str));
  446. }
  447. ;
  448. dns_ip_spec_list_v2: dns_spec_v2
  449. | ip_spec_v2
  450. | dns_spec_v2 ',' dns_ip_spec_list_v2
  451. | ip_spec_v2 ',' dns_ip_spec_list_v2
  452. ;
  453. realm_definition_v2: '{' methods_list_v2 '}'
  454. {
  455. if ( ACL_ExprAddArg(NULL, curr_expr, "user") < 0 ) {
  456. yyerror("ACL_ExprAddArg() failed");
  457. return(-1);
  458. }
  459. if ( ACL_ExprAddArg(NULL, curr_expr, "group") < 0 ) {
  460. yyerror("ACL_ExprAddArg() failed");
  461. return(-1);
  462. }
  463. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  464. yyerror("Could not add authorization");
  465. return(-1);
  466. }
  467. }
  468. ;
  469. method_v2: ACL_VARIABLE_TOK ACL_VARIABLE_TOK ';'
  470. {
  471. acl_string_lower($<string>1);
  472. if (strcmp($<string>1, "database") == 0) {
  473. free($<string>1);
  474. free($<string>2);
  475. } else {
  476. if ( PListInitProp(curr_auth_info,
  477. ACL_Attr2Index($<string>1), $<string>1, $<string>2, NULL) < 0 ) {
  478. }
  479. free($<string>1);
  480. }
  481. }
  482. | ACL_VARIABLE_TOK ACL_QSTRING_TOK ';'
  483. {
  484. acl_string_lower($<string>1);
  485. if (strcmp($<string>1, "database") == 0) {
  486. free($<string>1);
  487. free($<string>2);
  488. } else {
  489. if ( PListInitProp(curr_auth_info,
  490. ACL_Attr2Index($<string>1), $<string>1, $<string>2, NULL) < 0 ) {
  491. }
  492. free($<string>1);
  493. }
  494. }
  495. ;
  496. methods_list_v2: method_v2
  497. | method_v2 methods_list_v2
  498. ;
  499. /*
  500. ************************************************************
  501. * Parse version 3.0 ACL
  502. ************************************************************
  503. */
  504. start_acl_v3: acl_list
  505. ;
  506. acl_list: acl
  507. | acl_list acl
  508. ;
  509. acl: named_acl ';' body_list
  510. | named_acl ';'
  511. ;
  512. named_acl: ACL_ACL_TOK ACL_VARIABLE_TOK
  513. {
  514. curr_acl = ACL_AclNew(NULL, $<string>2);
  515. free($<string>2);
  516. if ( ACL_ListAppend(NULL, curr_acl_list, curr_acl, 0) < 0 ) {
  517. yyerror("Couldn't add ACL to list.");
  518. return(-1);
  519. }
  520. }
  521. | ACL_ACL_TOK ACL_QSTRING_TOK
  522. {
  523. curr_acl = ACL_AclNew(NULL, $<string>2);
  524. free($<string>2);
  525. if ( ACL_ListAppend(NULL, curr_acl_list, curr_acl, 0) < 0 ) {
  526. yyerror("Couldn't add ACL to list.");
  527. return(-1);
  528. }
  529. }
  530. ;
  531. body_list: body
  532. | body body_list
  533. ;
  534. body: authenticate_statement ';'
  535. | authorization_statement ';'
  536. | deny_statement ';'
  537. ;
  538. deny_statement:
  539. ACL_ABSOLUTE_TOK ACL_DENY_TOK ACL_WITH_TOK
  540. {
  541. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_RESPONSE) ;
  542. if ( curr_expr == NULL ) {
  543. yyerror("ACL_ExprNew(deny) failed");
  544. return(-1);
  545. }
  546. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  547. yyerror("Could not add authorization");
  548. return(-1);
  549. }
  550. if ( ACL_ExprSetPFlags(NULL, curr_expr,
  551. ACL_PFLAG_ABSOLUTE) < 0 ) {
  552. yyerror("Could not set deny processing flags");
  553. return(-1);
  554. }
  555. }
  556. deny_common
  557. | ACL_DENY_TOK ACL_WITH_TOK
  558. {
  559. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_RESPONSE) ;
  560. if ( curr_expr == NULL ) {
  561. yyerror("ACL_ExprNew(deny) failed");
  562. return(-1);
  563. }
  564. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  565. yyerror("Could not add authorization");
  566. return(-1);
  567. }
  568. }
  569. deny_common
  570. ;
  571. deny_common: ACL_VARIABLE_TOK ACL_EQ_TOK ACL_QSTRING_TOK
  572. {
  573. acl_string_lower($<string>1);
  574. if ( ACL_ExprSetDenyWith(NULL, curr_expr,
  575. $<string>1, $<string>3) < 0 ) {
  576. yyerror("ACL_ExprSetDenyWith() failed");
  577. return(-1);
  578. }
  579. free($<string>1);
  580. free($<string>3);
  581. }
  582. ;
  583. authenticate_statement: ACL_AUTHENTICATE_TOK
  584. {
  585. pflags = 0;
  586. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_AUTH) ;
  587. if ( curr_expr == NULL ) {
  588. yyerror("ACL_ExprNew(allow) failed");
  589. return(-1);
  590. }
  591. curr_auth_info = PListCreate(NULL, ACL_ATTR_INDEX_MAX, 0, 0);
  592. if ( ACL_ExprAddAuthInfo(curr_expr, curr_auth_info) < 0 ) {
  593. yyerror("Could not set authorization info");
  594. return(-1);
  595. }
  596. }
  597. '(' attribute_list ')' '{' parameter_list '}'
  598. {
  599. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  600. yyerror("Could not add authorization");
  601. return(-1);
  602. }
  603. }
  604. ;
  605. attribute_list: attribute
  606. | attribute_list ',' attribute
  607. attribute: ACL_VARIABLE_TOK
  608. {
  609. acl_string_lower($<string>1);
  610. if ( ACL_ExprAddArg(NULL, curr_expr, $<string>1) < 0 ) {
  611. yyerror("ACL_ExprAddArg() failed");
  612. return(-1);
  613. }
  614. free($<string>1);
  615. }
  616. ;
  617. parameter_list: parameter ';'
  618. | parameter ';' parameter_list
  619. ;
  620. parameter: ACL_VARIABLE_TOK ACL_EQ_TOK ACL_QSTRING_TOK
  621. {
  622. acl_string_lower($<string>1);
  623. if ( PListInitProp(curr_auth_info,
  624. ACL_Attr2Index($<string>1), $<string>1, $<string>3, NULL) < 0 ) {
  625. }
  626. free($<string>1);
  627. }
  628. | ACL_VARIABLE_TOK ACL_EQ_TOK ACL_VARIABLE_TOK
  629. {
  630. acl_string_lower($<string>1);
  631. if ( PListInitProp(curr_auth_info,
  632. ACL_Attr2Index($<string>1), $<string>1, $<string>3, NULL) < 0 ) {
  633. }
  634. free($<string>1);
  635. }
  636. ;
  637. authorization_statement: ACL_ALLOW_TOK
  638. {
  639. pflags = 0;
  640. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_ALLOW) ;
  641. if ( curr_expr == NULL ) {
  642. yyerror("ACL_ExprNew(allow) failed");
  643. return(-1);
  644. }
  645. }
  646. auth_common_action
  647. | ACL_DENY_TOK
  648. {
  649. pflags = 0;
  650. curr_expr = ACL_ExprNew(ACL_EXPR_TYPE_DENY) ;
  651. if ( curr_expr == NULL ) {
  652. yyerror("ACL_ExprNew(deny) failed");
  653. return(-1);
  654. }
  655. }
  656. auth_common_action
  657. ;
  658. auth_common_action:
  659. {
  660. if ( ACL_ExprAppend(NULL, curr_acl, curr_expr) < 0 ) {
  661. yyerror("Could not add authorization");
  662. return(-1);
  663. }
  664. }
  665. auth_common
  666. {
  667. if ( ACL_ExprSetPFlags (NULL, curr_expr, pflags) < 0 ) {
  668. yyerror("Could not set authorization processing flags");
  669. return(-1);
  670. }
  671. #ifdef DEBUG
  672. if ( ACL_ExprDisplay(curr_expr) < 0 ) {
  673. yyerror("ACL_ExprDisplay() failed");
  674. return(-1);
  675. }
  676. printf("Parsed authorization.\n");
  677. #endif
  678. }
  679. ;
  680. auth_common: flag_list '(' args_list ')' expression
  681. ;
  682. flag_list:
  683. | ACL_ABSOLUTE_TOK
  684. {
  685. pflags = ACL_PFLAG_ABSOLUTE;
  686. }
  687. | ACL_ABSOLUTE_TOK content_static
  688. {
  689. pflags = ACL_PFLAG_ABSOLUTE;
  690. }
  691. | ACL_CONTENT_TOK
  692. {
  693. pflags = ACL_PFLAG_CONTENT;
  694. }
  695. | ACL_CONTENT_TOK absolute_static
  696. {
  697. pflags = ACL_PFLAG_CONTENT;
  698. }
  699. | ACL_TERMINAL_TOK
  700. {
  701. pflags = ACL_PFLAG_TERMINAL;
  702. }
  703. | ACL_TERMINAL_TOK content_absolute
  704. {
  705. pflags = ACL_PFLAG_TERMINAL;
  706. }
  707. ;
  708. content_absolute: ACL_CONTENT_TOK
  709. {
  710. pflags |= ACL_PFLAG_CONTENT;
  711. }
  712. | ACL_ABSOLUTE_TOK
  713. {
  714. pflags |= ACL_PFLAG_ABSOLUTE;
  715. }
  716. | ACL_CONTENT_TOK ACL_ABSOLUTE_TOK
  717. {
  718. pflags |= ACL_PFLAG_ABSOLUTE | ACL_PFLAG_CONTENT;
  719. }
  720. | ACL_ABSOLUTE_TOK ACL_CONTENT_TOK
  721. {
  722. pflags |= ACL_PFLAG_ABSOLUTE | ACL_PFLAG_CONTENT;
  723. }
  724. ;
  725. content_static: ACL_CONTENT_TOK
  726. {
  727. pflags |= ACL_PFLAG_CONTENT;
  728. }
  729. | ACL_TERMINAL_TOK
  730. {
  731. pflags |= ACL_PFLAG_TERMINAL;
  732. }
  733. | ACL_CONTENT_TOK ACL_TERMINAL_TOK
  734. {
  735. pflags |= ACL_PFLAG_TERMINAL | ACL_PFLAG_CONTENT;
  736. }
  737. | ACL_TERMINAL_TOK ACL_CONTENT_TOK
  738. {
  739. pflags |= ACL_PFLAG_TERMINAL | ACL_PFLAG_CONTENT;
  740. }
  741. ;
  742. absolute_static: ACL_ABSOLUTE_TOK
  743. {
  744. pflags |= ACL_PFLAG_ABSOLUTE;
  745. }
  746. | ACL_TERMINAL_TOK
  747. {
  748. pflags |= ACL_PFLAG_TERMINAL;
  749. }
  750. | ACL_ABSOLUTE_TOK ACL_TERMINAL_TOK
  751. {
  752. pflags |= ACL_PFLAG_TERMINAL | ACL_PFLAG_ABSOLUTE;
  753. }
  754. | ACL_TERMINAL_TOK ACL_ABSOLUTE_TOK
  755. {
  756. pflags |= ACL_PFLAG_TERMINAL | ACL_PFLAG_ABSOLUTE;
  757. }
  758. ;
  759. args_list: arg
  760. | args_list ',' arg
  761. ;
  762. arg: ACL_VARIABLE_TOK
  763. {
  764. acl_string_lower($<string>1);
  765. if ( ACL_ExprAddArg(NULL, curr_expr, $<string>1) < 0 ) {
  766. yyerror("ACL_ExprAddArg() failed");
  767. return(-1);
  768. }
  769. free( $<string>1 );
  770. }
  771. ;
  772. expression: factor
  773. | factor ACL_AND_TOK expression
  774. {
  775. if ( ACL_ExprAnd(NULL, curr_expr) < 0 ) {
  776. yyerror("ACL_ExprAnd() failed");
  777. return(-1);
  778. }
  779. }
  780. | factor ACL_OR_TOK expression
  781. {
  782. if ( ACL_ExprOr(NULL, curr_expr) < 0 ) {
  783. yyerror("ACL_ExprOr() failed");
  784. return(-1);
  785. }
  786. }
  787. ;
  788. factor: base_expr
  789. | '(' expression ')'
  790. | ACL_NOT_TOK factor
  791. {
  792. if ( ACL_ExprNot(NULL, curr_expr) < 0 ) {
  793. yyerror("ACL_ExprNot() failed");
  794. return(-1);
  795. }
  796. }
  797. ;
  798. base_expr: ACL_VARIABLE_TOK relop ACL_QSTRING_TOK
  799. {
  800. acl_string_lower($<string>1);
  801. if ( ACL_ExprTerm(NULL, curr_expr,
  802. $<string>1, (CmpOp_t) $<ival>2, $<string>3) < 0 ) {
  803. yyerror("ACL_ExprTerm() failed");
  804. free($<string>1);
  805. free($<string>3);
  806. return(-1);
  807. }
  808. free($<string>1);
  809. free($<string>3);
  810. }
  811. | ACL_VARIABLE_TOK relop ACL_VARIABLE_TOK
  812. {
  813. acl_string_lower($<string>1);
  814. if ( ACL_ExprTerm(NULL, curr_expr,
  815. $<string>1, (CmpOp_t) $<ival>2, $<string>3) < 0 ) {
  816. yyerror("ACL_ExprTerm() failed");
  817. free($<string>1);
  818. free($<string>3);
  819. return(-1);
  820. }
  821. free($<string>1);
  822. free($<string>3);
  823. }
  824. ;
  825. relop: ACL_EQ_TOK
  826. | ACL_GE_TOK
  827. | ACL_GT_TOK
  828. | ACL_LT_TOK
  829. | ACL_LE_TOK
  830. | ACL_NE_TOK
  831. ;
  832. %%