source: libabac/rt2.y @ e88c95b

mei_rt2mei_rt2_fix_1meiyap-rt1rt2
Last change on this file since e88c95b was e88c95b, checked in by Mei <mei@…>, 12 years ago

1) switch the order of terms within the rule clause.

carl said more specific should be at the earlier part of rule so
it won't backtrack to death.

2) unset some debug flag in creddy

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