source: libabac/abac_pl_gen.c @ 718ad924

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

able to parse rt1 without condition
updated examples

  • Property mode set to 100644
File size: 11.0 KB
Line 
1
2
3/***********************************************************************/
4/* clause generation called from parser to generate credential clauses */
5/***********************************************************************/
6#include <stdio.h>
7#include <assert.h>
8#include <stdlib.h>
9
10#include "abac_set.h"
11#include "abac_util.h"
12#include "abac_pl.h"
13
14#include "uthash.h"
15
16// index to generate C1,C2..
17static int cred_count=0;
18extern char* abac_yyfptr;
19extern int abac_cnt_yy_id_certs();
20extern void abac_free_yy_id_certs();
21extern char *abac_string_yy_id_certs();
22char *abac_role_principal_cn(abac_role_t *role);
23char *abac_type_clauses=NULL;
24
25/***********************************************************************/
26static int _get_next_cred_idx()
27{
28    cred_count++;
29    return cred_count;
30}
31
32/* remember to free the returned string */
33static char *_compose_cred_list()
34{
35    int i=cred_count;;
36    if(cred_count==0) return "";
37
38    char *clist=(char *)abac_xmalloc(sizeof(char)*(cred_count)*3);
39    strcpy(clist,"C1");
40    if (cred_count==1) return clist;
41
42    i=1;
43    while(i!=cred_count) {
44        i++;
45        sprintf(clist,"%s,C%d",clist,i);
46    }
47    return clist;
48}
49
50
51/* generate role(p_name, r_name, param..) */
52static char* generate_pl_head_role_string(abac_role_t *role)
53{
54     char *tmp=NULL;
55     char *principalname=abac_role_principal_cn(role);
56     char *rolename=abac_role_role_name(role);
57     char *param_string=NULL;
58     int cnt=0;
59
60     /* can not be a linked role */
61     abac_param_list_t *role_params=abac_role_role_params(role);
62     if(role_params) {
63        param_string=abac_param_list_string(role_params);
64     }
65
66     if (param_string != NULL) {
67         cnt=asprintf(&tmp,"role(%s,%s,%s)", principalname, rolename, param_string);
68         free(param_string);
69         } else {
70             cnt=asprintf(&tmp,"role(%s,%s)", principalname, rolename);
71     }
72     if(cnt>0)
73        return tmp;
74        else
75           return NULL;
76}
77
78/* generate role(p_name, r_name, param..) with isMember call ?? */
79static char* generate_pl_tail_role_string(abac_role_t *role)
80{
81     char *tmp;
82     char *principalname=abac_role_principal_cn(role);
83     char *rolename=abac_role_role_name(role);
84     char *linkedname=abac_role_linked_role(role);
85
86     char *param_string=NULL;
87     char *linked_param_string=NULL;
88     int cnt=0;
89
90     abac_param_list_t *role_params=abac_role_role_params(role);
91     if(role_params) {
92        param_string=abac_param_list_string(role_params);
93     }
94
95     abac_param_list_t *linked_role_params=abac_role_linked_role_params(role);
96     if(linked_role_params) {
97        linked_param_string=abac_param_list_string(linked_role_params);
98     }
99
100     /* b.r.r */
101     if(linkedname!=NULL && rolename!=NULL && principalname!=NULL ) {
102         int fst=_get_next_cred_idx();
103         int snd=_get_next_cred_idx();
104         if(linked_param_string !=NULL) {
105             if (param_string != NULL) {
106                 cnt=asprintf(&tmp,"isMember(Y,role(%s,%s,%s),C%d),isMember(X,role(Y,%s,%s),C%d)",
107                            principalname,
108                            linkedname,linked_param_string,fst,
109                            rolename,param_string,snd);
110                 free(param_string);
111                 } else {
112                     cnt=asprintf(&tmp,"isMember(Y,role(%s,%s,%s),C%d),isMember(X,role(Y,%s),C%d)",
113                            principalname,
114                            linkedname,linked_param_string,fst,
115                            rolename,snd);
116             }
117             free(linked_param_string);
118             } else {
119                 if (role_params != NULL) {
120                     cnt=asprintf(&tmp,"isMember(Y,role(%s,%s),C%d),isMember(X,role(Y,%s,%s),C%d)",
121                            principalname,
122                            linkedname,fst,
123                            rolename,param_string,snd);
124                     free(param_string);
125                     } else {
126                         cnt=asprintf(&tmp,"isMember(Y,role(%s,%s),C%d),isMember(X,role(Y,%s),C%d)",
127                            principalname,
128                            linkedname,fst,
129                            rolename,snd);
130               }
131         }
132         if(cnt>0)
133             return tmp;
134             else
135                 return NULL;
136     } 
137     /* b.r */
138     if(linkedname==NULL && rolename!=NULL && principalname!=NULL ) {
139         int fst=_get_next_cred_idx();
140         if(param_string != NULL) {
141             cnt=asprintf(&tmp,"isMember(X,role(%s,%s,%s),C%d)",
142                          principalname, rolename, param_string, fst);
143             free(param_string);
144             } else {
145                 cnt=asprintf(&tmp,"isMember(X,role(%s,%s),C%d)",
146                          principalname, rolename, fst);
147         }
148         if(cnt>0)
149             return tmp;
150             else
151                 return NULL;
152     } 
153     /* b */
154     if(linkedname==NULL && rolename==NULL && principalname!=NULL ) {
155         tmp=abac_xstrdup(principalname);
156         return tmp;
157     } 
158
159     return tmp;
160}
161
162
163static char *generate_pl_rule_clause(char *head_role_string, abac_role_t *tail_role)
164{
165    char *tmp=NULL;
166    char* tail_role_string=NULL;
167    char* rolename=abac_role_role_name(tail_role);
168
169    if(rolename == NULL) {
170        /* A.R <- B */
171        tail_role_string=generate_pl_tail_role_string(tail_role);
172        if(tail_role_string != NULL) {
173            if(abac_type_clauses==NULL) {
174                asprintf(&tmp, "isMember(%s,%s,['%s'])",
175                         tail_role_string,head_role_string,abac_yyfptr);
176                } else {
177                    asprintf(&tmp, "isMember(%s,%s,['%s']) :- %s",
178                         tail_role_string,head_role_string,abac_yyfptr,
179                         abac_type_clauses);
180                    free(abac_type_clauses);
181                    abac_type_clauses=NULL;
182            }
183            } else { 
184                goto error;
185        }
186        } else {
187             /* A.R <- B.R */
188             /* A.R <- B.R.R */
189             tail_role_string=generate_pl_tail_role_string(tail_role);
190             if (cred_count==0) {
191                 if(abac_type_clauses==NULL) { 
192                     asprintf(&tmp,"isMember(X,%s,['%s']):-%s",
193                           head_role_string, abac_yyfptr, tail_role_string);
194                     } else {
195                         asprintf(&tmp,"isMember(X,%s,['%s']):-%s, %s",
196                                 head_role_string, abac_yyfptr,
197                                 tail_role_string, abac_type_clauses);
198                         free(abac_type_clauses);
199                         abac_type_clauses=NULL;
200                 }
201                 } else {
202                     char *tmp_cred_list=_compose_cred_list();
203                     if(abac_type_clauses == NULL) {
204                         asprintf(&tmp,"isMember(X,%s,L):-%s, appendL([['%s'],%s],L)", 
205                                  head_role_string, tail_role_string,
206                                  abac_yyfptr, tmp_cred_list);
207                         } else {
208                             asprintf(&tmp,"isMember(X,%s,L):-%s, appendL([['%s'],%s],L), %s", 
209                                  head_role_string, tail_role_string,
210                                  abac_yyfptr, tmp_cred_list, abac_type_clauses);
211                             free(abac_type_clauses);
212                             abac_type_clauses=NULL;
213                     }
214                     free(tmp_cred_list);
215                     cred_count=0;
216             }
217    }
218    if(tail_role_string) free(tail_role_string);
219    return tmp;
220
221error:
222    if(tail_role_string) free(tail_role_string);
223    return NULL;
224}
225
226static char *_add_string(char *dstr, char *nstr)
227{
228    if(strlen(dstr)==0) {
229        dstr=abac_xstrdup(nstr);
230        return dstr;
231        } else { 
232            int len = strlen(dstr)+strlen(nstr)+2;
233            char *tmp=abac_xmalloc(len*sizeof(char));
234            sprintf(tmp,"%s,%s", dstr,nstr);
235            free(dstr);
236            return tmp;
237    }
238    return NULL;
239}
240
241static char *generate_pl_intersecting_clause(char *head_role_string,
242                                                     abac_role_t *tail_role)
243{
244    char *tmp=NULL;
245    char* tail_role_string=NULL;
246    abac_list_t *list=abac_role_prereqs(tail_role);
247    /* A.R <- B.R & C.R.R */
248
249    if (list != NULL) {
250        abac_role_t *cur;
251        abac_list_foreach(list, cur,
252            char *ntmp=generate_pl_tail_role_string(cur);
253            if(tail_role_string==NULL)
254                 asprintf(&tail_role_string,"%s",ntmp);
255                 else
256                    asprintf(&tail_role_string,"%s, %s",tail_role_string,ntmp);
257            free(ntmp);
258        );
259    }
260
261    if (cred_count==0) {
262        if(abac_type_clauses ==NULL) {
263            asprintf(&tmp,"isMember(X,%s,['%s']):-%s",
264                   head_role_string, abac_yyfptr, tail_role_string);
265            } else {
266                asprintf(&tmp,"isMember(X,%s,['%s']):-%s, %s",
267                       head_role_string, abac_yyfptr, tail_role_string,
268                       abac_type_clauses);
269                free(abac_type_clauses);
270                abac_type_clauses=NULL;
271        }
272        } else {
273            char *tmp_cred_list=_compose_cred_list();
274            if(abac_type_clauses ==NULL) {
275                asprintf(&tmp,"isMember(X,%s,L):-%s, appendL([['%s'],%s],L)", 
276                                head_role_string, tail_role_string,
277                                abac_yyfptr, tmp_cred_list);
278                } else {
279                    asprintf(&tmp,"isMember(X,%s,L):-%s, appendL([['%s'],%s],L), %s", 
280                                head_role_string, tail_role_string,
281                                abac_yyfptr, tmp_cred_list,abac_type_clauses);
282                    free(abac_type_clauses);
283                    abac_type_clauses=NULL;
284            }
285            free(tmp_cred_list);
286            cred_count=0;
287    }
288    if(tail_role_string) free(tail_role_string);
289    return tmp;
290}
291
292/* generate the yap isMember rule clause for the credential stmt */
293abac_list_t *generate_pl_clauses(abac_role_t *head_role, abac_role_t *tail_role)
294{
295   char *tmp=NULL;
296   abac_list_t *clauses=abac_list_new();
297
298   int cnt=abac_cnt_yy_id_certs();
299   if(cnt > 0) { /* string it up */
300       abac_type_clauses=abac_string_yy_id_certs();
301       abac_free_yy_id_certs();
302   }
303
304/* generate head's role string */
305    char *head_role_string=generate_pl_head_role_string(head_role);
306    if(head_role_string == NULL)
307        goto error;
308
309/* tail side */
310    if(abac_role_is_intersection(tail_role)) {
311       tmp=generate_pl_intersecting_clause(head_role_string, tail_role);
312       } else {
313           tmp=generate_pl_rule_clause(head_role_string, tail_role);
314    }
315    if(tmp==NULL)
316        goto error;
317    abac_list_add(clauses,tmp);
318    return clauses;
319
320error:
321    if(head_role_string) free(head_role_string);
322    return clauses;
323}
324
325/* generate the yap isType rule clause for the type,
326   isType(Acme, keyid); */
327char *generate_pl_type_clause(char *principalname, int type)
328{
329    char *tmp=NULL;
330    char *typeid= abac_keyid_type(type);
331    int cnt=asprintf(&tmp,"isType(%s,%s)",
332                                principalname, typeid);
333    return tmp;
334}
335
Note: See TracBrowser for help on using the repository browser.