source: libabac/abac_pl_gen.c @ 54758a7

mei_rt2
Last change on this file since 54758a7 was 2e9455f, checked in by Mei <mei@…>, 11 years ago

1) added namespace
2) tweak ?This,
3) allowing linking role/oset as constraining conditions
4) adding access_tests regression testing that uses GENI's access policy
5) added couple multi contexts regression tests
6) add compression/uncompression calls to abac_encode_string/abac_decode_string
(libstrongwan only allows 512 char for attribute rule storage)
7) add attribute_now option to creddy that takes a whole char string for attribute
rule

  • Property mode set to 100644
File size: 24.6 KB
RevLine 
[718ad924]1
2/***********************************************************************/
[d037f54]3/* clause generation called  to  generate credential clauses with a    */
4/* given credential syntax structure (made from parser or from a       */
5/* pre-existing structure                                              */
6/* There are 2 passes,                                                 */
7/*  first pass, process named cred id, and constraint range/role/oset  */
8/*  2nd pass, process rule left / right                                */
[718ad924]9/***********************************************************************/
10#include <stdio.h>
11#include <assert.h>
12#include <stdlib.h>
13
[2e9455f]14#include "abac_pl_gen.h"
[8bd77b5]15#include "abac_internal.h"
[2e9455f]16#include "abac_list.h"
[718ad924]17#include "abac_util.h"
[2e9455f]18#include "abac_context.h"
19#include "abac_aspect.h"
20#include "abac_term.h"
21#include "abac_verifier.h"
[718ad924]22
23#include "uthash.h"
24
25// index to generate C1,C2..
26static int cred_count=0;
27
[7727f26]28static int debug=0;
[d037f54]29int ABAC_IN_PROLOG=0;
[7727f26]30
[440ba20]31abac_list_t *abac_pl_constraints=NULL;
32
33/* to track id certs within a rule clause */
34typedef struct _abac_id_cert_t {
35    char *principalname;
36    int type; /* keyidtype */
37} abac_id_cert_t;
38abac_list_t *abac_pl_id_certs = NULL;
[9335cfa]39
[2e9455f]40static int gg_using_this=0;
41char* yyfptr_encode=NULL;
[d037f54]42
[440ba20]43
[2e9455f]44/* local */
45char *generate_pl_type_clause(abac_context_t *,char *, int);
46/***********************************************************************/
47/* this is called by creddy as a shortcut */
48int generate_pl_clauses_dump(abac_context_t *ctxt, abac_aspect_t *head_aspect, 
49abac_aspect_t *tail_aspect, char *attr_string, char *encoded_attr_string, 
50char *filename, int using_this)
[9b43fc3]51{
[2e9455f]52    FILE *out;
53    abac_list_t *clauses = generate_pl_clauses(ctxt,head_aspect, tail_aspect, encoded_attr_string,using_this);
54
55    int cnt=abac_list_size(clauses);
56    out = fopen(filename, "a+");
57    char *cur=NULL;
58    fprintf(out,"##########################################\n");
59    fprintf(out,"## %s <- %s\n", abac_aspect_string_with_condition(head_aspect),
60                                         abac_aspect_string_with_condition(tail_aspect));
61    fprintf(out,"## %s\n",attr_string);
62    abac_list_foreach(clauses, cur,
63        fprintf(out,"##\n%s\n",cur);
64        if(cur) free(cur);
65    );
66    fprintf(out,"\n");
67    fclose(out);
68    abac_list_free(clauses);
69    return cnt;
[9b43fc3]70}
71
[718ad924]72/***********************************************************************/
[2e9455f]73static void _set_yyfptr_encode(char *string)
[d037f54]74{
[2e9455f]75   yyfptr_encode=abac_xstrdup(string);
[d037f54]76}
77
[2e9455f]78/***********************************************************************/
[9335cfa]79static char* isX()
80{
[2e9455f]81static char x_string[2]="X";
82static char this_string[5]="This";
83    if(gg_using_this)
[9335cfa]84        return this_string;
85        else 
86           return x_string;
87}
88
[718ad924]89static int _get_next_cred_idx()
90{
91    cred_count++;
92    return cred_count;
93}
94
95/* remember to free the returned string */
96static char *_compose_cred_list()
97{
[da5afdf]98    int i=cred_count;
[718ad924]99    if(cred_count==0) return "";
100
101    char *clist=(char *)abac_xmalloc(sizeof(char)*(cred_count)*3);
102    strcpy(clist,"C1");
103    if (cred_count==1) return clist;
104
105    i=1;
106    while(i!=cred_count) {
107        i++;
108        sprintf(clist,"%s,C%d",clist,i);
109    }
110    return clist;
111}
112
[440ba20]113
114/************************************************************************/
115/* this is for tracking prolog constraints */
116void abac_pl_init_constraints()
117{
118    abac_pl_constraints = abac_list_new();
119}
120
121void abac_pl_free_constraints()
122{
123    char *cur;
124    abac_list_foreach(abac_pl_constraints, cur,
125        if(cur)
126            free(cur);
127    );
128    abac_list_free(abac_pl_constraints);
129    abac_pl_constraints=NULL;
130}
131
132int abac_pl_cnt_constraints()
133{
134    return abac_list_size(abac_pl_constraints);
135}
136
137char *abac_pl_string_constraints()
138{
139    int first=1;
140    char *tmp=NULL;
141    char *final=NULL;
142    char* cur;
143    abac_list_foreach(abac_pl_constraints, cur,
144        if(cur)
145            if(first) {
146                final=abac_xstrdup(cur);
147                first=0;
148                } else {
149                    tmp=final;
150                    final=NULL;
151                    int cnt=asprintf(&final,"%s,%s", tmp, cur);
152            }
153    );
154    return final;
155}
156
157void abac_pl_add_constraints(char *constraint)
158{
159    if(abac_pl_constraints == NULL)
160        abac_pl_init_constraints();
161    char* nptr=abac_xstrdup(constraint);
162    abac_list_add(abac_pl_constraints, nptr);
163}
164
165
166/************************************************************************/
167void abac_pl_init_id_certs()
168{
169    abac_pl_id_certs = abac_list_new();
170}
171
172void abac_pl_free_id_certs()
173{
174    if(abac_pl_id_certs==NULL)
175        return;
176
177    abac_id_cert_t *id;
178    abac_list_foreach(abac_pl_id_certs, id,
179        if(id) 
180            free(id->principalname);
181            free(id);
182    );
183    abac_list_free(abac_pl_id_certs);
184    abac_pl_id_certs = NULL;
185}
186
187int abac_pl_cnt_id_certs()
188{
189    return abac_list_size(abac_pl_id_certs);
190}
191
[2e9455f]192char *abac_pl_string_id_certs(abac_context_t *ctxt)
[440ba20]193{
194    char *tmp=NULL;
195    abac_id_cert_t *cur;
196    abac_list_foreach(abac_pl_id_certs, cur,
197        if(cur) 
[2e9455f]198            if(tmp==NULL) {
199                tmp=generate_pl_type_clause(ctxt,cur->principalname,cur->type);
[440ba20]200                } else {
[2e9455f]201                    asprintf(&tmp,"%s,%s", tmp,
202                        generate_pl_type_clause(ctxt,cur->principalname,cur->type));
[440ba20]203            }
204    );
205    return tmp;
206}
207
208void abac_pl_add_id_certs(char *principalname, int type)
209{
210    abac_id_cert_t *id_cert=NULL;
211    int found=0;
212    abac_id_cert_t *cur;
213
214    if(debug) {
[b92a620]215         fprintf(stderr,"add_id_certs: adding --> (%s)\n", principalname);
[440ba20]216    }
217
218    if(abac_pl_id_certs == NULL) {
219        abac_pl_init_id_certs();
220        } else {
221            abac_list_foreach(abac_pl_id_certs, cur,
222                if(cur) 
223                    if(strcmp(cur->principalname,principalname)==0) {
224                       found=1;
225                       break;
226                    }
227            );
228    }
229
230    if (found) {
231        return;
232        } else {
233            id_cert=abac_xmalloc(sizeof(abac_id_cert_t));
234            id_cert->principalname=abac_xstrdup(principalname);
235            id_cert->type=type;
236            abac_list_add(abac_pl_id_certs, id_cert);
237    }
238}
239
[7b548fa]240/***********************************************************************/
[8bd77b5]241/* generate role(p_name, r_name, param..)                              */
242/*          or oset(p_name, r_name, param..)                           */
[2e9455f]243/* mainly for aspect that is if A.R <- B format                        */
[8bd77b5]244static char* generate_pl_head_string(abac_aspect_t *ptr)
[718ad924]245{
246     char *tmp=NULL;
[d037f54]247     char *principalname;
248     PROLOG(principalname=abac_aspect_principal_name(ptr););
[8bd77b5]249     char *aspectname=abac_aspect_aspect_name(ptr);
250     char *typestring=abac_aspect_type_string(ptr);
[718ad924]251     char *param_string=NULL;
252     int cnt=0;
253
254     /* can not be a linked role */
[8bd77b5]255     abac_param_list_t *aspect_params=abac_aspect_aspect_params(ptr);
256     if(aspect_params) {
[d037f54]257        PROLOG(param_string=abac_param_list_string(aspect_params););
[718ad924]258     }
259
260     if (param_string != NULL) {
[8bd77b5]261         cnt=asprintf(&tmp,"%s(%s,%s,%s)", 
262                        typestring, principalname, aspectname, param_string);
[718ad924]263         free(param_string);
264         } else {
[8bd77b5]265             cnt=asprintf(&tmp,"%s(%s,%s)", 
266                        typestring, principalname, aspectname);
[718ad924]267     }
[7727f26]268
[b92a620]269     if(debug && tmp) fprintf(stderr,"generate_pl_head_string: (%s)\n",tmp);
[718ad924]270     if(cnt>0)
271        return tmp;
272        else
273           return NULL;
274}
275
276/* generate role(p_name, r_name, param..) with isMember call ?? */
[8bd77b5]277/* generate oset(p_name, r_name, param..) with isMember call ?? */
[2e9455f]278/* for aspect that could also be with linked role               */
279static char* generate_pl_tail_string(abac_context_t *ctxt,abac_aspect_t *ptr, char *varX)
[718ad924]280{
[da5afdf]281     char *tmp=NULL;
[2e9455f]282     char *namespace=abac_context_namespace(ctxt);
[da5afdf]283
[8bd77b5]284/* for oset case,
[da5afdf]285   A.oset <- B
286   A.oset <- Obj
287   A.oset <- B.oset
288   A.oset <- B.role.oset
289*/
[8bd77b5]290     /* o only if it is an oset and object */
291     if(abac_aspect_is_object(ptr)) {
292         char *objectname=abac_aspect_object_name(ptr);
[da5afdf]293         tmp=abac_xstrdup(objectname);
294         return tmp;
295     } else {
[d037f54]296         char *principalname;
297         PROLOG(principalname=abac_aspect_principal_name(ptr););
[8bd77b5]298         char *aspectname=abac_aspect_aspect_name(ptr);
299         char *linkedname=abac_aspect_linked_role_name(ptr);
300         char *typestring=abac_aspect_type_string(ptr);
[da5afdf]301
302         char *param_string=NULL;
303         char *linked_param_string=NULL;
304         int cnt=0;
[8bd77b5]305   
306         abac_param_list_t *aspect_params=abac_aspect_aspect_params(ptr);
307         if(aspect_params) {
[d037f54]308            PROLOG(param_string=abac_param_list_string(aspect_params););
[da5afdf]309         }
[8bd77b5]310   
311         abac_param_list_t *linked_role_params=abac_aspect_linked_role_params(ptr);
[da5afdf]312         if(linked_role_params) {
[d037f54]313            PROLOG(linked_param_string=abac_param_list_string(linked_role_params););
[da5afdf]314         }
[8bd77b5]315   
[da5afdf]316         /* b.r.r */
[8bd77b5]317         if(linkedname!=NULL && aspectname!=NULL && principalname!=NULL ) {
[da5afdf]318             int fst=_get_next_cred_idx();
319             int snd=_get_next_cred_idx();
320             if(linked_param_string !=NULL) {
321                 if (param_string != NULL) {
[2e9455f]322                     cnt=asprintf(&tmp,"isMember(%s,Y,role(%s,%s,%s),C%d),isMember(%s,%s,%s(Y,%s,%s),C%d)",
323                            namespace, principalname, linkedname,linked_param_string,fst,
324                            namespace,varX, typestring, aspectname,param_string,snd);
[da5afdf]325                     free(param_string);
326                     } else {
[2e9455f]327                         cnt=asprintf(&tmp,"isMember(%s,Y,role(%s,%s,%s),C%d),isMember(%s,%s,%s(Y,%s),C%d)",
328                            namespace, principalname, linkedname,linked_param_string,fst,
329                            namespace, varX, typestring, aspectname,snd);
[da5afdf]330                 }
331                 free(linked_param_string);
332                 } else {
[8bd77b5]333                     if (aspect_params != NULL) {
[2e9455f]334                         cnt=asprintf(&tmp,"isMember(%s,Y,role(%s,%s),C%d),isMember(%s,%s,%s(Y,%s,%s),C%d)",
335                            namespace, principalname,linkedname,fst,
336                            namespace, varX,typestring, aspectname,param_string,snd);
[da5afdf]337                         free(param_string);
338                         } else {
[2e9455f]339                             cnt=asprintf(&tmp,"isMember(%s,Y,role(%s,%s),C%d),isMember(%s,%s,%s(Y,%s),C%d)",
340                                namespace, principalname, linkedname,fst,
341                                namespace, varX,typestring, aspectname,snd);
[da5afdf]342                   }
343             }
344             if(cnt>0)
345                 return tmp;
346                 else
347                     return NULL;
348         } 
349         /* b.r */
[8bd77b5]350         if(linkedname==NULL && aspectname!=NULL && principalname!=NULL ) {
[da5afdf]351             int fst=_get_next_cred_idx();
352             if(param_string != NULL) {
[2e9455f]353                 cnt=asprintf(&tmp,"isMember(%s,%s,%s(%s,%s,%s),C%d)",
354                              namespace,varX,typestring,
[8bd77b5]355                              principalname, aspectname, param_string, fst);
[da5afdf]356                 free(param_string);
357                 } else {
[2e9455f]358                     cnt=asprintf(&tmp,"isMember(%s,%s,%s(%s,%s),C%d)",
359                              namespace,varX, typestring,
[8bd77b5]360                              principalname, aspectname, fst);
[da5afdf]361             }
362             if(cnt>0)
363                 return tmp;
364                 else
365                     return NULL;
366         } 
367         /* b */
[8bd77b5]368         if(linkedname==NULL && aspectname==NULL && principalname!=NULL ) {
[da5afdf]369             tmp=abac_xstrdup(principalname);
370             return tmp;
371         } 
[8bd77b5]372   
373         return tmp;
374         }
[da5afdf]375    return tmp;
376}
[8bd77b5]377   
[da5afdf]378
379/********************************************************************************/
380
[2e9455f]381static char *_build_constraint_rule_clause(abac_context_t *ctxt,char *head_string, char *tail_string)
[da5afdf]382{
[2e9455f]383    /*for  A.R <- B */
[440ba20]384    if(debug) 
[b92a620]385         fprintf(stderr,"calling _build_constraint_rule_clause (%s)(%s)\n", head_string, tail_string);
[da5afdf]386    char *tmp;
387    int idx=_get_next_cred_idx();
[2e9455f]388    asprintf(&tmp, "isMember(%s,%s,%s,C%d)", 
389              abac_context_namespace(ctxt),tail_string,head_string,idx);
[da5afdf]390    return tmp;
391}
392
[2e9455f]393static char *_build_rule_clause(abac_context_t *ctxt, char *aspectname, char *head_string,
394char *tail_string, char *id_string, char *constraint_string, char *varX)
[718ad924]395{
396    char *tmp=NULL;
[2e9455f]397    char *namespace=abac_context_namespace(ctxt);
[718ad924]398
[8bd77b5]399    if(aspectname == NULL) {
[718ad924]400        /* A.R <- B */
[d5bbd3e]401        if(id_string == NULL && constraint_string == NULL) {
[2e9455f]402            asprintf(&tmp, "isMember(%s,%s,%s,['%s'])",
403                     namespace, tail_string,head_string,yyfptr_encode);
[da5afdf]404            } else {
[d5bbd3e]405                if(id_string == NULL) {
[2e9455f]406                    asprintf(&tmp, "isMember(%s,%s,%s,['%s']) :- %s",
407                         namespace, tail_string,head_string,yyfptr_encode,
[d5bbd3e]408                         constraint_string);
409                } else if(constraint_string == NULL) {
[2e9455f]410                    asprintf(&tmp, "isMember(%s,%s,%s,['%s']) :- %s",
411                         namespace, tail_string,head_string,yyfptr_encode,
[d5bbd3e]412                         id_string);
[2e9455f]413                } else { asprintf(&tmp, "isMember(%s,%s,%s,['%s']) :- %s,%s",
414                         namespace, tail_string,head_string,yyfptr_encode,
[d5bbd3e]415                         id_string, constraint_string);
416                }
[718ad924]417        }
418        } else {
419             /* A.R <- B.R */
420             /* A.R <- B.R.R */
421             if (cred_count==0) {
[d5bbd3e]422                 if(id_string == NULL && constraint_string == NULL) {
[2e9455f]423                     asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s",
424                           namespace,varX,
425                           head_string, yyfptr_encode, tail_string);
[718ad924]426                     } else {
[d5bbd3e]427                         if(id_string == NULL) {
[2e9455f]428                             asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s,%s",
429                                 namespace,varX,
430                                 head_string, yyfptr_encode, tail_string,
[d5bbd3e]431                                 constraint_string);
432                         } else if(constraint_string == NULL) {
[2e9455f]433                             asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s,%s",
434                                 namespace,varX,
435                                 head_string, yyfptr_encode, id_string,
[d5bbd3e]436                                 tail_string);
437                         } else { 
[2e9455f]438                             asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s,%s,%s",
439                                 namespace,varX,
440                                 head_string, yyfptr_encode, id_string,
[d5bbd3e]441                                 tail_string, constraint_string);
442                         }
[718ad924]443                 }
444                 } else {
445                     char *tmp_cred_list=_compose_cred_list();
[d5bbd3e]446                     if(id_string == NULL && constraint_string == NULL) {
[2e9455f]447                         asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, appendL([['%s'],%s],L)",
448                                  namespace,varX,
[da5afdf]449                                  head_string, tail_string,
[2e9455f]450                                  yyfptr_encode, tmp_cred_list);
[718ad924]451                         } else {
[d5bbd3e]452                            if(id_string == NULL) {
[2e9455f]453                               asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, appendL([['%s'],%s],L)",
454                                  namespace,varX,
[d5bbd3e]455                                  head_string, tail_string, constraint_string,
[2e9455f]456                                  yyfptr_encode, tmp_cred_list);
[d5bbd3e]457                            } else if(constraint_string == NULL) {
[2e9455f]458                               asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, appendL([['%s'],%s],L)",
459                                  namespace,varX,
[d5bbd3e]460                                  head_string, id_string, tail_string,
[2e9455f]461                                  yyfptr_encode, tmp_cred_list);
[d5bbd3e]462                            } else { 
[2e9455f]463                               asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, %s, appendL([['%s'],%s],L)",
464                                  namespace,varX,
[d5bbd3e]465                                  head_string, id_string, tail_string,
466                                  constraint_string,
[2e9455f]467                                  yyfptr_encode, tmp_cred_list);
[d5bbd3e]468                            }
[718ad924]469                     }
470                     free(tmp_cred_list);
471                     cred_count=0;
472             }
473    }
[da5afdf]474    return tmp;
475}
476
477
[2e9455f]478static char *generate_pl_rule_clause(abac_context_t *ctxt,char *head_rule_string,
479abac_aspect_t *tail_rule, char *id_string, char *constraint_string, char* varX)
[da5afdf]480{
[8bd77b5]481    char *aspectname=abac_aspect_aspect_name(tail_rule);
[2e9455f]482    char *tail_rule_string=generate_pl_tail_string(ctxt,tail_rule,varX);
[8bd77b5]483    if(aspectname == NULL && tail_rule_string == NULL) 
[da5afdf]484        goto error;
[2e9455f]485    char *tmp=_build_rule_clause(ctxt,aspectname,
486                head_rule_string, tail_rule_string, id_string, constraint_string, varX);
[8bd77b5]487    if(tail_rule_string) free(tail_rule_string);
[da5afdf]488    return tmp;
489
490error:
[8bd77b5]491    if(tail_rule_string) free(tail_rule_string);
[da5afdf]492    return NULL;
493}
494
[718ad924]495static char *_add_string(char *dstr, char *nstr)
496{
497    if(strlen(dstr)==0) {
498        dstr=abac_xstrdup(nstr);
499        return dstr;
500        } else { 
501            int len = strlen(dstr)+strlen(nstr)+2;
502            char *tmp=abac_xmalloc(len*sizeof(char));
503            sprintf(tmp,"%s,%s", dstr,nstr);
504            free(dstr);
505            return tmp;
506    }
507    return NULL;
508}
509
[2e9455f]510static char *_build_intersecting_clause(abac_context_t *ctxt, 
511char *head_role_string, char *tail_role_string, char* id_string,
512char* constraint_string,char *varX)
[da5afdf]513{
514    char *tmp;
[2e9455f]515    char *namespace=abac_context_namespace(ctxt);
[da5afdf]516
517    if (cred_count==0) {
[d5bbd3e]518        if(id_string == NULL && constraint_string == NULL) {
[2e9455f]519            asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s",
520                   namespace,varX,
521                   head_role_string, yyfptr_encode, tail_role_string);
[da5afdf]522            } else {
[d5bbd3e]523             if(id_string == NULL) {
[2e9455f]524                asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s, %s",
525                       namespace,varX,
526                       head_role_string, yyfptr_encode, 
[d5bbd3e]527                       tail_role_string, constraint_string);
528             } else if(constraint_string == NULL) {
[2e9455f]529                asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s, %s",
530                       namespace,varX,
531                       head_role_string, yyfptr_encode, 
[d5bbd3e]532                       id_string, tail_role_string);
533             } else {   
[2e9455f]534                asprintf(&tmp,"isMember(%s,%s,%s,['%s']):-%s, %s, %s",
535                       namespace,varX,
536                       head_role_string, yyfptr_encode, 
[d5bbd3e]537                       id_string, tail_role_string, constraint_string);
538             }           
[da5afdf]539        }
540        } else {
541            char *tmp_cred_list=_compose_cred_list();
[d5bbd3e]542            if(id_string == NULL && constraint_string == NULL) {
[2e9455f]543                asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, appendL([['%s'],%s],L)",
544                                namespace,varX,
[da5afdf]545                                head_role_string, tail_role_string,
[2e9455f]546                                yyfptr_encode, tmp_cred_list);
[da5afdf]547                } else {
[d5bbd3e]548                    if(id_string == NULL) {
[2e9455f]549                        asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, appendL([['%s'],%s],L)",
550                            namespace,varX,
[d5bbd3e]551                            head_role_string, tail_role_string, constraint_string,
[2e9455f]552                            yyfptr_encode, tmp_cred_list);
[d5bbd3e]553                    } else if(constraint_string == NULL) {
[2e9455f]554                        asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, appendL([['%s'],%s],L)",
555                            namespace,varX,
[d5bbd3e]556                            head_role_string, id_string, tail_role_string,
[2e9455f]557                            yyfptr_encode, tmp_cred_list);
[d5bbd3e]558                    } else {   
[2e9455f]559                        asprintf(&tmp,"isMember(%s,%s,%s,L):-%s, %s, %s, appendL([['%s'],%s],L)",
560                            namespace,varX,
[d5bbd3e]561                            head_role_string, id_string, tail_role_string, constraint_string,
[2e9455f]562                            yyfptr_encode, tmp_cred_list);
[d5bbd3e]563                    }           
[da5afdf]564            }
565            free(tmp_cred_list);
566            cred_count=0;
567    }
568    return tmp;
569}
570
[2e9455f]571static char *generate_pl_intersecting_clause(abac_context_t *ctxt,
572char *head_role_string, abac_aspect_t *tail_role, char* id_string,
573char* constraint_string, char *varX)
[718ad924]574{
575    char *tmp=NULL;
576    char* tail_role_string=NULL;
[8bd77b5]577    abac_list_t *list=abac_aspect_prereqs(tail_role);
[718ad924]578    /* A.R <- B.R & C.R.R */
[8bd77b5]579    /* A.O <- B.O & C.R.O */
[718ad924]580
581    if (list != NULL) {
[8bd77b5]582        abac_aspect_t *cur;
[718ad924]583        abac_list_foreach(list, cur,
[2e9455f]584            char *ntmp=generate_pl_tail_string(ctxt,cur,varX);
[b92a620]585            if(debug) fprintf(stderr,"  intersecting tail: (%s)\n",ntmp);
[8bd77b5]586            if(tail_role_string==NULL) {
587                 tail_role_string=abac_xstrdup(ntmp);
588                 } else {
589                    tmp=tail_role_string;
590                    tail_role_string=NULL; 
591                    asprintf(&tail_role_string,"%s, %s",tmp,ntmp);
592                    free(tmp);
593            }
[718ad924]594            free(ntmp);
595        );
596    }
597
[b92a620]598    if(debug) fprintf(stderr,"      final intersecting tail: (%s)\n",tail_role_string);
[2e9455f]599    tmp=_build_intersecting_clause(ctxt,head_role_string, tail_role_string,
600                                                 id_string,constraint_string, varX);
[718ad924]601    if(tail_role_string) free(tail_role_string);
602    return tmp;
603}
604
[2e9455f]605/**** THIS NEEDS TO BE LOCKED *****/
606/* XXXX */
[abf8d5d]607/* generate the prolog isMember rule clause for the credential stmt */
[2e9455f]608abac_list_t *generate_pl_clauses(abac_context_t *ctxt,abac_aspect_t *head_aspect,
609abac_aspect_t *tail_aspect,char *encoded_attr_string, int using_this)
[718ad924]610{
611   char *tmp=NULL;
[d5bbd3e]612   char *id_clauses_string=NULL;
613   char *constraint_clauses_string=NULL;
[718ad924]614   abac_list_t *clauses=abac_list_new();
[2e9455f]615 
616   gg_using_this=using_this;
617
618   if(encoded_attr_string!=NULL)
619       _set_yyfptr_encode(encoded_attr_string);
620
621   /* preprocess both sides first */
622   preprocess_pl_head(ctxt,head_aspect);
623   preprocess_pl_tail(ctxt,tail_aspect);
624
[440ba20]625   int cnt=abac_pl_cnt_id_certs();
[718ad924]626   if(cnt > 0) { /* string it up */
[2e9455f]627       id_clauses_string=abac_pl_string_id_certs(ctxt);
[440ba20]628       abac_pl_free_id_certs();
[718ad924]629   }
630
[8bd77b5]631   /* make a loop here */
[440ba20]632   cnt=abac_pl_cnt_constraints();
[da5afdf]633   if(cnt > 0) {
[440ba20]634      constraint_clauses_string=abac_pl_string_constraints();
635      abac_pl_free_constraints();
[da5afdf]636   }
637
[8bd77b5]638/* generate head's string */
639    char *head_string=generate_pl_head_string(head_aspect);
640    if(head_string == NULL)
[718ad924]641        goto error;
642
643/* tail side */
[8bd77b5]644    if(abac_aspect_is_intersection(tail_aspect)) {
[2e9455f]645       tmp=generate_pl_intersecting_clause(ctxt,head_string, tail_aspect,
646                    id_clauses_string, constraint_clauses_string, isX());
[718ad924]647       } else {
[2e9455f]648           tmp=generate_pl_rule_clause(ctxt,head_string, tail_aspect,
649                    id_clauses_string, constraint_clauses_string, isX());
[718ad924]650    }
651    if(tmp==NULL)
652        goto error;
[da5afdf]653 
[718ad924]654    abac_list_add(clauses,tmp);
655    return clauses;
656
657error:
[8bd77b5]658    if(head_string) free(head_string);
[d5bbd3e]659    if(id_clauses_string) free(id_clauses_string);
660    if(constraint_clauses_string) free(constraint_clauses_string);
[da5afdf]661    return clauses;
662}
663
[2e9455f]664char *generate_pl_constraint_clause(abac_context_t *ctxt,abac_aspect_t *head_aspect, char *tail_string)
[da5afdf]665{
[2e9455f]666    char *tmp=NULL;
667    char *head_string=NULL;
[da5afdf]668
[2e9455f]669    if(abac_aspect_is_linking(head_aspect)) { /* leverage on its b.r.r gen code */
670        tmp= generate_pl_tail_string(ctxt,head_aspect,tail_string); 
671        } else {
672            /* generate head's role or oset string */
673            char *head_string=generate_pl_head_string(head_aspect);
674            if(head_string == NULL)
675                goto error;
676
677            /* tail side */
678           tmp=_build_constraint_rule_clause(ctxt,head_string, tail_string);
679           if(tmp==NULL) goto error;
680           if(head_string) free(head_string);
681    }
[da5afdf]682
683error:
[8bd77b5]684    if(head_string) free(head_string);
[2e9455f]685    return tmp;
[da5afdf]686}
687
[d5bbd3e]688/* integer(X)<10 */
689/* X='abc' */
690char *generate_pl_range_constraint(char *typestr,char *var,char *val,char *op)
[da5afdf]691{
692   char *tmp=NULL;
[d5bbd3e]693   if(typestr)
694      asprintf(&tmp,"%s(%s)%s%s",typestr,var,op,val);
695      else
696          asprintf(&tmp,"%s%s%s",var,op,val);
[da5afdf]697   return tmp;
698}
699
[7b548fa]700/* compare(op,var,val) */
701char *generate_pl_range_time_constraint(char *var,char *val,char *op)
702{
703   char *tmp=NULL;
704   asprintf(&tmp,"compare(%s,%s,%s)",op,var,val);
705   return tmp;
706}
707
[abf8d5d]708/* generate the prolog isType rule clause for the type,
[2e9455f]709   isType(namespace,Acme, keyid); */
710char *generate_pl_type_clause(abac_context_t *ctxt,char *principalname, int type)
[718ad924]711{
712    char *tmp=NULL;
[8bd77b5]713    char *typeid= abac_idtype_string(type);
[7b548fa]714    if(typeid==NULL || strcmp(typeid,"NULL")==0)
[d5bbd3e]715        panic("generate_pl_type_clause: can not have null typeid");
[440ba20]716    if(debug)
[b92a620]717        fprintf(stderr,"generate type clause, (%s)\n", principalname);
[2e9455f]718    int cnt=asprintf(&tmp,"isType(%s,%s,%s)",
719                 abac_context_namespace(ctxt),principalname, typeid);
[718ad924]720    return tmp;
721}
722
Note: See TracBrowser for help on using the repository browser.