source: libabac/rt2.y @ d0efdec

mei_rt2
Last change on this file since d0efdec was 7751094, checked in by Mei <mei@…>, 11 years ago

1) take out a include from rt2.y

  • Property mode set to 100644
File size: 14.3 KB
RevLine 
[718ad924]1
[b5a3da4]2/* bison grammar rules for process new rt2 statements */
[718ad924]3
4%{
5// include the GNU extension of asprintf
6#define _GNU_SOURCE
7
8/* C declarations */
9#include <stdio.h>
10#include <string.h>
11
12#include "abac_pl_yy.h"
[2e9455f]13#include "abac_verifier.h"
[718ad924]14
[da5afdf]15/* lex tie-ins flag */
[718ad924]16int yyerror (char *s);
[9335cfa]17static int debug=0;
[718ad924]18
19FILE *abac_yyout = NULL;
20char *abac_yyfptr = NULL;
[2e9455f]21void *abac_yyctxt=NULL;
[718ad924]22
[7727f26]23#define USE(evalue) ((getenv(evalue)!=NULL)?1:0)
[2e9455f]24#define OUT(msg) { if(debug) fprintf(abac_yyout,"\n===%s\n",msg); }
[7727f26]25
[718ad924]26void panic(char *msg);
27 
28%}
29/* Bison declarations */
30%union {
31struct _abac_yy_principal_t *pstruct;
[da5afdf]32struct _abac_yy_term_principal_t *ppstruct;
33struct _abac_yy_term_data_t *pdstruct;
[8bd77b5]34struct _abac_yy_roleoset_t *rostruct;
[da5afdf]35struct _abac_yy_term_t *dstruct;
36struct _abac_yy_expression_t *estruct;
[0d0c3a9]37struct _abac_list_t *lstruct;
[718ad924]38char *string;   /* For returning char strings */
[da5afdf]39int intval; /* for returning some value */
[718ad924]40}
[da5afdf]41
42%start input
43
[2e9455f]44%type <intval> stmt
[8bd77b5]45%type <rostruct> rolepart
[da5afdf]46%type <estruct> roleleft
47%type <estruct> roleright
[718ad924]48%type <estruct> roleterm
[8bd77b5]49%type <rostruct> osetpart
[da5afdf]50%type <estruct> osetleft
51%type <estruct> osetright
52%type <estruct> osetterm
[718ad924]53%type <pstruct> keypart
[da5afdf]54%type <dstruct> terms
55%type <dstruct> term
[718ad924]56%type <pdstruct> typedpart
[da5afdf]57%type <pdstruct> otypetail
[718ad924]58%type <ppstruct> principalpart
[da5afdf]59%type <lstruct> rangetype
60%type <lstruct> values
[718ad924]61
[36b100a]62%token <string> IDEN                /* keyname or rolename or osetname */
[da5afdf]63%token <string> CAPIDEN             /* variable name */
64%token <string> ROLE                /* the word, role */
65%token <string> OSET                /* the word, oset */
66%token <string> PRINCIPAL           /* the word, principal */
[2e9455f]67%token <string> THIS                /* the word, this */
[da5afdf]68%token <string> OTYPE               /* integer,boolean,urn,time,string,float */
69%token <string> OTYPE_CONSTANT     
70%token <string> VARIABLE_CONSTANT   /* constant for ?AAA */
71%token <string> KEYTYPE             /* keyid | or something else */
72%token <string> KEYID_CONSTANT      /* keyid | or something else */
73%token <string> VALUE               /* range value in static constraint */
[718ad924]74
75%token  <operator>  DERIVE    "<-"
76%token  <operator>  DOT       "."
77%token  <operator>  AND       "&"
78%token  <operator>  LPAREN    "("
79%token  <operator>  RPAREN    ")"
80%token  <operator>  LSQUARE   "["
81%token  <operator>  RSQUARE   "]"
82%token  <operator>  LANGLE    "<"
83%token  <operator>  RANGLE    ">"
84%token  <operator>  COLON     ":"
85%token  <operator>  COMMA     ","
86%token  <operator>  QMARK     "?"
[da5afdf]87%token  <operator>  DOTDOT    ".."
[718ad924]88
89%%
90/* Grammar rules */
91
92input:      /* empty */
93             { }
[da5afdf]94     | stmt
[718ad924]95             { 
[2e9455f]96               /* SUCCESS */
[718ad924]97             }
[da5afdf]98     ;
[718ad924]99 
100/* generate/concate prolog credentials clauses */
[da5afdf]101stmt : roleleft DERIVE roleright
102             {
103               abac_yy_expression_t *headexpr=$1;
104               abac_yy_expression_t *tailexpr=$3;
[2e9455f]105               int rc=make_role_statement(headexpr, tailexpr);
106               if(rc) {
[da5afdf]107                   panic("unable to parse the role rule statment");
108                   YYERROR;
109                   } else {
[2e9455f]110                       $$=rc;
[da5afdf]111               }
112             }
113     | osetleft DERIVE osetright
[718ad924]114             {
[da5afdf]115               abac_yy_expression_t *headexpr=$1;
116               abac_yy_expression_t *tailexpr=$3;
[2e9455f]117               int rc=make_oset_statement(headexpr, tailexpr);
118               if(rc) {
[da5afdf]119                   panic("unable to parse the oset rule statment");
[718ad924]120                   YYERROR;
121                   } else {
[2e9455f]122                       $$=rc;
[718ad924]123               }
124             }
[da5afdf]125     ;
[718ad924]126/*
127   [keyid:isi].role:modifyBy([keyid:mike])
128   [keyid:acme].role:preferred
129*/
[da5afdf]130roleleft : keypart DOT rolepart
[718ad924]131             {
132               abac_yy_principal_t *keypart=$1;
[8bd77b5]133               abac_yy_roleoset_t *rolepart=$3;
[da5afdf]134               abac_yy_expression_t *expr=
135                    make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
[718ad924]136               $$=expr;
137             }
[da5afdf]138     ;
[718ad924]139
140/* [keyid:mike] */
[da5afdf]141keypart : LSQUARE KEYTYPE COLON
[2e9455f]142             { abac_ll_push_keyid_yystate(); }
[da5afdf]143          KEYID_CONSTANT
[2e9455f]144             { abac_ll_pop_yystate(); }
[da5afdf]145          RSQUARE
[718ad924]146             {
[8bd77b5]147               int idtype=abac_verify_idtype_type($2);
[7727f26]148               char *tmp=NULL;
[d037f54]149               asprintf(&tmp,"%s",$5);
[2e9455f]150               $$=make_yy_principal(tmp, tmp, idtype);
[7727f26]151               char *cn=abac_cn_with_sha(tmp);
[718ad924]152               if(cn && idtype)  {
[7727f26]153                 $$=make_yy_principal(tmp, cn, idtype);
[718ad924]154                 } else {
[2e9455f]155                     if((USE("ABAC_CN")) && (cn==NULL)) {
[d9c3886]156                         if(debug)
157                             asprintf(&tmp,"encountered an invalid SHA id(%s)",$5);
158                         else asprintf(&tmp,"encountered an invalid SHA id");
[9335cfa]159                         panic(tmp);
160                         free(tmp);
[7727f26]161                         YYERROR;
162                     }
163                     $$=make_yy_principal(tmp, NULL, idtype);
[718ad924]164               }
165             }
[da5afdf]166     ;
[718ad924]167/*
168   role:modifyBy([keyid:mike],[keyid:ted])
169   role:modifyBy([keyid:mike])
170   role:preferred
171*/
[da5afdf]172rolepart : ROLE COLON IDEN LPAREN terms RPAREN
[718ad924]173             {
[8bd77b5]174               $$=make_yy_roleoset_role($3,$5);
[718ad924]175             }
[da5afdf]176     | ROLE COLON IDEN
[718ad924]177             {
[8bd77b5]178               $$=make_yy_roleoset_role($3,NULL);
[718ad924]179             }
[da5afdf]180     ;
[718ad924]181
182/*
183   [keyid:mike],[keyid:ted]
184   [keyid:mike]
185   [principal:?Z]
186   [int:99]
187   [int:?Z]
[2e9455f]188   [?this], this could be any of type...
[718ad924]189   [?]
190*/
[da5afdf]191terms : term COMMA terms
[718ad924]192             {
[da5afdf]193               abac_yy_term_t *nterm=$1;
194               abac_yy_term_t *terms=$3;
195               $$=add_yy_term(nterm, terms);
[718ad924]196             }
[da5afdf]197     | term
[718ad924]198             {
199               $$=$1;
200             }
[da5afdf]201     ;
[718ad924]202
[2e9455f]203term : LSQUARE QMARK THIS RSQUARE
204             { $$= make_yy_term_dterm_this(); }
205     | LSQUARE QMARK RSQUARE
[da5afdf]206             { $$= make_yy_term_dterm_anonymous(); }
207     | keypart
208             { $$= make_yy_term_dterm_named($1); }
209     | principalpart
210             { $$= make_yy_term_dterm_principal($1); }
211     | typedpart
212             { $$= make_yy_term_dterm_data($1); }
213     ;
214
215values : VALUE COMMA values
[b5a3da4]216             { $$=add_yy_val_range($3, $1); }
[da5afdf]217       |  VALUE
218             { $$=make_yy_val_range($1); }
219       ;
220     
221
222rangetype : LSQUARE VALUE DOTDOT VALUE RSQUARE
223             { $$=make_yy_minmax_range($2,$4); }
224          |  LSQUARE DOTDOT VALUE RSQUARE
225             { $$=make_yy_max_range($3); }
226          |  LSQUARE VALUE DOTDOT RSQUARE
227             { $$=make_yy_min_range($2); }
228          |  LSQUARE values RSQUARE
229             { $$=$2; }
230          ;
231
[7211a95]232/* [otype:?Z{oset-constraint}] */
[da5afdf]233/* [int:?I:[10 .. 20] */
[c586a3c]234/* [float:?F:[0.5 .. 2.5] */
235/* [string:?S:["abc",'efg',"hij"] -only listed range */
236/* urn same as string */
237/* time like int but with quoted string values */
[2e9455f]238/* XXX would have to extend this if want the linked oset in the
239   constraints..
240   [otype:?Z{linked oset-constraint}]
241*/
[0d0c3a9]242otypetail :  VARIABLE_CONSTANT COLON
[da5afdf]243             {
[2e9455f]244               abac_ll_pop_yystate();
245               abac_ll_push_range_yystate();
[718ad924]246             }
[da5afdf]247            rangetype
248            {
[2e9455f]249              abac_ll_pop_yystate();
[9806e76]250              abac_yy_term_data_t *ptr=make_yy_term_data();
251              set_yy_term_data_name(ptr,$1);
[da5afdf]252              set_yy_term_data_is_variable(ptr);
253              set_yy_term_data_cond_range(ptr,$4);
254              $$=ptr;
[2e9455f]255              OUT("otypetail_1");
[da5afdf]256            }
257     | VARIABLE_CONSTANT
[2e9455f]258            { abac_ll_pop_yystate(); }
259            osetterm
[da5afdf]260            {
[9806e76]261              abac_yy_term_data_t *ptr=make_yy_term_data();
262              set_yy_term_data_name(ptr,$1);
[da5afdf]263              set_yy_term_data_is_variable(ptr);
[d845403]264              set_yy_term_data_cond_head_expr(ptr,$3);
[da5afdf]265              $$=ptr;
[2e9455f]266              OUT("otypetail_2");
[da5afdf]267            }
268     | VARIABLE_CONSTANT
269            {
[2e9455f]270              abac_ll_pop_yystate();
[9806e76]271              abac_yy_term_data_t *ptr=make_yy_term_data();
272              set_yy_term_data_name(ptr,$1);
[da5afdf]273              set_yy_term_data_is_variable(ptr);
274              $$=ptr;
[2e9455f]275              OUT("otypetail_3");
[da5afdf]276            }
277     | OTYPE_CONSTANT
278            {
[2e9455f]279              abac_ll_pop_yystate();
[9806e76]280              abac_yy_term_data_t *ptr=make_yy_term_data();
281              set_yy_term_data_name(ptr,$1);
[da5afdf]282              $$=ptr;
[2e9455f]283              OUT("otypetail_4");
[da5afdf]284            }
[9806e76]285     | QMARK
286            {
[2e9455f]287              abac_ll_pop_yystate();
[9806e76]288              abac_yy_term_data_t *ptr=make_yy_term_data();
289              set_yy_term_data_is_anonymous(ptr);
290              $$= ptr;
291            }
[da5afdf]292     ;
293
294typedpart  : LSQUARE OTYPE COLON
[2e9455f]295             { abac_ll_push_yystate($2); }
[da5afdf]296             otypetail RSQUARE
297             {
298               abac_yy_term_data_t *ptr=$5;
299               set_yy_term_data_type(ptr,$2);
300               if(is_yy_term_data_has_constraint(ptr)) {
[9806e76]301                  char *tail_string=get_yy_term_data_name(ptr);
[440ba20]302                  make_yy_range_constraint(ptr);
[e88c95b]303                  make_yy_oset_constraint(ptr,tail_string);
[718ad924]304               }
[da5afdf]305               $$=$5;
[718ad924]306             }
[da5afdf]307     ;
308
[718ad924]309
[2e9455f]310
[9806e76]311/* [principal:?] */
[718ad924]312/* [principal:?Z] */
[9335cfa]313/* [principal:?This] */
[2e9455f]314/* [principal:?Z{role-constraint}] */
315/* XXX if want to allow linked role constraint need to swap roleleft
316       into roleterm.. but make sure the tree is right
3173/21/13, [principal:?Z[keyid:A].role:roleA.role:roleB([string:?P])]
318*/
319principalpart : LSQUARE PRINCIPAL COLON QMARK IDEN roleterm RSQUARE
[da5afdf]320                {
321                  abac_yy_expression_t *expr=$6;
322                  char *tail_string=$5;
[9806e76]323                  abac_yy_term_principal_t *ptr=make_yy_term_principal();
324                  set_yy_term_principal_name(ptr,tail_string);
[da5afdf]325                  set_yy_term_principal_cond_head_expr(ptr,expr);
[440ba20]326                  make_yy_role_constraint(ptr,tail_string);
[da5afdf]327                  $$=ptr;
[2e9455f]328                  OUT("principalpart_1");
[da5afdf]329                }
330              | LSQUARE PRINCIPAL COLON QMARK IDEN RSQUARE
[9806e76]331                {
332                  abac_yy_term_principal_t *ptr=make_yy_term_principal();
333                  set_yy_term_principal_name(ptr,$5);
334                  $$ = ptr;
[2e9455f]335                  OUT("principalpart_2");
[9806e76]336                }
337              | LSQUARE PRINCIPAL COLON QMARK RSQUARE
338                {
339                  abac_yy_term_principal_t *ptr=make_yy_term_principal();
340                  set_yy_term_principal_is_anonymous(ptr);
341                  $$ = ptr;
[2e9455f]342                  OUT("principalpart_3");
[9806e76]343                }
[da5afdf]344     ;
[718ad924]345
[da5afdf]346roleright : roleterm AND roleright
[718ad924]347             {
[da5afdf]348               abac_yy_expression_t *nexpr=$1;
349               abac_yy_expression_t *exprs=$3;
350               $$=add_yy_expression(nexpr,exprs);
[718ad924]351             }
[da5afdf]352     | roleterm
[718ad924]353             { $$=$1; }
[da5afdf]354     ;
[718ad924]355
356/* role at tail/right side
357  [keyid:usc].role:employee.role:friend
358  [keyid:usc].role:worker
359  [keyid:mike]
360*/
361roleterm : keypart DOT rolepart DOT rolepart
362             {
363               abac_yy_principal_t *keypart=$1;
[8bd77b5]364               abac_yy_roleoset_t *linked_rolepart=$3;
365               abac_yy_roleoset_t *rolepart=$5;
[da5afdf]366               abac_yy_expression_t *expr=
367                  make_yy_expression(e_yy_EXPR_LINKED,keypart,rolepart,linked_rolepart);
[718ad924]368               $$=expr;
[2e9455f]369               OUT("roleterm_1");
[718ad924]370             }
[da5afdf]371     | keypart DOT rolepart
[718ad924]372             {
373               abac_yy_principal_t *keypart=$1;
[8bd77b5]374               abac_yy_roleoset_t *rolepart=$3;
[da5afdf]375               abac_yy_expression_t *expr=
376                   make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
[718ad924]377               $$=expr;
[2e9455f]378               OUT("roleterm_2");
[718ad924]379             }
[da5afdf]380     | keypart
[718ad924]381             {
382               abac_yy_principal_t *keypart=$1;
[da5afdf]383               abac_yy_expression_t *expr=
384                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
[718ad924]385               $$=expr;
[2e9455f]386               OUT("roleterm_3");
[718ad924]387             }
[da5afdf]388     ;
389
390osetterm : keypart DOT rolepart DOT osetpart
391             {
392               abac_yy_principal_t *keypart=$1;
[8bd77b5]393               abac_yy_roleoset_t *linked_rolepart=$3;
394               abac_yy_roleoset_t *osetpart=$5;
[da5afdf]395               abac_yy_expression_t *expr=
396                  make_yy_expression(e_yy_EXPR_LINKED,keypart,osetpart,linked_rolepart);
397               $$=expr;
[2e9455f]398               OUT("osetterm_1");
[da5afdf]399             }
400     | keypart DOT osetpart
401             {
402               abac_yy_principal_t *keypart=$1;
[8bd77b5]403               abac_yy_roleoset_t *osetpart=$3;
[da5afdf]404               abac_yy_expression_t *expr=
405                   make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
406               $$=expr;
[2e9455f]407               OUT("osetterm_2");
[da5afdf]408             }
409     | keypart
410             {
411               abac_yy_principal_t *keypart=$1;
412               abac_yy_expression_t *expr=
413                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
414               $$=expr;
[2e9455f]415               OUT("osetterm_3");
[da5afdf]416             }
417     | typedpart
418             {
419               abac_yy_term_data_t *objpart=$1;
420               abac_yy_expression_t *expr=
421                   make_yy_expression(e_yy_EXPR_OBJECT,objpart,NULL,NULL);
422               $$=expr;
[2e9455f]423               OUT("osetterm_4");
[da5afdf]424             }
425     ;
426
427/*
428   oset:access([urn:'fileA'])
429*/
430osetpart : OSET COLON IDEN LPAREN terms RPAREN
431             {
[8bd77b5]432               $$=make_yy_roleoset_oset($3,$5);
[da5afdf]433             }
434     | OSET COLON IDEN
435             {
[8bd77b5]436               $$=make_yy_roleoset_oset($3,NULL);
[da5afdf]437             }
438     ;
439
440
441osetleft : keypart DOT osetpart
442             {
443               abac_yy_principal_t *keypart=$1;
[8bd77b5]444               abac_yy_roleoset_t *osetpart=$3;
[da5afdf]445               abac_yy_expression_t *expr=
446                    make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
447               $$=expr;
[2e9455f]448               OUT("osetleft");
[da5afdf]449             }
450     ;
451
452osetright : osetterm AND osetright
453             {
454               abac_yy_expression_t *nexpr=$1;
455               abac_yy_expression_t *exprs=$3;
456               $$=add_yy_expression(nexpr,exprs);
[2e9455f]457               OUT("osetright_1");
[da5afdf]458             }
459     | osetterm
[2e9455f]460             {
461               $$=$1;
462               OUT("osetright_2");
463             }
[da5afdf]464     ;
[718ad924]465%%
466
[da5afdf]467
[718ad924]468/* Additional C code */
469int yywrap()
470{
471     /* exit when done lexing the current input */
472     return 1;
473}
474
475int yyerror (char *s)
476{
477     fprintf (abac_yyout,"yyerror: %s\n", s);
478}
479
480/* setting defaults */
481void abac_yyinit()
482{
[2e9455f]483    abac_yyout=abac_ll_get_yyout();
484    abac_yyfptr = abac_ll_get_yyfptr();
485    OUT("======================================");
[b5a3da4]486}
[718ad924]487
488void panic(char *msg)
489{
[2e9455f]490     OUT("panic, EEEEKKKKKK...");
[718ad924]491     yyerror(msg);
492}
493
Note: See TracBrowser for help on using the repository browser.