source: libabac/abac_pl_yy.c @ 2efdff5

mei_rt2mei_rt2_fix_1
Last change on this file since 2efdff5 was 2efdff5, checked in by Mei <mei@…>, 12 years ago

1) fix the missing check for 'This' rt2.y when called from creddy/prover

combo

2) patch up the stringify of abac_term that is of time type.
3) update the testing to reflect the changes to baseline output

  • Property mode set to 100644
File size: 31.2 KB
RevLine 
[a9494ad]1
2/* C declarations */
3#include <stdio.h>
4#include <string.h>
5#include <stdlib.h>
[da5afdf]6#include <assert.h>
[a9494ad]7
8#include "abac_util.h"
9#include "abac_pl_yy.h"
10
11static int debug=0;
12
[9335cfa]13int using_this=0;
14
[b5a3da4]15extern void panic(char*);
16
17/* from abac_pl_gen.c */
[8bd77b5]18extern abac_list_t *generate_pl_clauses(abac_aspect_t *, abac_aspect_t *);
[440ba20]19
[b5a3da4]20/* from rt2.y */
21extern void abac_yyinit();
[a9494ad]22
[b5a3da4]23int abac_yy_error_code = 0; /* keeping last error code */
[a9494ad]24
[b5a3da4]25int abac_rule_is_oset=0;
26abac_list_t *abac_rule_clauses=NULL;
27abac_stack_t *abac_rule_id_clauses=NULL; /* tracking individual id credentials */
[8bd77b5]28abac_aspect_t *abac_rule_head_aspect=NULL;
29abac_aspect_t *abac_rule_tail_aspect=NULL;
[da5afdf]30
[a9494ad]31
[da5afdf]32/* structure to hold the range information
33   within a static constraints on few types of
34   oset types
35   [a..b], [a..], [..b], [a],[a,b],[many a]
36   e_yy_RANGE_MIN=1;
37   e_yy_RANGE_MAX=2;
38   e_yy_RANGE_TARGET=3;
39*/
40typedef struct _abac_yy_range_t {
41    int type;
42    char *val;
43} abac_yy_range_t;
44
[a9494ad]45/* local principal structure  [keyid:USC] */
46struct _abac_yy_principal_t {
47    int type;
[da5afdf]48    char *sha; // sha is null when this is of object type
49    char *cn; 
[a9494ad]50};
51
[da5afdf]52/* [principal:?Z]:..., must match a principal name */
53struct _abac_yy_term_principal_t {
[a9494ad]54    int type; /* this needs to be implicitly determined */
[9806e76]55    int is_anonymous;
[a9494ad]56    char *name;
[440ba20]57    int isrange;
58    char *cond_str;  // range string ???  not sure if this is possible
59    void *cond_ptr; // ptr to a saved abac_aspect_t or a list(item_t)
[da5afdf]60    abac_yy_expression_t *cond_head_expr;
[a9494ad]61};
62
[b5a3da4]63/* integer,float,time,urn,string types,
64   if has condition, then it is a variable,
[a9494ad]65   ie,
66    [int:?Year]:<1930..1932>,
67   if no condition, then it is a constant,
68    ie,
69    [int:10]
70*/
[da5afdf]71struct _abac_yy_term_data_t {
[a9494ad]72    int is_variable;
[9806e76]73    int is_anonymous;
[a9494ad]74    int type;
75    char *name;
[440ba20]76    char *cond_str; // range string
77    void *cond_ptr; // ptr to a saved abac_aspect_t
[da5afdf]78    abac_list_t *cond_range;
79    abac_yy_expression_t *cond_head_expr; // parking stub
[a9494ad]80};
81
[da5afdf]82/* local term structure, will distinguish it in the future */
83/* e_yy_DTERM_DATA,      all other types
84   e_yy_DTERM_NAMED,     keyid:bob
85   e_yy_DTERM_PRINCIPAL, principal:?P
86   e_yy_DTERM_ANONYMOUS  ? */
87struct _abac_yy_term_t {
[a9494ad]88    union {
89         abac_yy_principal_t *n_ptr;
[da5afdf]90         abac_yy_term_principal_t *p_ptr;
91         abac_yy_term_data_t *d_ptr;
[a9494ad]92    } term;
93    int type;
[da5afdf]94    struct _abac_yy_term_t *next;
95    int bcnt; /* this is to track number of terms in this linked up list */
[a9494ad]96};
97
[8bd77b5]98/* local role/oset structure,
99   e_yy_NULL_TYPE, e_yy_ROLE_TYPE, e_yy_OSET_TYPE
100*/
101struct _abac_yy_roleoset_t {
[a9494ad]102   int type;
103   char *name;
[da5afdf]104   abac_yy_term_t *terms;
[8bd77b5]105   struct _abac_yy_roleoset_t *next;
[a9494ad]106   int bcnt; /* this is to track number of roles in this linked up list */
107};
108
[da5afdf]109
110/* A, A.r, A.r.r */
111/* type: e_yy_EXPR_NAMED,e_yy_EXPR_ROLE,e_yy_EXPR_LINKED */
112/* A/obj, A.o, A.r.o */
113/* type: e_yy_EXPR_NAMED, e_yy_EXPR_OBJECT, e_yy_EXPR_OSET,e_yy_EXPR_LINKED */
114struct _abac_yy_expression_t {
115   int type;
116   union {
117       abac_yy_principal_t *principal;
118       abac_yy_term_data_t *object;
119   };
[8bd77b5]120   abac_yy_roleoset_t *linked_role;
121   abac_yy_roleoset_t *roleoset;
122   
[da5afdf]123   struct _abac_yy_expression_t *next;
[a9494ad]124   int bcnt;
125};
[b5a3da4]126
127static void _free_yy_expression(abac_yy_expression_t *);
128
129/************************************************************************/
130void abac_yy_set_error_code(int v)
131{
132     abac_yy_error_code=v;
133}
134
135/************************************************************************/
136abac_stack_t *abac_yy_get_rule_id_clauses()
137{
138    return abac_rule_id_clauses;
139}
140
141abac_stack_t *abac_yy_init_rule_id_clauses()
142{
143    abac_rule_id_clauses=abac_stack_new();
144    return abac_rule_id_clauses;
145}
146
147void abac_yy_free_rule_id_clauses()
148{
149    if (abac_rule_id_clauses != NULL)
150        abac_stack_free(abac_rule_id_clauses);
151}
152
153void abac_yy_set_rule_clauses(abac_list_t *clauses)
154{
155    abac_rule_clauses=clauses;
156    if(debug) {
157         printf("printing out abac_rule_clauses:\n");
158         abac_print_clauses(abac_rule_clauses,NULL);
159    }
160}
161
162abac_list_t *abac_yy_get_rule_clauses()
163{
164    return abac_rule_clauses;
165}
166
167void abac_yy_free_rule_clauses()
168{
169    if (abac_rule_clauses != NULL) {
[440ba20]170        abac_pl_free_id_certs();
[b5a3da4]171        abac_list_free(abac_rule_clauses);
172    }
173}
174
[137b55f]175/* just set it to NULL without freeing the structure */
176void abac_yy_reset_rule_clauses()
177{
178    abac_rule_clauses=NULL;
179}
180
[8bd77b5]181bool abac_yy_get_rule_is_oset()
[b5a3da4]182{
183   return abac_rule_is_oset;
184}
185
[8bd77b5]186abac_aspect_t *abac_yy_get_rule_head_aspect()
[b5a3da4]187{
[8bd77b5]188    return abac_rule_head_aspect;
[b5a3da4]189}
190
[8bd77b5]191abac_aspect_t *abac_yy_get_rule_tail_aspect()
[b5a3da4]192{
[8bd77b5]193    return abac_rule_tail_aspect;
[b5a3da4]194}
195
[da5afdf]196
197/************************************************************************/
[b5a3da4]198static void _free_yy_cond_range(abac_list_t *ptr) 
[da5afdf]199{
200    if (ptr != NULL) {
201        abac_yy_range_t *cur;
202        abac_list_foreach(ptr, cur,
203            if(cur && cur->val) free(cur->val);
204            free(cur);
205        );
206        abac_list_free(ptr);
207    }
208}
209
[b5a3da4]210static char *_string_yy_cond_range(abac_list_t *ptr)
[da5afdf]211{
212    assert(ptr);
213    char *tmp=NULL;
214    char *min=NULL;
215    char *max=NULL;
216    char *val=NULL;
217    int type;
[a9494ad]218
[da5afdf]219    abac_yy_range_t *cur;
220    abac_list_foreach(ptr, cur,
221        type=cur->type;
222        switch (type) {
223            case e_yy_RANGE_MIN:
[8bd77b5]224                min=abac_xstrdup(cur->val);
[da5afdf]225                break;
226            case e_yy_RANGE_MAX:
[8bd77b5]227                max=abac_xstrdup(cur->val);
[da5afdf]228                break;
229            case e_yy_RANGE_TARGET:
230                if(val)
231                    asprintf(&val,"%s,%s",val,cur->val);
[8bd77b5]232                else val=abac_xstrdup(cur->val);
[da5afdf]233                break;
234        }
235    );
236    if(max && min) {
237         asprintf(&tmp,"[%s..%s]",min,max);
238         free(max);
239         free(min);
240         return tmp;
241    }
242    if(max) {
243         asprintf(&tmp,"[..%s]",max);
244         free(max);
245         return tmp;
246    }
247    if(min) {
248         asprintf(&tmp,"[%s..]",min);
249         free(min);
250         return tmp;
251    }
252    if(val) {
253         asprintf(&tmp,"[%s]",val);
254         free(val);
255         return tmp;
256    }
257    return NULL;
258}
259
[b5a3da4]260abac_list_t *add_yy_val_range(abac_list_t *ptr, char * val)
[da5afdf]261{
262    abac_yy_range_t *range= 
263         (abac_yy_range_t *) abac_xmalloc(sizeof(abac_yy_range_t));
264    range->type=e_yy_RANGE_TARGET;
[8bd77b5]265    range->val=abac_xstrdup(val);
[da5afdf]266    abac_list_add(ptr, range);
267    return ptr;
268}
269
[b5a3da4]270static abac_list_t *_add_yy_range(abac_list_t *ptr, int type, char * val)
[da5afdf]271{
272    abac_yy_range_t *range= 
273         (abac_yy_range_t *) abac_xmalloc(sizeof(abac_yy_range_t));
274    range->type=type;
[8bd77b5]275    range->val=abac_xstrdup(val);
[da5afdf]276    abac_list_add(ptr, range);
277    return ptr;
278}
279
280abac_list_t *make_yy_val_range(char *val)
281{
282    abac_list_t *ptr=abac_list_new();
[b5a3da4]283    add_yy_val_range(ptr,val);
[da5afdf]284    return ptr;
285}
286
287abac_list_t *make_yy_minmax_range(char *min, char *max)
288{
289    abac_list_t *ptr=abac_list_new();
[b5a3da4]290    _add_yy_range(ptr, e_yy_RANGE_MIN, min);
291    _add_yy_range(ptr, e_yy_RANGE_MAX, max);
[da5afdf]292    return ptr;
293}
294
295abac_list_t *make_yy_min_range(char *min)
296{
297    abac_list_t *ptr=abac_list_new();
[b5a3da4]298    _add_yy_range(ptr, e_yy_RANGE_MIN, min);
[da5afdf]299    return ptr;
300}
301
302abac_list_t *make_yy_max_range(char *max)
303{
304    abac_list_t *ptr=abac_list_new();
[b5a3da4]305    _add_yy_range(ptr, e_yy_RANGE_MAX, max);
[da5afdf]306    return ptr;
307}
[a9494ad]308
[b5a3da4]309/***********************************************************************/
[9806e76]310abac_yy_term_data_t *make_yy_term_data()
[a9494ad]311{
[b5a3da4]312    abac_yy_term_data_t *ptr=
313              (abac_yy_term_data_t*)abac_xmalloc(sizeof(abac_yy_term_data_t));
[9806e76]314    ptr->name=NULL;
[b5a3da4]315    ptr->type=0;
316    ptr->is_variable=0;
[9806e76]317    ptr->is_anonymous=0;
[b5a3da4]318    ptr->cond_str=NULL;
319    ptr->cond_head_expr=NULL;
320    ptr->cond_ptr=NULL;
321    ptr->cond_range=NULL;
322    return ptr;
[a9494ad]323}
324
[9806e76]325void set_yy_term_data_name(abac_yy_term_data_t *ptr, char *name)
326{
[8bd77b5]327    ptr->name=abac_xstrdup(name);
[9806e76]328}
329
[b5a3da4]330abac_list_t *get_yy_term_data_cond_range(abac_yy_term_data_t *ptr)
[a9494ad]331{
[b5a3da4]332    return ptr->cond_range;
[a9494ad]333}
334
[b5a3da4]335char *get_yy_term_data_name(abac_yy_term_data_t *ptr)
[a9494ad]336{
[b5a3da4]337    return ptr->name;
[a9494ad]338}
339
[8bd77b5]340bool is_yy_term_data_has_constraint(abac_yy_term_data_t *ptr)
[a9494ad]341{
[b5a3da4]342    if(ptr->cond_head_expr != NULL)
343        return 1;
[c586a3c]344    if(ptr->cond_range != NULL)
[b5a3da4]345        return 1;
346    return 0;
[a9494ad]347}
348
[b5a3da4]349void set_yy_term_data_cond_range(abac_yy_term_data_t *ptr,
350abac_list_t *range)
[a9494ad]351{
[b5a3da4]352    ptr->cond_range=range;
[a9494ad]353}
354
[b5a3da4]355void set_yy_term_data_cond_head_expr(abac_yy_term_data_t *ptr,
356abac_yy_expression_t *expr)
[a9494ad]357{
[b5a3da4]358    ptr->cond_head_expr=expr;
[a9494ad]359}
360
[b5a3da4]361abac_yy_expression_t *get_yy_term_data_cond_head_expr(abac_yy_term_data_t *ptr)
[da5afdf]362{
[b5a3da4]363    return ptr->cond_head_expr;
[da5afdf]364}
365
[b5a3da4]366void set_yy_term_data_type(abac_yy_term_data_t *ptr, char* typestr)
[a9494ad]367{
[440ba20]368    int type=abac_verify_term_type(typestr);
[b5a3da4]369    ptr->type=type;
[a9494ad]370}
371
[9806e76]372void set_yy_term_data_is_anonymous(abac_yy_term_data_t *ptr)
373{
374    ptr->is_anonymous=1;
375}
376
[8bd77b5]377bool is_yy_term_data_type_numeric(abac_yy_term_data_t *ptr)
[d5bbd3e]378{
[440ba20]379    if(ptr->type==abac_verify_term_type("integer") ||
380          ptr->type==abac_verify_term_type("float"))
[d5bbd3e]381        return 1;
382    return 0;
383}
384
[8bd77b5]385bool is_yy_term_data_type_time(abac_yy_term_data_t *ptr)
[7b548fa]386{
[440ba20]387    if(ptr->type==abac_verify_term_type("time"))
[7b548fa]388        return 1;
389    return 0;
390}
391
[8bd77b5]392bool is_yy_term_data_type_alpha(abac_yy_term_data_t *ptr)
[d5bbd3e]393{
[440ba20]394    if(ptr->type==abac_verify_term_type("string") ||
395        ptr->type==abac_verify_term_type("urn") ||
396         ptr->type==abac_verify_term_type("boolean"))
[d5bbd3e]397        return 1;
398    return 0;
399}
400
[b5a3da4]401void set_yy_term_data_cond_ptr(abac_yy_term_data_t *ptr, void *vptr)
[a9494ad]402{
[b5a3da4]403    ptr->cond_ptr=vptr;
[a9494ad]404}
405
[b5a3da4]406void set_yy_term_data_cond_str(abac_yy_term_data_t *ptr, char *cond)
[da5afdf]407{
[8bd77b5]408    ptr->cond_str=abac_xstrdup(cond);
[da5afdf]409}
410
[b5a3da4]411void set_yy_term_data_is_variable(abac_yy_term_data_t *ptr)
[da5afdf]412{
[b5a3da4]413    ptr->is_variable=1;
[da5afdf]414}
415
[b5a3da4]416int get_yy_term_data_is_variable(abac_yy_term_data_t *ptr)
[a9494ad]417{
[b5a3da4]418    return ptr->is_variable;
[a9494ad]419}
420
[b5a3da4]421static void _free_yy_term_data(abac_yy_term_data_t *ptr)
[a9494ad]422{
[b5a3da4]423    free(ptr->name);
424    if(ptr->cond_str)
425        free(ptr->cond_str);
426    if(ptr->cond_head_expr)
427        _free_yy_expression(ptr->cond_head_expr);
428    if(ptr->cond_range);
429        _free_yy_cond_range(ptr->cond_range);
430    free(ptr);
[a9494ad]431}
432
[9806e76]433abac_yy_term_principal_t *make_yy_term_principal()
[a9494ad]434{
[b5a3da4]435    abac_yy_term_principal_t *ptr=
436            (abac_yy_term_principal_t*)abac_xmalloc(sizeof(abac_yy_term_principal_t));
[d845403]437    ptr->type=0;/* this is not known */
[9806e76]438    ptr->is_anonymous=0;
439    ptr->name=NULL;
[440ba20]440    ptr->isrange=0;
[b5a3da4]441    ptr->cond_str=NULL;
[440ba20]442    ptr->cond_ptr=NULL;
[b5a3da4]443    ptr->cond_head_expr=NULL;
444    return ptr;
[a9494ad]445}
446
[9335cfa]447static void _set_using_this()
448{
449    using_this=1;
450}
451
[440ba20]452void set_yy_term_principal_isrange(abac_yy_term_principal_t *ptr, int isrange)
453{
454    ptr->isrange=isrange;
455}
456
[9806e76]457void set_yy_term_principal_name(abac_yy_term_principal_t *ptr, char *name)
458{
[9335cfa]459    /* handle special case when the name=this, change it to This */
460    if(strcmp(name,"this")==0) {
461       ptr->name=abac_xstrdup("This");
462       _set_using_this();
[2efdff5]463       } else {
464         ptr->name=abac_xstrdup(name);
465         /* just in case name came in as This already */
466         if(strcasecmp(name,"this")==0) 
467           _set_using_this();
468    }
[9806e76]469}
470
[b5a3da4]471void set_yy_term_principal_cond_ptr(abac_yy_term_principal_t *ptr, void *vptr)
[a9494ad]472{
[b5a3da4]473    ptr->cond_ptr=vptr;
[a9494ad]474}
475
[b5a3da4]476void set_yy_term_principal_cond_str(abac_yy_term_principal_t *ptr, char *cond)
[a9494ad]477{
[b5a3da4]478    ptr->cond_str=abac_xstrdup(cond);
[a9494ad]479}
480
[9806e76]481void set_yy_term_principal_is_anonymous(abac_yy_term_principal_t *ptr)
482{
483    ptr->is_anonymous=1;
484}
485
[b5a3da4]486abac_yy_expression_t *get_yy_term_principal_cond_head_expr(abac_yy_term_principal_t *ptr)
[da5afdf]487{
[b5a3da4]488    return ptr->cond_head_expr;
[da5afdf]489}
490
[b5a3da4]491void set_yy_term_principal_cond_head_expr(abac_yy_term_principal_t *ptr, 
492abac_yy_expression_t *expr)
[da5afdf]493{
[b5a3da4]494    ptr->cond_head_expr=expr;
[da5afdf]495}
496
[b5a3da4]497static void _free_yy_term_principal(abac_yy_term_principal_t *ptr)
[da5afdf]498{
[b5a3da4]499    free(ptr->name);
500    if(ptr->cond_str)
501        free(ptr->cond_str);
502    if(ptr->cond_head_expr)
503        _free_yy_expression(ptr->cond_head_expr);
504    free(ptr);
[da5afdf]505}
506
[b5a3da4]507abac_yy_term_t *make_yy_term_dterm_anonymous()
[da5afdf]508{
[b5a3da4]509    abac_yy_term_t *ptr=(abac_yy_term_t*)abac_xmalloc(sizeof(abac_yy_term_t));
510    ptr->type = e_yy_DTERM_ANONYMOUS;
511    ptr->next=NULL;
512    ptr->bcnt=1;
513    return ptr;
[da5afdf]514}
515
[b5a3da4]516abac_yy_term_t *make_yy_term_dterm_principal(abac_yy_term_principal_t *pptr)
[da5afdf]517{
[b5a3da4]518    abac_yy_term_t *ptr=(abac_yy_term_t*)abac_xmalloc(sizeof(abac_yy_term_t));
[9806e76]519    if(pptr->is_anonymous) 
520        ptr->type = e_yy_DTERM_ANONYMOUS;
521        else ptr->type = e_yy_DTERM_PRINCIPAL;
[b5a3da4]522    ptr->term.p_ptr=pptr;
523    ptr->next=NULL;
524    ptr->bcnt=1;
525    return ptr;
526}
527
528abac_yy_term_t *make_yy_term_dterm_named(abac_yy_principal_t *nptr)
529{
530    abac_yy_term_t *ptr=(abac_yy_term_t*)abac_xmalloc(sizeof(abac_yy_term_t));
531    ptr->type = e_yy_DTERM_NAMED;
532    ptr->term.n_ptr=nptr;
533    ptr->next=NULL;
534    ptr->bcnt=1;
535    return ptr;
536}
537
538abac_yy_term_t *make_yy_term_dterm_data(abac_yy_term_data_t *dptr)
539{
540    abac_yy_term_t *ptr=(abac_yy_term_t*)abac_xmalloc(sizeof(abac_yy_term_t));
[9806e76]541
542    if(dptr->is_anonymous)
543        ptr->type = e_yy_DTERM_ANONYMOUS;
544        else ptr->type = e_yy_DTERM_DATA;
[b5a3da4]545    ptr->term.d_ptr=dptr;
546    ptr->next=NULL;
547    ptr->bcnt=1;
548    return ptr;
549}
550
[a9494ad]551/****************************************************************************/
552abac_yy_principal_t *make_yy_principal(char *sha, char *cn, int type)
553{
554    abac_yy_principal_t *ptr=
555               (abac_yy_principal_t*)abac_xmalloc(sizeof(abac_yy_principal_t));
[7727f26]556    /* add p to yyparse's principal */
557    if(sha) ptr->sha=abac_xstrdup(sha);
558        else ptr->sha=NULL;
559    if(cn) ptr->cn=abac_xstrdup(cn);
560        else ptr->cn=NULL;
[a9494ad]561    ptr->type=type;
562    return ptr;
563}
564
565static void _free_yy_principal(abac_yy_principal_t *ptr)
566{
[7727f26]567    if(ptr->sha) free(ptr->sha);
568    if(ptr->cn) free(ptr->cn);
[a9494ad]569    free(ptr);
570}
571
[da5afdf]572int get_yy_principal_type(abac_yy_principal_t *ptr)
573{
574    return ptr->type;
575}
576
[7727f26]577char *get_yy_principal_name(abac_yy_principal_t *ptr)
[da5afdf]578{
[7727f26]579    if(USE("ABAC_CN") && ptr->cn)
580       return ptr->cn;
[da5afdf]581    return ptr->sha;
582}
583
[7727f26]584char *get_yy_principal_cn(abac_yy_principal_t *ptr)
585{
586        return ptr->cn;
587}
588
589char *get_yy_principal_sha(abac_yy_principal_t *ptr)
590{
591        return ptr->sha;
592}
593
[b5a3da4]594/*************************************************************************/
595
596abac_yy_term_t *add_yy_term(abac_yy_term_t *nterm, abac_yy_term_t *terms)
597{
598    int i=terms->bcnt;
599    nterm->next=terms;
600    nterm->bcnt=i+1;
601    return nterm;
602}
603
604static void _free_yy_term(abac_yy_term_t *ptr)
605{
606    switch (ptr->type) {
607        case e_yy_DTERM_DATA:
608            _free_yy_term_data(ptr->term.d_ptr);
609            break;
610        case e_yy_DTERM_NAMED:
611            _free_yy_principal(ptr->term.n_ptr);
612            break;
613        case e_yy_DTERM_PRINCIPAL:
614            _free_yy_term_principal(ptr->term.p_ptr);
615            break;
616        case e_yy_DTERM_ANONYMOUS:
617            break;
618    }
619    if(ptr->next)
620        _free_yy_term(ptr->next);
621    free(ptr);
622}
623
624/*************************************************************************/
[8bd77b5]625abac_yy_roleoset_t *make_yy_roleoset_role(char *name, abac_yy_term_t *terms)
[a9494ad]626{
[8bd77b5]627    abac_yy_roleoset_t *ptr=
628         (abac_yy_roleoset_t*)abac_xmalloc(sizeof(abac_yy_roleoset_t));
[a9494ad]629    ptr->name=abac_xstrdup(name);
[da5afdf]630    ptr->terms=terms;
[a9494ad]631    ptr->next=NULL;
632    ptr->bcnt=1;
[8bd77b5]633    ptr->type=e_yy_ROLE_TYPE;
[a9494ad]634    return ptr;
635}
636
[8bd77b5]637static void _free_yy_roleoset(abac_yy_roleoset_t *ptr)
[a9494ad]638{
639    free(ptr->name);
[da5afdf]640    if(ptr->terms)
641        _free_yy_term(ptr->terms);
[a9494ad]642    if(ptr->next)
[8bd77b5]643        _free_yy_roleoset(ptr->next);
[a9494ad]644    free(ptr);
645}
646
[b5a3da4]647/***************************************************************************/
[8bd77b5]648abac_yy_roleoset_t *make_yy_roleoset_oset(char *name, abac_yy_term_t *terms)
[b5a3da4]649{
[8bd77b5]650    abac_yy_roleoset_t *ptr=
651           (abac_yy_roleoset_t*)abac_xmalloc(sizeof(abac_yy_roleoset_t));
[b5a3da4]652    ptr->name=abac_xstrdup(name);
653    ptr->terms=terms;
654    ptr->next=NULL;
655    ptr->bcnt=1;
[8bd77b5]656    ptr->type=e_yy_OSET_TYPE;
[b5a3da4]657    return ptr;
658}
659
660/***************************************************************************/
661
[da5afdf]662/* type: e_yy_EXPR_NAMED, e_yy_EXPR_OBJECT, e_yy_EXPR_OSET,e_yy_EXPR_LINKED */
663
[8bd77b5]664abac_yy_expression_t *make_yy_expression(int type,void *pptr, 
665abac_yy_roleoset_t *optr, abac_yy_roleoset_t *linked_role)
[a9494ad]666{
[da5afdf]667    abac_yy_expression_t *ptr=
668         (abac_yy_expression_t*)abac_xmalloc(sizeof(abac_yy_expression_t));
669    ptr->type = type;
670    if(type == e_yy_EXPR_OBJECT) {
671        ptr->object=(abac_yy_term_data_t *)pptr;
672        } else {
673            ptr->principal = (abac_yy_principal_t *)pptr;
674    }
[8bd77b5]675    ptr->roleoset = optr;
[a9494ad]676    ptr->linked_role=linked_role;
677    ptr->next=NULL;
678
679    return ptr;
680}
681
[da5afdf]682abac_yy_term_data_t *get_yy_expression_object(abac_yy_expression_t *ptr)
683{
684   if(ptr->type == e_yy_EXPR_OBJECT)
685       return ptr->object;
686   return NULL;
687}
688
689abac_yy_expression_t *add_yy_expression(abac_yy_expression_t *nexpr,
690                                             abac_yy_expression_t *exprs)
[a9494ad]691{
692    int i=exprs->bcnt;
693    nexpr->next=exprs;
694    nexpr->bcnt=i+1;
695    return nexpr;
696}
697
[da5afdf]698static void _free_yy_expression(abac_yy_expression_t *ptr)
[a9494ad]699{
[da5afdf]700    if(ptr->type == e_yy_EXPR_OBJECT) {
701       if(ptr->object)
702           _free_yy_term_data(ptr->object);
703       } else {
704           if(ptr->principal)
705               _free_yy_principal(ptr->principal);
706    }
[8bd77b5]707    if(ptr->roleoset) _free_yy_roleoset(ptr->roleoset);
[a9494ad]708    if(ptr->linked_role)
[8bd77b5]709        _free_yy_roleoset(ptr->linked_role);
[a9494ad]710    if(ptr->next)
[da5afdf]711        _free_yy_expression(ptr->next);
[a9494ad]712
713    free(ptr);
714}
715
[b5a3da4]716/***************************************************************************/
[8bd77b5]717/* add the oset condition to constraint list */
[440ba20]718void make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string)
[8bd77b5]719{
720   abac_yy_expression_t *head_expr=get_yy_term_data_cond_head_expr(ptr);
721   if(head_expr) {
722       abac_aspect_t *head_aspect=validate_head(e_yy_OSET_TYPE,head_expr);
[440ba20]723       if(head_aspect != NULL) {
724           if(debug) printf("make_yy_oset_constraint..\n");
725           set_yy_term_data_cond_ptr(ptr,head_aspect);
726       }
[8bd77b5]727   }
728} 
[440ba20]729
[8bd77b5]730/* add the role condition to constraint list */
[440ba20]731void make_yy_role_constraint(abac_yy_term_principal_t *ptr, char *tail_string)
[8bd77b5]732{
733   abac_yy_expression_t *head_expr=get_yy_term_principal_cond_head_expr(ptr);
734   if(head_expr) {
735       abac_aspect_t *head_aspect=validate_head(e_yy_ROLE_TYPE,head_expr);
[440ba20]736       if(head_aspect != NULL) {
737          if(debug) printf("make_yy_role_constraint..\n");
738          set_yy_term_principal_cond_ptr(ptr,head_aspect);
739          set_yy_term_principal_isrange(ptr,0);
[8bd77b5]740       }
741   }
742}
743
744
745/****************************************************************/
746static void _aspect_add_terms(int linked, abac_aspect_t *aspect_ptr, 
[da5afdf]747abac_yy_term_t *terms)
748{
749    abac_yy_term_t *curr = terms;
750    int type;
[d037f54]751    int isnamed;
[440ba20]752    int isrange;
[d037f54]753    char *name;
754    char *cond;
755    void *ptr;
[7727f26]756
[da5afdf]757    while (curr) {
[d037f54]758        name=NULL;
759        cond=NULL;
760        ptr=NULL;
761        isnamed=0; 
[440ba20]762        isrange=0;
[da5afdf]763        switch (curr->type) {
764           case e_yy_DTERM_DATA:
765           {
[8bd77b5]766               abac_yy_term_data_t *dptr=curr->term.d_ptr;
767               type=dptr->type;
768               name=abac_xstrdup(dptr->name);
[440ba20]769               if(dptr->cond_str)
[8bd77b5]770                  cond=abac_xstrdup(dptr->cond_str);
[440ba20]771               ptr=dptr->cond_ptr;
772               isrange=(dptr->cond_range!=NULL)?1:0;
[da5afdf]773               break;
774           }
775           case e_yy_DTERM_PRINCIPAL:
776           {
[8bd77b5]777               abac_yy_term_principal_t *pptr=curr->term.p_ptr;
[440ba20]778               type=abac_verify_term_type("principal");
[8bd77b5]779               name=abac_xstrdup(pptr->name);
[440ba20]780               if(pptr->cond_str)
[8bd77b5]781                  cond=abac_xstrdup(pptr->cond_str);
[440ba20]782               ptr=pptr->cond_ptr;
783               isrange=pptr->isrange;
[da5afdf]784               break;
785           }
786           case e_yy_DTERM_NAMED:
787           {
[8bd77b5]788              abac_yy_principal_t *pptr=curr->term.n_ptr;
789              type=pptr->type;
790              name=abac_xstrdup(get_yy_principal_name(pptr));
[d037f54]791              isnamed=1; 
[da5afdf]792              break;
793           }
794           case e_yy_DTERM_ANONYMOUS:
795           {
[440ba20]796              type=abac_verify_term_type("anonymous");
[da5afdf]797              name=abac_xstrdup("_");
798              break;
799           }
800       }
[d037f54]801       abac_term_t *param=NULL;
802       if(isnamed)
803           param=abac_term_named_new(type,name);
[440ba20]804           else param=abac_term_new(type,name,isrange,cond,ptr);
[da5afdf]805       if (linked) 
[8bd77b5]806           abac_aspect_add_linked_param(aspect_ptr, param);
[da5afdf]807           else
[8bd77b5]808                abac_aspect_add_param(aspect_ptr, param);
[da5afdf]809       curr=curr->next;
810   }
811}
812
[8bd77b5]813static void _aspect_add_linked_terms(abac_aspect_t *ptr, abac_yy_term_t *terms)
[da5afdf]814{
815    int linked=1;
[8bd77b5]816    _aspect_add_terms(linked, ptr, terms);
[da5afdf]817}
818
[8bd77b5]819static void _aspect_add_aspect_terms(abac_aspect_t *ptr, abac_yy_term_t *terms)
[da5afdf]820{
821    int linked=0;
[8bd77b5]822    _aspect_add_terms(linked, ptr, terms);
[da5afdf]823}
824
[8bd77b5]825abac_aspect_t *validate_intersected_tail(abac_aspect_t *ptr)
[da5afdf]826{
[8bd77b5]827    abac_aspect_t *ret_ptr=abac_aspect_intersection_new(ptr);
828    return ret_ptr;
[da5afdf]829}
830
[8bd77b5]831/* A.oset, A.role */
832abac_aspect_t *validate_head(int yytype, abac_yy_expression_t *expr)
[da5afdf]833{
834     abac_yy_principal_t *principal=expr->principal;
[8bd77b5]835     abac_yy_roleoset_t *ptr=expr->roleoset;
[da5afdf]836   
[7727f26]837     char *principalname=get_yy_principal_sha(principal);
[8bd77b5]838     char *name=ptr->name;
839     abac_yy_term_t *terms=ptr->terms;
[da5afdf]840
[8bd77b5]841     abac_aspect_t *aptr=NULL;
842     if(yytype==e_yy_OSET_TYPE)
843         aptr=abac_aspect_oset_new(principalname, name);
844         else aptr=abac_aspect_role_new(principalname, name);
845
846     if (aptr==NULL) {
847         abac_yy_set_error_code(ABAC_YY_INVALID_HEAD);
[da5afdf]848         goto error;
849     }
[8bd77b5]850
[da5afdf]851     // insert the params for the oset
852     if(terms) {
[8bd77b5]853          _aspect_add_aspect_terms(aptr, terms);
[da5afdf]854     }
[8bd77b5]855     return aptr;
[da5afdf]856
857error:
858     return NULL;
859}
860
[8bd77b5]861abac_aspect_t *validate_head_oset(abac_yy_expression_t *expr)
862{
863     return validate_head(e_yy_OSET_TYPE,expr);
864}
865
866abac_aspect_t *validate_head_role(abac_yy_expression_t *expr)
867{
868     return validate_head(e_yy_ROLE_TYPE,expr);
869}
870
871/*****************************************************************************/
[da5afdf]872/* B */
[8bd77b5]873abac_aspect_t *validate_named_tail(int yytype, abac_yy_expression_t *expr)
[da5afdf]874{
875     abac_yy_principal_t *principal=expr->principal;
[7727f26]876     char *principalname=get_yy_principal_sha(principal);
[da5afdf]877
[8bd77b5]878     abac_aspect_t *ptr=NULL;
879     if(yytype==e_yy_OSET_TYPE)
880         ptr=abac_aspect_oset_principal_new(principalname);
881         else ptr=abac_aspect_role_principal_new(principalname);
882     if (ptr==NULL)
[da5afdf]883         goto error;
[8bd77b5]884     return ptr;
[da5afdf]885
886error:
[8bd77b5]887     panic("can not generate a simple named tail oset aspect");
[da5afdf]888     return NULL;
889}
890
891
892/* [keyid:alpha].oset:documents([string:'proj1'])<-[urn:'file//fileA'] */
[8bd77b5]893abac_aspect_t *validate_object_tail(int yytype,abac_yy_expression_t *expr)
[da5afdf]894{
895     abac_yy_term_data_t *object=get_yy_expression_object(expr);
896     assert(object != NULL);
897
898     char *name=object->name;
899     int type=object->type;
[b5a3da4]900     char *cond=object->cond_str;
901     void *ptr=object->cond_ptr;
[440ba20]902     int isrange=(object->cond_range!=NULL)?1:0;
903     abac_term_t *term=abac_term_new(type,name,isrange,cond,ptr);
[8bd77b5]904     abac_aspect_t *aptr=NULL;
905     if(yytype==e_yy_OSET_TYPE)
906         aptr=abac_aspect_oset_object_new(term);
907         else
908             goto error; /* can not be a role expression with obj */
909     if (aptr==NULL)
[da5afdf]910         goto error;
[8bd77b5]911     return aptr;
[da5afdf]912
913error:
[8bd77b5]914     panic("can not generate a simple object tail oset aspect");
[da5afdf]915     return NULL;
916}
917
918
[8bd77b5]919/* B.role or B.oset */
920abac_aspect_t *validate_some_tail(int yytype, abac_yy_expression_t *expr)
[da5afdf]921{
922     abac_yy_principal_t *principal=expr->principal;
[8bd77b5]923     abac_yy_roleoset_t *eptr=expr->roleoset;
[da5afdf]924
[7727f26]925     char *principalname=get_yy_principal_sha(principal);
[8bd77b5]926     char *name=eptr->name;
927     abac_yy_term_t *terms=eptr->terms;
[da5afdf]928
[8bd77b5]929     abac_aspect_t *ptr=NULL;
930     if(yytype==e_yy_OSET_TYPE)
931         ptr=abac_aspect_oset_new(principalname, name);
932         else
933             ptr=abac_aspect_role_new(principalname, name);
934     if (ptr==NULL)
[da5afdf]935         goto error;
936
937     if(terms) {
[8bd77b5]938         _aspect_add_aspect_terms(ptr, terms);
[da5afdf]939     }
[8bd77b5]940     return ptr;
[da5afdf]941
942error:
[8bd77b5]943     panic("can not generate a simple tail aspect");
[da5afdf]944     return NULL;
945}
946
[8bd77b5]947/* B.role.role or B.role.oset */
948abac_aspect_t *validate_linked_tail(int yytype, abac_yy_expression_t *expr)
[da5afdf]949{
950     abac_yy_principal_t *principal=expr->principal;
[8bd77b5]951
952     abac_yy_roleoset_t *eptr=expr->roleoset;
953     abac_yy_roleoset_t *linked_role=expr->linked_role;
[da5afdf]954
[7727f26]955     char *principalname=get_yy_principal_sha(principal);
[8bd77b5]956     char *name=eptr->name;
957     abac_yy_term_t *terms=eptr->terms;
[da5afdf]958
959     char *linkedrolename=linked_role->name;
960     abac_yy_term_t *linked_terms=linked_role->terms;
961
[8bd77b5]962     abac_aspect_t *ptr=NULL;
963     if(yytype==e_yy_OSET_TYPE)
964         ptr=abac_aspect_oset_linking_new(principalname,
965                                            linkedrolename, name);
966         else ptr=abac_aspect_role_linking_new(principalname,
967                                            linkedrolename, name);
968     if (ptr==NULL)
[da5afdf]969         goto error;
970
971     if(linked_terms) {
[8bd77b5]972         _aspect_add_linked_terms(ptr, linked_terms);
[da5afdf]973     }
974     if(terms) {
[8bd77b5]975         _aspect_add_aspect_terms(ptr, terms);
[da5afdf]976     }
977
[8bd77b5]978     return ptr;
[da5afdf]979
980error:
981     panic("can not generate linked tail oset");
982     return NULL;
983}
984
985
[8bd77b5]986/**********************************************************************/
[da5afdf]987
988abac_list_t *make_oset_statement(abac_yy_expression_t *headexpr,
989                       abac_yy_expression_t *tailexpr) 
990{ 
[8bd77b5]991    abac_aspect_t *head_oset=NULL;
992    abac_aspect_t *tail_oset=NULL;
[da5afdf]993
994/* build up left side's abac oset structure */
[8bd77b5]995    head_oset=validate_head(e_yy_OSET_TYPE, headexpr);
[da5afdf]996    if(head_oset == NULL)
997        goto error;
998
999/* build up the right side's abac oset structure */
1000    abac_yy_expression_t *curr_tail = tailexpr;
1001    int intersecting=(tailexpr->next != NULL)? 1:0;
[8bd77b5]1002    abac_aspect_t *curr_oset = NULL;
[da5afdf]1003        while (curr_tail) {
1004            switch(curr_tail->type) {
1005                case e_yy_EXPR_OBJECT:
[8bd77b5]1006                    curr_oset=validate_object_tail(e_yy_OSET_TYPE,curr_tail);
[da5afdf]1007                    break;
1008                case e_yy_EXPR_NAMED:
[8bd77b5]1009                    curr_oset=validate_named_tail(e_yy_OSET_TYPE,curr_tail);
[da5afdf]1010                    break;
1011                case e_yy_EXPR_OSET:
[8bd77b5]1012                    curr_oset=validate_some_tail(e_yy_OSET_TYPE,curr_tail);
[da5afdf]1013                    break;
1014                case e_yy_EXPR_LINKED:
[8bd77b5]1015                    curr_oset=validate_linked_tail(e_yy_OSET_TYPE,curr_tail);
[da5afdf]1016                    break;
1017            }
1018            if(curr_oset==NULL)
1019                goto error;
1020
1021            /* check if first one */
1022            if(tail_oset==NULL) {
1023                if(intersecting) 
[8bd77b5]1024                    tail_oset=validate_intersected_tail(curr_oset);
[da5afdf]1025                    else 
1026                        tail_oset=curr_oset;
1027                } else { 
[8bd77b5]1028                    abac_aspect_add_intersecting_aspect(tail_oset,curr_oset);
[da5afdf]1029            }
1030            curr_tail=curr_tail->next;
1031        } /* while */
1032
[440ba20]1033        preprocess_pl_head(head_oset);
1034        preprocess_pl_tail(tail_oset);
1035
[da5afdf]1036/* XXX collect up type clauses, constraint clauses and
1037   generate rule clauses */
[8bd77b5]1038        abac_list_t *tmp=generate_pl_clauses(head_oset,tail_oset);
[da5afdf]1039        if(tmp == NULL)
1040            goto error;
1041
1042        if(debug) {
[2efdff5]1043            printf("aspect head_oset: ");
[8bd77b5]1044            abac_print_aspect_string_with_condition(head_oset,NULL);
[7727f26]1045            printf("\n");
[2efdff5]1046            printf("aspect tail_oset: ");
[8bd77b5]1047            abac_print_aspect_string_with_condition(tail_oset,NULL);
[7727f26]1048            printf("\n");
[da5afdf]1049        }
1050
1051        _free_yy_expression(headexpr);
1052        _free_yy_expression(tailexpr);
[8bd77b5]1053        abac_rule_head_aspect=head_oset;
1054        abac_rule_tail_aspect=tail_oset;
[b5a3da4]1055        abac_rule_is_oset=1;
[da5afdf]1056        return tmp;
1057
1058error:
1059        _free_yy_expression(headexpr);
1060        _free_yy_expression(tailexpr);
1061        if(head_oset)
[8bd77b5]1062            abac_aspect_free(head_oset);
[da5afdf]1063        if(tail_oset)
[8bd77b5]1064            abac_aspect_free(tail_oset);
[da5afdf]1065        return NULL;
1066}
1067
[440ba20]1068/*****************************************************************************/
1069abac_list_t *validate_range(abac_list_t *ptr)
1070{
1071    abac_list_t *nlist=abac_list_new();
1072
1073    abac_item_t *nitem;
1074    abac_yy_range_t *cur;
1075    char *val;
1076    int type;
1077    abac_list_foreach(ptr, cur,
1078        if(cur) {
1079            type=cur->type;
1080            val=cur->val;
[ca72963]1081            if(type==e_yy_RANGE_MIN) nitem=abac_item_new(abac_min_item_type(),val);
1082            if(type==e_yy_RANGE_MAX) nitem=abac_item_new(abac_max_item_type(),val);
1083            if(type==e_yy_RANGE_TARGET) nitem=abac_item_new(abac_target_item_type(),val);
[440ba20]1084            abac_list_add(nlist,nitem);
1085        }
1086    );
1087    return nlist;
1088}
1089
1090/****************************************************************/
1091void make_yy_range_constraint(abac_yy_term_data_t *ptr)
1092{
1093    if(is_yy_term_data_type_numeric(ptr) ||
1094        is_yy_term_data_type_alpha(ptr) ||
1095           is_yy_term_data_type_time(ptr)) {
1096       abac_list_t *rlist=get_yy_term_data_cond_range(ptr);
1097       if(rlist) {
1098           abac_list_t *nlist=validate_range(rlist);
1099           set_yy_term_data_cond_ptr(ptr,nlist);
1100       }
1101    }
1102}
[8bd77b5]1103/*****************************************************************************/
[da5afdf]1104/* build up the abac structure and also create the yap clause
1105   and insert it into db */
1106abac_list_t *make_role_statement(abac_yy_expression_t *headexpr,
1107abac_yy_expression_t *tailexpr) 
[a9494ad]1108{ 
[8bd77b5]1109    abac_aspect_t *head_role=NULL;
1110    abac_aspect_t *tail_role=NULL;
[a9494ad]1111
1112/* build up left side's abac role structure */
[8bd77b5]1113    head_role=validate_head(e_yy_ROLE_TYPE,headexpr);
[a9494ad]1114    if(head_role == NULL)
1115        goto error;
1116
1117/* build up the right side's abac role structure */
[da5afdf]1118    abac_yy_expression_t *curr_tail = tailexpr;
[a9494ad]1119    int intersecting=(tailexpr->next != NULL)? 1:0;
[8bd77b5]1120    abac_aspect_t *curr_role = NULL;
[a9494ad]1121        while (curr_tail) {
[da5afdf]1122            switch(curr_tail->type) {
1123                case e_yy_EXPR_NAMED:
[8bd77b5]1124                    curr_role=validate_named_tail(e_yy_ROLE_TYPE,curr_tail);
[a9494ad]1125                    break;
[da5afdf]1126                case e_yy_EXPR_ROLE:
[8bd77b5]1127                    curr_role=validate_some_tail(e_yy_ROLE_TYPE,curr_tail);
[a9494ad]1128                    break;
[da5afdf]1129                case e_yy_EXPR_LINKED:
[8bd77b5]1130                    curr_role=validate_linked_tail(e_yy_ROLE_TYPE,curr_tail);
[a9494ad]1131                    break;
1132            }
1133            if(curr_role==NULL)
1134                goto error;
1135
1136            /* check if first one */
1137            if(tail_role==NULL) {
1138                if(intersecting) 
[8bd77b5]1139                    tail_role=validate_intersected_tail(curr_role);
[a9494ad]1140                    else 
1141                        tail_role=curr_role;
1142                } else { 
[8bd77b5]1143                    abac_aspect_add_intersecting_aspect(tail_role,curr_role);
[a9494ad]1144            }
1145            curr_tail=curr_tail->next;
1146        } /* while */
1147
[440ba20]1148        preprocess_pl_head(head_role);
1149        preprocess_pl_tail(tail_role);
1150
[7727f26]1151/* collect up type clauses, constraint clauses and
[da5afdf]1152   generate the final rule clauses */
[8bd77b5]1153        abac_list_t *tmp=generate_pl_clauses(head_role,tail_role);
[a9494ad]1154        if(tmp == NULL)
1155            goto error;
1156
1157        if(debug) {
[2efdff5]1158            printf("aspect head_role: ");
[8bd77b5]1159            abac_print_aspect_string_with_condition(head_role,NULL);
[7727f26]1160            printf("\n");
[2efdff5]1161            printf("aspect tail_role: ");
[8bd77b5]1162            abac_print_aspect_string_with_condition(tail_role,NULL);
[7727f26]1163            printf("\n");
[a9494ad]1164        }
1165
[da5afdf]1166        _free_yy_expression(headexpr);
1167        _free_yy_expression(tailexpr);
[8bd77b5]1168        abac_rule_head_aspect=head_role;
1169        abac_rule_tail_aspect=tail_role;
[b5a3da4]1170        abac_rule_is_oset=0;
[a9494ad]1171        return tmp;
1172
1173error:
[da5afdf]1174        _free_yy_expression(headexpr);
1175        _free_yy_expression(tailexpr);
[a9494ad]1176        if(head_role)
[8bd77b5]1177            abac_aspect_free(head_role);
[a9494ad]1178        if(tail_role)
[8bd77b5]1179            abac_aspect_free(tail_role);
[a9494ad]1180        return NULL;
1181}
[da5afdf]1182
[b5a3da4]1183/************************************************************************/
1184void abac_yy_init()
1185{
1186   abac_yyinit();
1187   abac_yy_init_rule_id_clauses();
1188}
1189
1190
Note: See TracBrowser for help on using the repository browser.