/* bison grammar rules for process old rt0 statements */ /* isi.employee <- ted ted.friend <- mike usc.employee <- isi.employee usc.playground <- usc.employee.friend query, usc.playground <- ?Z isi.playground <- mike */ %{ /* C declarations */ #include #include #include extern char *abac_cn_with_sha(char*); FILE *abac_yyin = NULL; FILE *abac_yyout = NULL; char *abac_yap_clause = NULL; char *abac_yyfptr = NULL; /* index to generate, C1,C2 .. */ int cred_count = 0; int sz_overhead = 0; char *compose_cred_list(); int get_next_cred_idx(); %} /* Bison declarations */ %union { int number; char *string; /* For returning char strings */ } %type keypart rolepart left right term stmt %token IDEN /* keyname or rolename */ %token DERIVE "<-" %token DOT "." %token AND "&" %% /* Grammar rules */ input: /* empty */ { } | stmt { fprintf (abac_yyout,"stmt (%s)\n", $1); abac_yap_clause = $1; } stmt : left DERIVE right { int sz; char *ptr=strstr($3,"role("); char *tmp; if(ptr==NULL) { sz=strlen($3)+strlen($1)+sz_overhead; tmp=(char *)abac_xmalloc(sz); sprintf(tmp,"isMember(%s,%s,['%s'])",$3,$1,abac_yyfptr); } else { sz=strlen($3)+strlen($1)+sz_overhead; tmp=(char *)abac_xmalloc(sz); if (cred_count==0) { sprintf(tmp,"isMember(X,%s,['%s']):-%s", $1, abac_yyfptr, $3); } else { char *tmp_cred_list=compose_cred_list(); sprintf(tmp,"isMember(X,%s,L):-%s, appendL([['%s'],%s],L)", $1, $3, abac_yyfptr, tmp_cred_list); free(tmp_cred_list); cred_count=0; } } $$=tmp; free($3);free($1); } left : keypart DOT rolepart { int sz=strlen($1)+strlen($3)+sz_overhead; char *tmp=(char *)abac_xmalloc(sz); sprintf(tmp,"role(%s,%s)", $1, $3); $$=tmp; free($3);free($1); } /* isi */ keypart : IDEN { char *cn=abac_cn_with_sha($1); $$=strdup(cn); } /* friend */ rolepart : IDEN { $$=strdup($1); } right : term { $$=$1; } | term AND right { int sz=strlen($1)+strlen($3)+2; char *tmp=(char *)abac_xmalloc(sz); sprintf(tmp,"%s,%s",$1,$3); $$=tmp; free($1);free($3); } term : keypart DOT IDEN DOT IDEN { int sz=strlen($1)+strlen($3)+strlen($5)+sz_overhead; char *tmp=(char *)abac_xmalloc(sz); int fst=get_next_cred_idx(); int snd=get_next_cred_idx(); sprintf(tmp,"isMember(Y,role(%s,%s),C%d),isMember(X,role(Y,%s),C%d)",$1,$3,fst,$5,snd); $$=tmp; free($1);free($3);free($5); } | keypart DOT IDEN { int sz=strlen($1)+strlen($3)+sz_overhead; int fst=get_next_cred_idx(); char *tmp=(char *)abac_xmalloc(sz); sprintf(tmp,"isMember(X,role(%s,%s),C%d)", $1, $3, fst); $$=tmp; free($1);free($3); } | keypart { $$=$1; } %% #include "abac_rt0.h" /* Additional C code */ int yywrap() { /* exit when done lexing the current input */ return 1; } int yyerror (char *s) { fprintf (abac_yyout,"yyerror: %s\n", s); } /* setting defaults */ void abac_yyinit() { abac_yyin=abac_get_yyin(); abac_yyout=abac_get_yyout(); abac_yyfptr = abac_get_yyfptr(); sz_overhead = strlen(abac_yyfptr)+2000; } char *abac_get_yap_clause() { return abac_yap_clause; } char *abac_free_yap_clause() { if (abac_yap_clause != NULL) free(abac_yap_clause); } int get_next_cred_idx() { printf("ZZZ count it once..%d\n", cred_count); cred_count++; return cred_count; } int get_curr_cred_idx() { return cred_count; } /* remember to free the returned string */ char *compose_cred_list() { int i=cred_count;; if(cred_count==0) return ""; char *clist=(char *)abac_xmalloc(sizeof(char)*(cred_count)*3); strcpy(clist,"C1"); if (cred_count==1) return clist; i=1; while(i!=cred_count) { i++; sprintf(clist,"%s,C%d",clist,i); } return clist; }