source: libabac/rt2.y @ 34ea038

mei_rt2mei_rt2_fix_1meiyap-rt1rt2
Last change on this file since 34ea038 was b5a3da4, checked in by Mei <mei@…>, 13 years ago

1) add abac_oset.c
2) reorganized some yyparse related files

  • Property mode set to 100644
File size: 11.6 KB
Line 
1
2/* bison grammar rules for process new rt2 statements */
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"
13
14/* lex tie-ins flag */
15int yyerror (char *s);
16
17FILE *abac_yyout = NULL;
18char *abac_yyfptr = NULL;
19char *abac_yyfptr_encoded = NULL;
20
21void panic(char *msg);
22 
23%}
24/* Bison declarations */
25%union {
26struct _abac_yy_principal_t *pstruct;
27struct _abac_yy_term_principal_t *ppstruct;
28struct _abac_yy_term_data_t *pdstruct;
29struct _abac_yy_role_t *rstruct;
30struct _abac_yy_oset_t *ostruct;
31struct _abac_yy_term_t *dstruct;
32struct _abac_yy_expression_t *estruct;
33struct abac_list_t *lstruct;
34char *string;   /* For returning char strings */
35int intval; /* for returning some value */
36}
37
38%start input
39
40%type <lstruct> stmt
41%type <rstruct> rolepart
42%type <estruct> roleleft
43%type <estruct> roleright
44%type <estruct> roleterm
45%type <ostruct> osetpart
46%type <estruct> osetleft
47%type <estruct> osetright
48%type <estruct> osetterm
49%type <pstruct> keypart
50%type <dstruct> terms
51%type <dstruct> term
52%type <pdstruct> typedpart
53%type <pdstruct> otypetail
54%type <ppstruct> principalpart
55%type <lstruct> rangetype
56%type <lstruct> values
57
58%token <string> IDEN                /* keyname or rolename */
59%token <string> CAPIDEN             /* variable name */
60%token <string> ROLE                /* the word, role */
61%token <string> OSET                /* the word, oset */
62%token <string> PRINCIPAL           /* the word, principal */
63%token <string> OTYPE               /* integer,boolean,urn,time,string,float */
64%token <string> OTYPE_CONSTANT     
65%token <string> VARIABLE_CONSTANT   /* constant for ?AAA */
66%token <string> KEYTYPE             /* keyid | or something else */
67%token <string> KEYID_CONSTANT      /* keyid | or something else */
68%token <string> VALUE               /* range value in static constraint */
69
70%token  <operator>  DERIVE    "<-"
71%token  <operator>  DOT       "."
72%token  <operator>  AND       "&"
73%token  <operator>  LPAREN    "("
74%token  <operator>  RPAREN    ")"
75%token  <operator>  LSQUARE   "["
76%token  <operator>  RSQUARE   "]"
77%token  <operator>  LANGLE    "<"
78%token  <operator>  RANGLE    ">"
79%token  <operator>  COLON     ":"
80%token  <operator>  COMMA     ","
81%token  <operator>  QMARK     "?"
82%token  <operator>  DOTDOT    ".."
83
84%%
85/* Grammar rules */
86
87input:      /* empty */
88             { }
89     | stmt
90             { 
91               abac_yy_set_rule_clauses($1);
92             }
93     ;
94 
95/* generate/concate prolog credentials clauses */
96stmt : roleleft DERIVE roleright
97             {
98               abac_yy_expression_t *headexpr=$1;
99               abac_yy_expression_t *tailexpr=$3;
100               abac_list_t *ret=make_role_statement(headexpr, tailexpr);
101               if(ret == NULL) {
102                   panic("unable to parse the role rule statment");
103                   YYERROR;
104                   } else {
105                       $$=ret;
106               }
107             }
108     | osetleft DERIVE osetright
109             {
110               abac_yy_expression_t *headexpr=$1;
111               abac_yy_expression_t *tailexpr=$3;
112               abac_list_t *ret=make_oset_statement(headexpr, tailexpr);
113               if(ret == NULL) {
114                   panic("unable to parse the oset rule statment");
115                   YYERROR;
116                   } else {
117                       $$=ret;
118               }
119             }
120     ;
121/*
122   [keyid:isi].role:modifyBy([keyid:mike])
123   [keyid:acme].role:preferred
124*/
125roleleft : keypart DOT rolepart
126             {
127               abac_yy_principal_t *keypart=$1;
128               abac_yy_role_t *rolepart=$3;
129               abac_yy_expression_t *expr=
130                    make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
131               $$=expr;
132             }
133     ;
134
135/* [keyid:mike] */
136keypart : LSQUARE KEYTYPE COLON
137             { abac_push_keyid_yystate(); }
138          KEYID_CONSTANT
139             { abac_pop_yystate(); }
140          RSQUARE
141             {
142               char *cn=abac_cn_with_sha($5);
143               int idtype=abac_verify_keyid_type($2);
144               if(cn && idtype)  {
145                 $$=make_yy_principal($5, cn, idtype);
146                 } else {
147                   panic("encountered an invalid SHA id");
148                   YYERROR;
149               }
150             }
151     ;
152/*
153   role:modifyBy([keyid:mike],[keyid:ted])
154   role:modifyBy([keyid:mike])
155   role:preferred
156*/
157rolepart : ROLE COLON IDEN LPAREN terms RPAREN
158             {
159               $$=make_yy_role($3,$5);
160             }
161     | ROLE COLON IDEN
162             {
163               $$=make_yy_role($3,NULL);
164             }
165     ;
166
167/*
168   [keyid:mike],[keyid:ted]
169   [keyid:mike]
170   [principal:?Z]
171??   [principal:?this]
172   [int:99]
173   [int:?Z]
174   [?]
175*/
176terms : term COMMA terms
177             {
178               abac_yy_term_t *nterm=$1;
179               abac_yy_term_t *terms=$3;
180               $$=add_yy_term(nterm, terms);
181             }
182     | term
183             {
184               $$=$1;
185             }
186     ;
187
188term : LSQUARE QMARK RSQUARE
189             { $$= make_yy_term_dterm_anonymous(); }
190     | keypart
191             { $$= make_yy_term_dterm_named($1); }
192     | principalpart
193             { $$= make_yy_term_dterm_principal($1); }
194     | typedpart
195             { $$= make_yy_term_dterm_data($1); }
196     ;
197
198values : VALUE COMMA values
199             { $$=add_yy_val_range($3, $1); }
200       |  VALUE
201             { $$=make_yy_val_range($1); }
202       ;
203     
204
205rangetype : LSQUARE VALUE DOTDOT VALUE RSQUARE
206             { $$=make_yy_minmax_range($2,$4); }
207          |  LSQUARE DOTDOT VALUE RSQUARE
208             { $$=make_yy_max_range($3); }
209          |  LSQUARE VALUE DOTDOT RSQUARE
210             { $$=make_yy_min_range($2); }
211          |  LSQUARE values RSQUARE
212             { $$=$2; }
213          ;
214
215/* [otype:?Z:{oset-constraint}] */
216/* [int:?I:[10 .. 20] */
217otypetail : | VARIABLE_CONSTANT COLON
218             {
219               abac_pop_yystate();
220               abac_push_range_yystate();
221             }
222            rangetype
223            {
224              abac_pop_yystate();
225              abac_yy_term_data_t *ptr=make_yy_term_data($1);
226              set_yy_term_data_is_variable(ptr);
227              set_yy_term_data_cond_range(ptr,$4);
228              $$=ptr;
229            }
230     | VARIABLE_CONSTANT
231            { abac_pop_yystate(); }
232            osetleft
233            {
234              abac_yy_term_data_t *ptr=make_yy_term_data($1);
235              set_yy_term_data_cond_head_expr(ptr,$3);
236              set_yy_term_data_is_variable(ptr);
237              $$=ptr;
238            }
239     | VARIABLE_CONSTANT
240            {
241              abac_pop_yystate();
242              abac_yy_term_data_t *ptr=make_yy_term_data($1);
243              set_yy_term_data_is_variable(ptr);
244              $$=ptr;
245            }
246     | OTYPE_CONSTANT
247            {
248              abac_pop_yystate();
249              abac_yy_term_data_t *ptr=make_yy_term_data($1);
250              $$=ptr;
251            }
252     ;
253
254typedpart  : LSQUARE OTYPE COLON
255             { abac_push_yystate($2); }
256             otypetail RSQUARE
257             {
258               abac_yy_term_data_t *ptr=$5;
259               char *tail_string=get_yy_term_data_name(ptr);
260               set_yy_term_data_type(ptr,$2);
261               if(is_yy_term_data_has_constraint(ptr)) {
262                  make_yy_range_constraint(ptr,tail_string);
263                  make_yy_oset_constraint(ptr,tail_string);
264               }
265               $$=$5;
266             }
267     ;
268
269
270/* [principal:?Z] */
271/* [principal:?Z{role-constraint}] */
272principalpart : LSQUARE PRINCIPAL COLON QMARK IDEN roleleft RSQUARE
273                {
274                  abac_yy_expression_t *expr=$6;
275                  char *tail_string=$5;
276                  abac_yy_term_principal_t *ptr=make_yy_term_principal(tail_string);
277                  set_yy_term_principal_cond_head_expr(ptr,expr);
278                  char *string=make_yy_role_constraint(ptr,tail_string);
279                  $$=ptr;
280                }
281              | LSQUARE PRINCIPAL COLON QMARK IDEN RSQUARE
282                { $$ = make_yy_term_principal($5); }
283     ;
284
285roleright : roleterm AND roleright
286             {
287               abac_yy_expression_t *nexpr=$1;
288               abac_yy_expression_t *exprs=$3;
289               $$=add_yy_expression(nexpr,exprs);
290             }
291     | roleterm
292             { $$=$1; }
293     ;
294
295/* role at tail/right side
296  [keyid:usc].role:employee.role:friend
297  [keyid:usc].role:worker
298  [keyid:mike]
299*/
300roleterm : keypart DOT rolepart DOT rolepart
301             {
302               abac_yy_principal_t *keypart=$1;
303               abac_yy_role_t *linked_rolepart=$3;
304               abac_yy_role_t *rolepart=$5;
305               abac_yy_expression_t *expr=
306                  make_yy_expression(e_yy_EXPR_LINKED,keypart,rolepart,linked_rolepart);
307               $$=expr;
308             }
309     | keypart DOT rolepart
310             {
311               abac_yy_principal_t *keypart=$1;
312               abac_yy_role_t *rolepart=$3;
313               abac_yy_expression_t *expr=
314                   make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
315               $$=expr;
316             }
317     | keypart
318             {
319               abac_yy_principal_t *keypart=$1;
320               abac_yy_expression_t *expr=
321                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
322               $$=expr;
323             }
324     ;
325
326osetterm : keypart DOT rolepart DOT osetpart
327             {
328               abac_yy_principal_t *keypart=$1;
329               abac_yy_role_t *linked_rolepart=$3;
330               abac_yy_oset_t *osetpart=$5;
331               abac_yy_expression_t *expr=
332                  make_yy_expression(e_yy_EXPR_LINKED,keypart,osetpart,linked_rolepart);
333               $$=expr;
334             }
335     | keypart DOT osetpart
336             {
337               abac_yy_principal_t *keypart=$1;
338               abac_yy_oset_t *osetpart=$3;
339               abac_yy_expression_t *expr=
340                   make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
341               $$=expr;
342             }
343     | keypart
344             {
345               abac_yy_principal_t *keypart=$1;
346               abac_yy_expression_t *expr=
347                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
348               $$=expr;
349             }
350     | typedpart
351             {
352               abac_yy_term_data_t *objpart=$1;
353               abac_yy_expression_t *expr=
354                   make_yy_expression(e_yy_EXPR_OBJECT,objpart,NULL,NULL);
355               $$=expr;
356             }
357     ;
358
359/*
360   oset:access([urn:'fileA'])
361*/
362osetpart : OSET COLON IDEN LPAREN terms RPAREN
363             {
364               $$=make_yy_oset($3,$5);
365             }
366     | OSET COLON IDEN
367             {
368               $$=make_yy_oset($3,NULL);
369             }
370     ;
371
372
373osetleft : keypart DOT osetpart
374             {
375               abac_yy_principal_t *keypart=$1;
376               abac_yy_oset_t *osetpart=$3;
377               abac_yy_expression_t *expr=
378                    make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
379               $$=expr;
380             }
381     ;
382
383osetright : osetterm AND osetright
384             {
385               abac_yy_expression_t *nexpr=$1;
386               abac_yy_expression_t *exprs=$3;
387               $$=add_yy_expression(nexpr,exprs);
388             }
389     | osetterm
390             { $$=$1; }
391     ;
392%%
393
394
395/* Additional C code */
396int yywrap()
397{
398     /* exit when done lexing the current input */
399     return 1;
400}
401
402int yyerror (char *s)
403{
404     fprintf (abac_yyout,"yyerror: %s\n", s);
405}
406
407/* setting defaults */
408void abac_yyinit()
409{
410    abac_yyout=abac_get_yyout();
411    abac_yyfptr = abac_get_yyfptr();
412    abac_yyfptr_encoded = abac_get_yyfptr_encoded();
413}
414
415void panic(char *msg)
416{
417     yyerror(msg);
418}
419
Note: See TracBrowser for help on using the repository browser.