Changeset 440ba20


Ignore:
Timestamp:
04/30/12 17:31:19 (14 months ago)
Author:
Mei <mei@…>
Branches:
mei_rt2, mei_rt2_fix_1
Children:
ca72963
Parents:
d037f54
git-author:
Mei <mei@…> (04/30/12 17:31:19)
git-committer:
Mei <mei@…> (04/30/12 17:31:19)
Message:

1) wrap up refactoring to move all the code gen to abac structure
2) all original testsuite passed
3) add couple more ui calls in abac.hh ie. manage constraint's

creation, hook to dump yap db.

Files:
1 added
15 edited

Legend:

Unmodified
Added
Removed
  • Makefile.am

    r8bd77b5 r440ba20  
    2727    libabac/abac_term.c \ 
    2828    libabac/abac_pl_gen.c \ 
     29    libabac/abac_pl_pre.c \ 
    2930    libabac/abac_pl_yy.c \ 
    3031    libabac/abac_pl_yy.h \ 
  • examples/access_rt2_typed/README

    r9502c50 r440ba20  
    8585#  
    8686# [keyid:alpha].role:access([string:'Read'], [urn:?F])<- [principal:?B]  
    87 #                [keyid:alpha].oset:documents([string:?P) <- [urn:?F] 
     87#                [keyid:alpha].oset:documents([string:?P]) <- [urn:?F] 
    8888#                [keyid:alpha].role:team([string:?P]) <- [principal:?B] 
    8989#  
  • libabac/abac.h

    rd037f54 r440ba20  
    1616typedef struct _abac_condition_t abac_condition_t; 
    1717typedef struct _abac_term_t abac_term_t; 
     18typedef struct _abac_item_t abac_item_t; 
    1819typedef struct _abac_param_list_t abac_param_list_t; 
    1920 
     
    2223 */ 
    2324abac_context_t *abac_context_new(void); 
     25abac_context_t *abac_context_dup(abac_context_t *ctx); 
    2426abac_context_t *abac_context_dup(abac_context_t *ctx); 
    2527void abac_context_free(abac_context_t *ctx); 
     
    124126 * Operations on term/params. 
    125127 */ 
     128abac_condition_t *abac_condition_create(char *vtype); 
     129abac_condition_t *abac_condition_create_from_aspect(abac_aspect_t *ptr); 
    126130abac_condition_t *abac_condition_dup(abac_condition_t *ptr); 
     131int abac_condition_add_range_item(abac_condition_t*, char*, char*, char*); 
    127132void abac_condition_free(abac_condition_t *ptr); 
    128 abac_condition_t *abac_condition_from_string(char *string); 
    129 abac_condition_t *abac_condition_from_aspect(abac_aspect_t *ptr); 
    130133char *abac_condition_typed_string(abac_condition_t *ptr); 
    131134char *abac_condition_string(abac_condition_t *ptr); 
    132 char *abac_condtype_name(int); 
    133135char *abac_term_to_time(char *string); 
     136int abac_term_isvar(abac_term_t *term); 
    134137char *abac_term_typed_string(abac_term_t *ptr); 
    135138char *abac_term_string(abac_term_t *ptr); 
     
    138141abac_term_t *abac_term_create(int, char*, abac_condition_t*); 
    139142abac_term_t *abac_term_named_create(int, char*); 
    140 bool abac_term_is_urn_type(abac_term_t *); 
    141 bool abac_term_is_integer_type(abac_term_t *); 
     143bool abac_term_is_numeric(abac_term_t *); 
     144bool abac_term_is_alpha(abac_term_t *); 
     145bool abac_term_is_time(abac_term_t *); 
     146bool abac_term_is_integer_type(abac_term_t *term); 
     147bool abac_term_is_urn_type(abac_term_t *term); 
     148bool abac_term_is_string_type(abac_term_t *term); 
     149bool abac_term_is_time_type(abac_term_t *term); 
    142150int abac_term_type(abac_term_t *term); 
    143151abac_term_t *abac_term_add_constraint(abac_term_t *ptr, abac_condition_t *cond); 
    144 abac_term_t *abac_term_new(int, char *, char *, abac_aspect_t *); 
     152abac_term_t *abac_term_new(int, char *, int, char *, void *); 
    145153abac_term_t *abac_term_named_new(int, char *); 
    146154void abac_term_free(abac_term_t *); 
     
    157165abac_term_t **abac_param_list_vectorize(abac_param_list_t *ptr); 
    158166void abac_terms_free(abac_term_t **terms); 
     167int abac_verify_term_type(char *); 
    159168 
    160169/* from abac_verifier */ 
     
    182191void abac_errx(int val, const char *string); 
    183192 
     193/* from abac_pl_yap */ 
     194void show_yap_db(const char *msg); 
     195 
    184196/* 
    185197 * Error codes for loading certificates. 
     
    191203#define ABAC_CERT_BAD_CN            -4  // ID cert is not matching CN=principal format 
    192204#define ABAC_CERT_BAD_YAP           -5  // failed to insert into prolog engine 
     205#define ABAC_CERT_EXISTS            1   // ID already exists (does not default to a failure) 
    193206 
    194207#define ABAC_ID_SUCCESS                     0 
     
    200213#define ABAC_ATTRIBUTE_INVALID_VALIDITY    -2 
    201214#define ABAC_ATTRIBUTE_ISSUER_NOKEY        -3 
     215#define ABAC_ATTRIBUTE_FAIL                -4 
     216 
     217#define ABAC_TERM_SUCCESS                   0 
     218#define ABAC_TERM_FAIL                     -1 
    202219 
    203220 
  • libabac/abac.hh

    rd037f54 r440ba20  
    2828              } 
    2929            /* range constraint */ 
    30             Constraint(char *constraint) { 
    31                 m_constraint=abac_condition_from_string(constraint);  
     30            Constraint(char *vartype) { 
     31                m_constraint=abac_condition_create(vartype); 
     32              } 
     33            /* min, max, target */ 
     34            int add_constraint_item(char *vtype,char *itype, char *val) { 
     35                return abac_condition_add_range_item(m_constraint,vtype,itype,val); 
     36              } 
     37            void add_constraint_item_help() { 
     38                printf(" USAGE: add_constraint_item(\"integer\",\"max\",\"2000\"); \n"); 
     39                printf("        add_constraint_item(\"time\",\"target\",\"20201101T182930\"); \n"); 
    3240              } 
    3341            /* role constraint */ 
     
    7684            } 
    7785            /* can be an a variable data term or a specific value */ 
    78             DataTerm(int type, char *name, Constraint *cond=NULL) { 
     86            DataTerm(char* typenm, char *name, Constraint *cond=NULL) { 
     87                int type=abac_verify_term_type(typenm); 
    7988                if(debug) printf("adding a Dataterm (%s)\n",name); 
     89                if(type==ABAC_TERM_FAIL) 
     90                  abac_errx(1, "DataTerm, fail to create the term"); 
    8091                if(cond) { 
    8192                  m_cond=cond; 
     
    493504   This will throw an exception if the cert's already been baked. */ 
    494505            bool bake() { 
     506                /* can not bake in ABAC_CN mode */ 
     507                if(USE("ABAC_CN")) 
     508                    abac_errx(1, "bake, can not bake the cert with env(ABAC_CN) set"); 
    495509                int rt=abac_attribute_bake(m_attr); 
    496510                if(rt!=1) 
     
    524538                return abac_attribute_cert_chunk(m_attr); 
    525539              } 
     540/* generate yap clauses and injected into db */ 
     541            int consume() { 
     542              /* attribute needs to be baked */   
     543                if(!baked()) { 
     544                    return ABAC_ATTRIBUTE_FAIL; 
     545                } 
     546              } 
    526547      private: 
    527548            abac_attribute_t *m_attr; 
     
    545566      ABAC_CERT_INVALID   invalid certificate (or file not found) 
    546567      ABAC_CERT_BAD_SIG   invalid signature */ 
     568            void dump_yap() { 
     569                show_yap_db("dump_yap"); 
     570              } 
    547571            int load_id(ABAC::ID& id) { 
    548572                return abac_context_load_id_id(m_ctx, id.id()); 
     
    610634 
    611635                abac_context_credentials_free(creds); 
     636                if(debug) show_yap_db("calling from context_credentials"); 
    612637                return attributes; 
    613638              } 
     
    621646 
    622647    Constraint::Constraint(Role *role) 
    623     { m_constraint=abac_condition_from_aspect(role->role()); } 
     648    { m_constraint=abac_condition_create_from_aspect(role->role()); } 
    624649    Constraint::Constraint(Oset *oset) 
    625     { m_constraint=abac_condition_from_aspect(oset->oset()); } 
     650    { m_constraint=abac_condition_create_from_aspect(oset->oset()); } 
    626651} 
    627652 
  • libabac/abac_aspect.c

    rd037f54 r440ba20  
    4949 
    5050/**************************************************************/ 
     51void abac_aspect_dump(abac_aspect_t *ptr, char* offset) 
     52{ 
     53    char *tmp=NULL; 
     54    asprintf(&tmp,"  %s",offset); 
     55    if(ptr->prereqs != 0) { 
     56        abac_aspect_t *cur; 
     57        abac_list_foreach(ptr->prereqs, cur, 
     58            if(cur) 
     59               abac_aspect_dump(cur, tmp); 
     60        ); 
     61        return; 
     62    } 
     63 
     64    printf("\n..... an aspect .....\n"); 
     65    printf("%s aspect_type: %d(%s)\n", offset, ptr->aspect_type, abac_aspect_type_string(ptr)); 
     66    printf("%s is_object: %d\n", offset, ptr->is_object); 
     67    printf("%s principal_name: %s\n", offset, ptr->principal_name); 
     68    if(ptr->principal_name_p) 
     69       printf("%s principal_name_p: %s\n", offset, ptr->principal_name_p); 
     70       else printf("%s principal_name_p: --\n", offset); 
     71    if(ptr->principal_object) 
     72       abac_term_dump(ptr->principal_object, tmp); 
     73       else ("%s principal_object: --\n", offset); 
     74    if(ptr->linked_role_name)  
     75       printf("%s linked_role_name: %s\n", offset, ptr->linked_role_name); 
     76       else printf("%s linked_role_name: --\n", offset); 
     77    if(ptr->linked_role_params) 
     78       abac_param_dump(ptr->linked_role_params, tmp); 
     79       else printf("%s linked_role_params: --\n", offset); 
     80     if(ptr->aspect_name) 
     81       printf("%s aspect_name: %s\n", offset, ptr->aspect_name); 
     82       else printf("%s aspect_name: --\n", offset); 
     83    if(ptr->aspect_params) 
     84       abac_param_dump(ptr->aspect_params, tmp); 
     85       else printf("%s aspect_params: --\n", offset); 
     86    if(ptr->type_string) 
     87       printf("%s type_string:- %s\n", offset, ptr->type_string); 
     88       else printf("%s type_string: --\n", offset); 
     89    printf("%s refcount:- %d\n", offset, ptr->refcount); 
     90    printf(".................................."); 
     91    free(tmp); 
     92} 
     93 
    5194bool abac_aspect_is_oset(abac_aspect_t *ptr) 
    5295{ 
     
    226269} 
    227270 
     271abac_term_t *abac_aspect_object_term(abac_aspect_t *ptr) 
     272{ 
     273    return ptr->principal_object; 
     274} 
     275 
    228276char *abac_aspect_object_name(abac_aspect_t *ptr) 
    229277{ 
     
    250298    abac_term_t *obj=ptr->principal_object; 
    251299    return abac_term_constraint(obj); 
     300} 
     301 
     302char* abac_aspect_get_issuer_keytype(abac_aspect_t *ptr) 
     303{ 
     304    abac_id_t *issuer_id; 
     305    char *principalname=abac_aspect_principal_principalname(ptr); 
     306    if(principalname) { 
     307        abac_id_credential_t *id_cred=abac_id_credential_lookup(principalname); 
     308        if(id_cred) { 
     309            issuer_id=abac_id_credential_id(id_cred); 
     310            return abac_id_keyid(issuer_id); 
     311        } 
     312    } 
     313    return NULL; 
     314} 
     315 
     316int abac_aspect_get_issuer_idtype(abac_aspect_t *ptr) 
     317{ 
     318    abac_id_t *issuer_id; 
     319    char *principalname=abac_aspect_principal_principalname(ptr); 
     320    if(principalname) { 
     321        abac_id_credential_t *id_cred=abac_id_credential_lookup(principalname); 
     322        if(id_cred) { 
     323            issuer_id=abac_id_credential_id(id_cred); 
     324            return abac_id_idtype(issuer_id); 
     325        } 
     326    } 
     327    return 0; 
    252328} 
    253329 
  • libabac/abac_common.h

    rd037f54 r440ba20  
    6565} abac_aspecttype_t; 
    6666 
     67typedef enum _itemtype_t { 
     68    e_ITEM_MIN = 1, 
     69    e_ITEM_MAX = 2, 
     70    e_ITEM_TARGET = 3 
     71} abac_itemtype_t; 
     72 
     73/* itemname[itemtype] */ 
     74static const char *const _itemname[] = 
     75{ 
     76  "baditem", 
     77  "min", 
     78  "max", 
     79  "target" 
     80}; 
     81static int _itemname_cnt=3; 
     82 
    6783#endif 
  • libabac/abac_id.c

    r8bd77b5 r440ba20  
    1616#include "abac_internal.h" 
    1717#include "abac_util.h" 
     18 
     19static int debug=0; 
    1820 
    1921#define KEY_SUFFIX  "_private.pem" 
     
    425427    id->key = NULL; 
    426428    id->refcount = 1; 
     429    if(debug) printf("abac_id_new: made a new id, %ld\n",(long) id); 
    427430    return id; 
    428431} 
     
    515518    abac_id_t *id = abac_xmalloc(sizeof(abac_id_t)); 
    516519 
     520    char *tmp=NULL; 
     521    asprintf(&tmp,"p%s",cn); 
    517522    id->idtype = e_KEYID; 
    518     id->cn = abac_xstrdup(cn); 
     523    id->cn = tmp; 
    519524    id->key = _generate_key(); 
    520525    id->cert = _generate_cert(id->key, cn, validity); 
  • libabac/abac_internal.h

    rd037f54 r440ba20  
    88 
    99#include "abac.h" 
     10 
     11int abac_condition_set_aspect_ptr(abac_condition_t *ptr, abac_aspect_t *aptr); 
     12int abac_condition_set_aspect_string(abac_condition_t *ptr, char *str); 
     13int abac_condition_set_range_string(abac_condition_t *ptr); 
     14int abac_condition_is_range(abac_condition_t *ptr); 
     15abac_aspect_t *abac_condition_of_aspect(abac_condition_t *ptr); 
     16 
     17void abac_aspect_dump(abac_aspect_t *ptr, char* offset); 
     18abac_term_t *abac_aspect_object_term(abac_aspect_t *ptr); 
     19 
     20void abac_condition_dump(abac_condition_t *ptr, char *offset); 
     21abac_list_t *abac_condition_range_list(abac_condition_t *ptr); 
     22 
     23void abac_term_dump(abac_term_t *ptr, char *offset); 
     24 
     25abac_item_t *abac_item_new(char *itype, char *val); 
     26int abac_item_type(abac_item_t *); 
     27char* abac_item_val(abac_item_t *); 
     28void abac_param_dump(abac_param_list_t *ptr, char *offset); 
     29abac_list_t *abac_param_list(abac_param_list_t *ptr); 
     30char* abac_aspect_get_issuer_keytype(abac_aspect_t *ptr); 
     31int abac_aspect_get_issuer_idtype(abac_aspect_t *ptr); 
    1032 
    1133certificate_t *abac_attribute_issuer_cert(abac_attribute_t *ptr); 
  • libabac/abac_pl_gen.c

    rd037f54 r440ba20  
    2424int ABAC_IN_PROLOG=0; 
    2525 
     26abac_list_t *abac_pl_constraints=NULL; 
     27 
     28/* to track id certs within a rule clause */ 
     29typedef struct _abac_id_cert_t { 
     30    char *principalname; 
     31    int type; /* keyidtype */ 
     32    char *clause; 
     33} abac_id_cert_t; 
     34abac_list_t *abac_pl_id_certs = NULL; 
     35 
    2636extern int using_this; 
    2737 
    28  
    2938extern char* abac_yyfptr_encoded; 
    30 extern int abac_yy_cnt_yy_id_certs(); 
    31 extern void abac_yy_free_yy_id_certs(); 
    32 extern char *abac_yy_string_yy_id_certs(); 
    33 extern void abac_yy_free_yy_constraints(); 
    34 extern char *abac_yy_string_yy_constraints(); 
     39 
     40char *generate_pl_type_clause(char *principalname, int type); 
     41 
    3542 
    3643/***********************************************************************/ 
     
    7481    } 
    7582    return clist; 
     83} 
     84 
     85 
     86/************************************************************************/ 
     87/* this is for tracking prolog constraints */ 
     88void abac_pl_init_constraints() 
     89{ 
     90    abac_pl_constraints = abac_list_new(); 
     91} 
     92 
     93void abac_pl_free_constraints() 
     94{ 
     95    char *cur; 
     96    abac_list_foreach(abac_pl_constraints, cur, 
     97        if(cur) 
     98            free(cur); 
     99    ); 
     100    abac_list_free(abac_pl_constraints); 
     101    abac_pl_constraints=NULL; 
     102} 
     103 
     104int abac_pl_cnt_constraints() 
     105{ 
     106    return abac_list_size(abac_pl_constraints); 
     107} 
     108 
     109char *abac_pl_string_constraints() 
     110{ 
     111    int first=1; 
     112    char *tmp=NULL; 
     113    char *final=NULL; 
     114    char* cur; 
     115    abac_list_foreach(abac_pl_constraints, cur, 
     116        if(cur) 
     117            if(first) { 
     118                final=abac_xstrdup(cur); 
     119                first=0; 
     120                } else { 
     121                    tmp=final; 
     122                    final=NULL; 
     123                    int cnt=asprintf(&final,"%s,%s", tmp, cur); 
     124            } 
     125    ); 
     126    return final; 
     127} 
     128 
     129void abac_pl_add_constraints(char *constraint) 
     130{ 
     131    if(abac_pl_constraints == NULL) 
     132        abac_pl_init_constraints(); 
     133    char* nptr=abac_xstrdup(constraint); 
     134    abac_list_add(abac_pl_constraints, nptr); 
     135} 
     136 
     137 
     138/************************************************************************/ 
     139void abac_pl_init_id_certs() 
     140{ 
     141    abac_pl_id_certs = abac_list_new(); 
     142} 
     143 
     144void abac_pl_free_id_certs() 
     145{ 
     146    if(abac_pl_id_certs==NULL) 
     147        return; 
     148 
     149    abac_id_cert_t *id; 
     150    abac_list_foreach(abac_pl_id_certs, id, 
     151        if(id)  
     152            free(id->principalname); 
     153            free(id->clause); 
     154            free(id); 
     155    ); 
     156    abac_list_free(abac_pl_id_certs); 
     157    abac_pl_id_certs = NULL; 
     158} 
     159 
     160int abac_pl_cnt_id_certs() 
     161{ 
     162    return abac_list_size(abac_pl_id_certs); 
     163} 
     164 
     165char *abac_pl_string_id_certs() 
     166{ 
     167    int first=1; 
     168    char *tmp=NULL; 
     169    abac_id_cert_t *cur; 
     170    abac_list_foreach(abac_pl_id_certs, cur, 
     171        if(cur)  
     172            if(first) { 
     173                tmp=abac_xstrdup(cur->clause); 
     174                first=0; 
     175                } else { 
     176                    int cnt=asprintf(&tmp,"%s,%s", tmp, cur->clause); 
     177            } 
     178    ); 
     179    return tmp; 
     180} 
     181 
     182void abac_pl_add_id_certs(char *principalname, int type) 
     183{ 
     184    abac_id_cert_t *id_cert=NULL; 
     185    int found=0; 
     186    abac_id_cert_t *cur; 
     187 
     188    if(debug) { 
     189         printf("add_id_certs: adding --> (%s)\n", principalname); 
     190    } 
     191 
     192    if(abac_pl_id_certs == NULL) { 
     193        abac_pl_init_id_certs(); 
     194        } else { 
     195            abac_list_foreach(abac_pl_id_certs, cur, 
     196                if(cur)  
     197                    if(strcmp(cur->principalname,principalname)==0) { 
     198                       found=1; 
     199                       break; 
     200                    } 
     201            ); 
     202    } 
     203 
     204    if (found) { 
     205        return; 
     206        } else { 
     207            id_cert=abac_xmalloc(sizeof(abac_id_cert_t)); 
     208            id_cert->principalname=abac_xstrdup(principalname); 
     209            id_cert->type=type; 
     210            id_cert->clause=generate_pl_type_clause(principalname,type); 
     211            abac_list_add(abac_pl_id_certs, id_cert); 
     212    } 
    76213} 
    77214 
     
    104241     } 
    105242 
    106      if(debug && tmp) printf("head_string: (%s)\n",tmp); 
     243     if(debug && tmp) printf("generate_pl_head_string: (%s)\n",tmp); 
    107244     if(cnt>0) 
    108245        return tmp; 
     
    231368{ 
    232369    /*only,  A.R <- B */ 
     370    if(debug)  
     371         printf("calling _build_constraint_rule_clause (%s)(%s)\n", head_string, tail_string); 
    233372    char *tmp; 
    234373    int idx=_get_next_cred_idx(); 
     
    452591   abac_list_t *clauses=abac_list_new(); 
    453592   
    454    int cnt=abac_yy_cnt_yy_id_certs(); 
     593   int cnt=abac_pl_cnt_id_certs(); 
    455594   if(cnt > 0) { /* string it up */ 
    456        id_clauses_string=abac_yy_string_yy_id_certs(); 
    457        abac_yy_free_yy_id_certs(); 
     595       id_clauses_string=abac_pl_string_id_certs(); 
     596       abac_pl_free_id_certs(); 
    458597   } 
    459598 
    460599   /* make a loop here */ 
    461    cnt=abac_yy_cnt_yy_constraints(); 
     600   cnt=abac_pl_cnt_constraints(); 
    462601   if(cnt > 0) { 
    463       constraint_clauses_string=abac_yy_string_yy_constraints(); 
    464       abac_yy_free_yy_constraints(); 
     602      constraint_clauses_string=abac_pl_string_constraints(); 
     603      abac_pl_free_constraints(); 
    465604   } 
    466605 
     
    539678    if(typeid==NULL || strcmp(typeid,"NULL")==0) 
    540679        panic("generate_pl_type_clause: can not have null typeid"); 
     680    if(debug) 
     681        printf("generate type clause, (%s)\n", principalname); 
    541682    int cnt=asprintf(&tmp,"isType(%s,%s)", 
    542683                                principalname, typeid); 
  • libabac/abac_pl_yap.c

    rd037f54 r440ba20  
    7474} 
    7575 
    76 static void _show_yap_db(char *msg) 
     76void show_yap_db(const char *msg) 
    7777{ 
    7878    char lstr[]="listing"; 
     
    287287      acme.buys_rocket <- coyote (coyote=prin, acme.buys_rocket=role) 
    288288        ==> isMember(coyote,role(acme,buys_rocket), L) 
    289  
    290       acme.buys_rocket <- acme.preferred_customer  -- NOT DONE YET */ 
     289      acme.buys_rocket <- acme.preferred_customer  -- NOT valid  
     290*/ 
    291291static abac_stack_t *_query_with_aspect(abac_pl_t *pl, abac_aspect_t* head, abac_aspect_t* tail) 
    292292{ 
     
    295295 
    296296    if(debug) 
    297         _show_yap_db("DEBUG:calling within _query_with_aspect"); 
     297        show_yap_db("DEBUG:calling within _query_with_aspect"); 
    298298 
    299299    char *nm; 
     
    333333    ret=_make_yap_query(prin_nm,nm,tmp); 
    334334    return ret; 
    335 } 
    336  
    337 /* this is only if the db is rather complete */ 
    338 static abac_stack_t *_dump_db(abac_pl_t *pl) 
    339 { 
    340     YAP_Term *eterm; 
    341     YAP_Term arg[3]; 
    342     char tmp[5000]; 
    343     abac_stack_t *cred_list = abac_stack_new(); 
    344  
    345     if(USE("DUMP_DB")) 
    346         _show_yap_db("DEBUG:calling within _dump_db"); 
    347  
    348     char *estring=NULL; 
    349     YAP_Term *eterm1; 
    350     YAP_Term *eterm2; 
    351     asprintf(&estring,"_"); 
    352 /* 
    353     arg[0]=YAP_ReadBuffer(estring,eterm1); 
    354     arg[1]=YAP_ReadBuffer(estring,eterm2); 
    355 */ 
    356     arg[0]=YAP_MkVarTerm(); 
    357     arg[1]=YAP_MkVarTerm(); 
    358     arg[2]=YAP_MkVarTerm(); 
    359     YAP_Atom f = YAP_LookupAtom("isMember"); 
    360     YAP_Functor func = YAP_MkFunctor(f, 3); 
    361     YAP_Term goal=YAP_MkApplTerm(func, 3, arg); 
    362  
    363     int rc =YAP_RunGoal( goal ); 
    364     if (rc) { 
    365         printf("YAP dump succeed\n"); 
    366         YAP_WriteBuffer(arg[2], tmp, 5000,YAP_WRITE_HANDLE_VARS); 
    367         if(debug) printf("    dump answer : %s\n", tmp); 
    368         /* this is returned as ['string1','string2'] */ 
    369         _credentials_from_string(cred_list,tmp);  
    370         while (YAP_RestartGoal()) { 
    371             if(debug) printf("another dump success\n"); 
    372             YAP_WriteBuffer(arg[2], tmp, 5000,YAP_WRITE_HANDLE_VARS); 
    373             if(debug) printf("    dump restart answer : %s\n", tmp); 
    374             _credentials_from_string(cred_list,tmp);  
    375         } 
    376     } else { 
    377         printf("YAP _dump_db query failed\n"); 
    378         /* YAP_Exit(1); */ 
    379     } 
    380     return cred_list; 
    381 } 
    382  
    383 /* findall(X,isMember(_,_,X),L) */ 
    384 static abac_stack_t *_dump2_db(abac_pl_t *pl) 
    385 { 
    386     YAP_Term *eterm; 
    387     YAP_Term arg[3]; 
    388     char tmp[5000]; 
    389     abac_stack_t *cred_list = abac_stack_new(); 
    390  
    391     if(debug) 
    392         _show_yap_db("DEBUG:calling within _dump2_db"); 
    393  
    394     char *estring="isMember(_,_,X)"; 
    395     arg[0]=YAP_MkAtomTerm(YAP_LookupAtom("X")); 
    396     arg[1]=YAP_ReadBuffer(estring,eterm); 
    397     arg[2]=YAP_MkVarTerm(); 
    398     YAP_Atom f = YAP_LookupAtom("findall"); 
    399     YAP_Functor func = YAP_MkFunctor(f, 3); 
    400     YAP_Term goal=YAP_MkApplTerm(func, 3, arg); 
    401  
    402     int rc =YAP_RunGoal( goal ); 
    403     if (rc) { 
    404         printf("YAP dump succeed\n"); 
    405         YAP_WriteBuffer(arg[2], tmp, 5000,YAP_WRITE_HANDLE_VARS); 
    406         if(debug) printf("    dump answer : %s\n", tmp); 
    407         /* this is returned as ['string1','string2'] */ 
    408         _credentials_from_string(cred_list,tmp);  
    409         } else { 
    410             printf("YAP _dump2_db query failed\n"); 
    411             /* YAP_Exit(1); */ 
    412     } 
    413     return cred_list; 
    414335} 
    415336 
  • libabac/abac_pl_yy.c

    rd037f54 r440ba20  
    1616 
    1717/* from abac_pl_gen.c */ 
    18 extern char *generate_pl_range_constraint(char *,char *,char *,char *); 
    19 extern char *generate_pl_range_time_constraint(char *,char *,char *); 
    2018extern abac_list_t *generate_pl_clauses(abac_aspect_t *, abac_aspect_t *); 
    21 extern char* generate_pl_constraint_clause(abac_aspect_t *, char *); 
    22 extern char *generate_pl_type_clause(char *, int); 
    23 /* from abac_pl_yap.c */ 
    24 extern char *abac_pl_add_range_constraint_clause(char *var, char *tmplist); 
     19 
    2520/* from rt2.y */ 
    2621extern void abac_yyinit(); 
     
    3429abac_aspect_t *abac_rule_tail_aspect=NULL; 
    3530 
    36 /* to track id certs within a rule clause */ 
    37 typedef struct _abac_yy_id_cert_t { 
    38     char *principalname; 
    39     int type; /* keyidtype */ 
    40     char *clause; 
    41 } abac_yy_id_cert_t; 
    42 abac_list_t *abac_yy_id_certs = NULL; 
    4331 
    4432/* structure to hold the range information 
     
    5543} abac_yy_range_t; 
    5644 
    57 /* to track role/oset constraint clauses used within a rule clause, 
    58    collect them up in one place, these are for conjunction clauses */ 
    59 typedef struct _abac_yy_constraint_t { 
    60     char *clause; 
    61 } abac_yy_constraint_t; 
    62 abac_list_t *abac_yy_constraints = NULL; 
    63  
    6445/* local principal structure  [keyid:USC] */ 
    6546struct _abac_yy_principal_t { 
     
    7455    int is_anonymous; 
    7556    char *name; 
    76     char *cond_str; 
    77     void *cond_ptr; // ptr to a saved abac_aspect_t 
     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) 
    7860    abac_yy_expression_t *cond_head_expr; 
    7961}; 
     
    9274    int type; 
    9375    char *name; 
    94     char *cond_str; 
    95     void *cond_ptr; // ptr to a saved abac_aspect_t 
     76    char *cond_str; // range string 
     77    void *cond_ptr; // ptr to a saved abac_aspect_t  
    9678    abac_list_t *cond_range; 
    9779    abac_yy_expression_t *cond_head_expr; // parking stub 
     
    186168{ 
    187169    if (abac_rule_clauses != NULL) { 
    188         char *cur; 
    189         if(abac_yy_id_certs) { 
    190             abac_list_foreach(abac_yy_id_certs, cur, 
    191                 if(cur) free(cur); 
    192             ); 
    193         } 
     170        abac_pl_free_id_certs(); 
    194171        abac_list_free(abac_rule_clauses); 
    195172    } 
     
    213190 
    214191/************************************************************************/ 
    215 void abac_yy_init_yy_id_certs() 
    216 { 
    217     abac_yy_id_certs = abac_list_new(); 
    218 } 
    219  
    220 void abac_yy_free_yy_id_certs() 
    221 { 
    222     abac_yy_id_cert_t *id; 
    223     abac_list_foreach(abac_yy_id_certs, id, 
    224         if(id)  
    225             free(id->principalname); 
    226             free(id->clause); 
    227             free(id); 
    228     ); 
    229     abac_list_free(abac_yy_id_certs); 
    230     abac_yy_id_certs = NULL; 
    231 } 
    232  
    233 int abac_yy_cnt_yy_id_certs() 
    234 { 
    235     return abac_list_size(abac_yy_id_certs); 
    236 } 
    237  
    238 char *abac_yy_string_yy_id_certs() 
    239 { 
    240     int first=1; 
    241     char *tmp=NULL; 
    242     abac_yy_id_cert_t *cur; 
    243     abac_list_foreach(abac_yy_id_certs, cur, 
    244         if(cur)  
    245             if(first) { 
    246                 tmp=abac_xstrdup(cur->clause); 
    247                 first=0; 
    248                 } else { 
    249                     int cnt=asprintf(&tmp,"%s,%s", tmp, cur->clause); 
    250             } 
    251     ); 
    252     return tmp; 
    253 } 
    254  
    255 static void _add_yy_id_certs(char *principalname, int type) 
    256 { 
    257     abac_yy_id_cert_t *id_cert=NULL; 
    258  
    259     if(debug) { 
    260          printf("add_yy_id_certs: adding --> (%s)\n", principalname); 
    261     } 
    262     int found=0; 
    263     abac_yy_id_cert_t *cur; 
    264     abac_list_foreach(abac_yy_id_certs, cur, 
    265         if(cur)  
    266             if(strcmp(cur->principalname,principalname)==0) { 
    267                found=1; 
    268                break; 
    269             } 
    270     ); 
    271  
    272     if (found) { 
    273         return; 
    274         } else { 
    275             id_cert=abac_xmalloc(sizeof(abac_yy_id_cert_t)); 
    276             id_cert->principalname=abac_xstrdup(principalname); 
    277             id_cert->type=type; 
    278             if(USE("ABAC_CN")) { 
    279                  id_cert->clause=generate_pl_type_clause(principalname,type); 
    280                  } else { 
    281                     int *tmp=NULL; 
    282                     asprintf(&tmp,"p%s",principalname); 
    283                     id_cert->clause=generate_pl_type_clause(tmp,type); 
    284                     free(tmp); 
    285             } 
    286             abac_list_add(abac_yy_id_certs, id_cert); 
    287     } 
    288 } 
    289  
    290 /***********************************************************************/ 
    291192static void _free_yy_cond_range(abac_list_t *ptr)  
    292193{ 
     
    459360void set_yy_term_data_type(abac_yy_term_data_t *ptr, char* typestr) 
    460361{ 
    461     int type=abac_term_verify_term_type(typestr); 
     362    int type=abac_verify_term_type(typestr); 
    462363    ptr->type=type; 
    463364} 
     
    470371bool is_yy_term_data_type_numeric(abac_yy_term_data_t *ptr) 
    471372{ 
    472     if(ptr->type==abac_term_verify_term_type("integer") || 
    473           ptr->type==abac_term_verify_term_type("float")) 
     373    if(ptr->type==abac_verify_term_type("integer") || 
     374          ptr->type==abac_verify_term_type("float")) 
    474375        return 1; 
    475376    return 0; 
     
    478379bool is_yy_term_data_type_time(abac_yy_term_data_t *ptr) 
    479380{ 
    480     if(ptr->type==abac_term_verify_term_type("time")) 
     381    if(ptr->type==abac_verify_term_type("time")) 
    481382        return 1; 
    482383    return 0; 
     
    485386bool is_yy_term_data_type_alpha(abac_yy_term_data_t *ptr) 
    486387{ 
    487     if(ptr->type==abac_term_verify_term_type("string") || 
    488         ptr->type==abac_term_verify_term_type("urn") || 
    489          ptr->type==abac_term_verify_term_type("boolean")) 
     388    if(ptr->type==abac_verify_term_type("string") || 
     389        ptr->type==abac_verify_term_type("urn") || 
     390         ptr->type==abac_verify_term_type("boolean")) 
    490391        return 1; 
    491392    return 0; 
     
    531432    ptr->is_anonymous=0; 
    532433    ptr->name=NULL; 
     434    ptr->isrange=0; 
    533435    ptr->cond_str=NULL; 
     436    ptr->cond_ptr=NULL; 
    534437    ptr->cond_head_expr=NULL; 
    535438    return ptr; 
     
    539442{ 
    540443    using_this=1; 
     444} 
     445 
     446void set_yy_term_principal_isrange(abac_yy_term_principal_t *ptr, int isrange) 
     447{ 
     448    ptr->isrange=isrange; 
    541449} 
    542450 
     
    627535    ptr->next=NULL; 
    628536    ptr->bcnt=1; 
    629     return ptr; 
    630 } 
    631  
    632 /************************************************************************/ 
    633 void abac_yy_init_yy_constraints() 
    634 { 
    635     abac_yy_constraints = abac_list_new(); 
    636 } 
    637  
    638 void abac_yy_free_yy_constraints() 
    639 { 
    640     abac_yy_constraint_t *cur; 
    641     abac_list_foreach(abac_yy_constraints, cur, 
    642         if(cur && cur->clause)  
    643             free(cur->clause); 
    644         free(cur); 
    645     ); 
    646     abac_list_free(abac_yy_constraints); 
    647     abac_yy_constraints=NULL; 
    648 } 
    649  
    650 int abac_yy_cnt_yy_constraints() 
    651 { 
    652     return abac_list_size(abac_yy_constraints); 
    653 } 
    654  
    655 char *abac_yy_string_yy_constraints() 
    656 { 
    657     int first=1; 
    658     char *tmp=NULL; 
    659     abac_yy_constraint_t *cur; 
    660     abac_list_foreach(abac_yy_constraints, cur, 
    661         if(cur && cur->clause)  
    662             if(first) { 
    663                 tmp=abac_xstrdup(cur->clause); 
    664                 first=0; 
    665                 } else { 
    666                     int cnt=asprintf(&tmp,"%s,%s", tmp, cur->clause); 
    667             } 
    668     ); 
    669     return tmp; 
    670 } 
    671  
    672 abac_yy_constraint_t *abac_yy_add_yy_constraints(char *constraint) 
    673 { 
    674     abac_yy_constraint_t *ptr= 
    675         (abac_yy_constraint_t *) abac_xmalloc(sizeof(abac_yy_constraint_t)); 
    676     ptr->clause=abac_xstrdup(constraint); 
    677     abac_list_add(abac_yy_constraints, ptr); 
    678537    return ptr; 
    679538} 
     
    846705/***************************************************************************/ 
    847706/* add the oset condition to constraint list */ 
    848 char *make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string) 
     707void make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string) 
    849708{ 
    850709   abac_yy_expression_t *head_expr=get_yy_term_data_cond_head_expr(ptr); 
    851710   if(head_expr) { 
    852711       abac_aspect_t *head_aspect=validate_head(e_yy_OSET_TYPE,head_expr); 
    853        if(head_aspect == NULL) 
    854            goto error; 
    855  
    856        char *tmp=generate_pl_constraint_clause(head_aspect,tail_string); 
    857        set_yy_term_data_cond_str(ptr,tmp); 
    858        set_yy_term_data_cond_ptr(ptr,head_aspect); 
    859        abac_yy_add_yy_constraints(tmp); 
    860        return tmp; 
     712       if(head_aspect != NULL) { 
     713           if(debug) printf("make_yy_oset_constraint..\n"); 
     714           set_yy_term_data_cond_ptr(ptr,head_aspect); 
     715       } 
    861716   } 
    862  
    863 error: 
    864    return NULL; 
    865717}  
     718 
    866719/* add the role condition to constraint list */ 
    867 char *make_yy_role_constraint(abac_yy_term_principal_t *ptr, char *tail_string) 
     720void make_yy_role_constraint(abac_yy_term_principal_t *ptr, char *tail_string) 
    868721{ 
    869722   abac_yy_expression_t *head_expr=get_yy_term_principal_cond_head_expr(ptr); 
    870723   if(head_expr) { 
    871724       abac_aspect_t *head_aspect=validate_head(e_yy_ROLE_TYPE,head_expr); 
    872        if(head_aspect == NULL) 
    873            goto error; 
    874  
    875        char *tmp=generate_pl_constraint_clause(head_aspect,tail_string); 
    876        set_yy_term_principal_cond_str(ptr,tmp); 
    877        set_yy_term_principal_cond_ptr(ptr,head_aspect); 
    878        abac_yy_add_yy_constraints(tmp); 
    879        if(debug) { 
    880            printf("make_yy_role_constraint, adding (%s) \n",tmp); 
     725       if(head_aspect != NULL) { 
     726          if(debug) printf("make_yy_role_constraint..\n"); 
     727          set_yy_term_principal_cond_ptr(ptr,head_aspect); 
     728          set_yy_term_principal_isrange(ptr,0); 
    881729       } 
    882        return tmp; 
    883730   } 
    884  
    885 error: 
    886    return NULL; 
    887731} 
    888732 
    889733 
    890734/****************************************************************/ 
    891 /* add the range condition to constraint list */ 
    892 /* this is for integer and float only */ 
    893 void make_yy_range_numeric_constraint(abac_yy_term_data_t *ptr, char *var) 
    894 { 
    895    char *typestr=abac_termtype_string(ptr->type); 
    896    abac_list_t *rlist=get_yy_term_data_cond_range(ptr); 
    897    char *tmplist=NULL; 
    898    char *tmp=NULL; 
    899    int as_range=1; /* either , or ; */ 
    900    if(rlist) { 
    901        char *rstring=_string_yy_cond_range(rlist); 
    902        set_yy_term_data_cond_str(ptr,rstring); 
    903        abac_yy_range_t *cur; 
    904       
    905        /* a list of values -- in chars */ 
    906        abac_list_foreach(rlist, cur, 
    907            int type=cur->type; 
    908            char *val=cur->val;  
    909            switch(type) { 
    910              case e_yy_RANGE_MIN: 
    911                tmp=generate_pl_range_constraint(typestr,var,val,">="); 
    912                break; 
    913              case e_yy_RANGE_MAX: 
    914                tmp=generate_pl_range_constraint(typestr,var,val,"=<"); 
    915                break; 
    916              case e_yy_RANGE_TARGET: 
    917                tmp=generate_pl_range_constraint(NULL,var,val,"="); 
    918                as_range=0; 
    919                break; 
    920            } 
    921            /* ; is prolog's disjunction built in predicate */ 
    922            if(tmplist) { 
    923                if(as_range) 
    924                    asprintf(&tmplist,"%s,%s",tmplist,tmp); 
    925                    else 
    926                        asprintf(&tmplist,"%s;%s",tmplist,tmp); 
    927                } else { 
    928                    tmplist=tmp; 
    929            } 
    930            tmp=NULL; 
    931        ); 
    932        asprintf(&tmplist,"(%s)",tmplist); 
    933        abac_yy_add_yy_constraints(tmplist); 
    934    } 
    935 } 
    936  
    937 /****************************************************************/ 
    938 /* this is for time only */ 
    939 void make_yy_range_time_constraint(abac_yy_term_data_t *ptr, char *var) 
    940 { 
    941    char *typestr=abac_termtype_string(ptr->type); 
    942    abac_list_t *rlist=get_yy_term_data_cond_range(ptr); 
    943    char *tmplist=NULL; 
    944    char *tmp=NULL; 
    945    char *ttmp=NULL; 
    946    char *tlist=NULL; 
    947    int as_range=1; /* either , or ; */ 
    948    if(rlist) { 
    949        char *rstring=_string_yy_cond_range(rlist); 
    950        set_yy_term_data_cond_str(ptr,rstring); 
    951        abac_yy_range_t *cur; 
    952       
    953        /* a list of values -- in chars */ 
    954        abac_list_foreach(rlist, cur, 
    955            int type=cur->type; 
    956            char *tval=cur->val;  
    957            char *val=abac_term_to_time(tval); 
    958            switch(type) { 
    959              case e_yy_RANGE_MIN: 
    960                ttmp=generate_pl_range_time_constraint(var,val,">"); 
    961                tmp=generate_pl_range_time_constraint(var,val,"="); 
    962                asprintf(&tlist,"(%s;%s)",ttmp,tmp); 
    963                tmp=tlist; 
    964                break; 
    965              case e_yy_RANGE_MAX: 
    966                ttmp=generate_pl_range_time_constraint(var,val,"="); 
    967                tmp=generate_pl_range_time_constraint(var,val,"<"); 
    968                asprintf(&tlist,"(%s;%s)",ttmp,tmp); 
    969                tmp=tlist; 
    970                break; 
    971              case e_yy_RANGE_TARGET: 
    972                tmp=generate_pl_range_time_constraint(var,val,"="); 
    973                as_range=0; 
    974                break; 
    975            } 
    976            free(val); 
    977            /* ; is prolog's disjunction built in predicate */ 
    978            if(tmplist) { 
    979                if(as_range) 
    980                    asprintf(&tmplist,"%s,%s",tmplist,tmp); 
    981                    else 
    982                        asprintf(&tmplist,"%s;%s",tmplist,tmp); 
    983                } else { 
    984                    tmplist=tmp; 
    985            } 
    986            tmp=NULL; 
    987        ); 
    988  
    989        asprintf(&tmplist,"(%s)",tmplist); 
    990        /* generate a clause with above and add into db */ 
    991        tmp=abac_pl_add_range_constraint_clause(var,tmplist); 
    992        abac_yy_add_yy_constraints(tmp); 
    993    } 
    994 } 
    995  
    996 /****************************************************************/ 
    997 /* this is for string and urn only */ 
    998 void make_yy_range_string_constraint(abac_yy_term_data_t *ptr, char *var) 
    999 { 
    1000    char *typestr=abac_termtype_string(ptr->type); 
    1001    abac_list_t *rlist=get_yy_term_data_cond_range(ptr); 
    1002    char *tmplist=NULL; 
    1003    char *tmp=NULL; 
    1004    if(rlist) { 
    1005        char *rstring=_string_yy_cond_range(rlist); 
    1006        set_yy_term_data_cond_str(ptr,rstring); 
    1007        abac_yy_range_t *cur; 
    1008       
    1009        /* a list of values -- in chars */ 
    1010        abac_list_foreach(rlist, cur, 
    1011            int type=cur->type; 
    1012            char *val=cur->val;  
    1013            switch(type) { 
    1014              case e_yy_RANGE_MIN: 
    1015                panic("make_yy_range_string_constraint, invalid range type - min");  
    1016                break; 
    1017              case e_yy_RANGE_MAX: 
    1018                /* invalid range type */ 
    1019                panic("make_yy_range_string_constraint, invalid range type - max");  
    1020                break; 
    1021              case e_yy_RANGE_TARGET: 
    1022                tmp=generate_pl_range_constraint(NULL,var,val,"="); 
    1023                break; 
    1024            } 
    1025            /* ; is prolog's disjunction built in predicate */ 
    1026            if(tmplist) 
    1027                asprintf(&tmplist,"%s;%s",tmplist,tmp); 
    1028                else tmplist=tmp; 
    1029            tmp=NULL; 
    1030        ); 
    1031        asprintf(&tmplist,"(%s)",tmplist); 
    1032        /* generate a clause with above and add into db */ 
    1033        tmp=abac_pl_add_range_constraint_clause(var,tmplist); 
    1034        abac_yy_add_yy_constraints(tmp); 
    1035    } 
    1036 } 
    1037  
    1038 void make_yy_range_constraint(abac_yy_term_data_t *ptr, char *var) 
    1039 { 
    1040     if(is_yy_term_data_type_numeric(ptr)) { 
    1041         make_yy_range_numeric_constraint(ptr, var); 
    1042         } else if (is_yy_term_data_type_alpha(ptr)) { 
    1043             make_yy_range_string_constraint(ptr, var); 
    1044             } else if (is_yy_term_data_type_time(ptr)) { 
    1045                 make_yy_range_time_constraint(ptr, var); 
    1046     } 
    1047 } 
    1048  
    1049  
    1050 /************************************************************************/ 
    1051  
    1052735static void _aspect_add_terms(int linked, abac_aspect_t *aspect_ptr,  
    1053736abac_yy_term_t *terms) 
     
    1056739    int type; 
    1057740    int isnamed; 
     741    int isrange; 
    1058742    char *name; 
    1059743    char *cond; 
     
    1065749        ptr=NULL; 
    1066750        isnamed=0;  
     751        isrange=0; 
    1067752        switch (curr->type) { 
    1068753           case e_yy_DTERM_DATA: 
     
    1071756               type=dptr->type; 
    1072757               name=abac_xstrdup(dptr->name); 
    1073                if(dptr->cond_str) { 
     758               if(dptr->cond_str) 
    1074759                  cond=abac_xstrdup(dptr->cond_str); 
    1075                   ptr=dptr->cond_ptr; 
    1076                } 
     760               ptr=dptr->cond_ptr; 
     761               isrange=(dptr->cond_range!=NULL)?1:0; 
    1077762               break; 
    1078763           } 
     
    1080765           { 
    1081766               abac_yy_term_principal_t *pptr=curr->term.p_ptr; 
    1082                type=abac_term_verify_term_type("principal"); 
     767               type=abac_verify_term_type("principal"); 
    1083768               name=abac_xstrdup(pptr->name); 
    1084                if(pptr->cond_str) { 
     769               if(pptr->cond_str) 
    1085770                  cond=abac_xstrdup(pptr->cond_str); 
    1086                   ptr=pptr->cond_ptr; 
    1087                } 
     771               ptr=pptr->cond_ptr; 
     772               isrange=pptr->isrange; 
    1088773               break; 
    1089774           } 
     
    1098783           case e_yy_DTERM_ANONYMOUS: 
    1099784           { 
    1100               type=abac_term_verify_term_type("anonymous"); 
     785              type=abac_verify_term_type("anonymous"); 
    1101786              name=abac_xstrdup("_"); 
    1102787              break; 
     
    1106791       if(isnamed) 
    1107792           param=abac_term_named_new(type,name); 
    1108            else param=abac_term_new(type,name,cond,ptr); 
     793           else param=abac_term_new(type,name,isrange,cond,ptr); 
    1109794       if (linked)  
    1110795           abac_aspect_add_linked_param(aspect_ptr, param); 
     
    1140825     
    1141826     char *principalname=get_yy_principal_sha(principal); 
    1142      char *othername=get_yy_principal_name(principal); 
    1143827     char *name=ptr->name; 
    1144828     abac_yy_term_t *terms=ptr->terms; 
     
    1158842          _aspect_add_aspect_terms(aptr, terms); 
    1159843     } 
    1160      _add_yy_id_certs(othername,get_yy_principal_type(principal)); 
    1161844     return aptr; 
    1162845 
     
    1181864     abac_yy_principal_t *principal=expr->principal; 
    1182865     char *principalname=get_yy_principal_sha(principal); 
    1183      char *othername=get_yy_principal_name(principal); 
    1184866 
    1185867     abac_aspect_t *ptr=NULL; 
     
    1187869         ptr=abac_aspect_oset_principal_new(principalname); 
    1188870         else ptr=abac_aspect_role_principal_new(principalname); 
    1189      _add_yy_id_certs(othername,get_yy_principal_type(principal)); 
    1190871     if (ptr==NULL) 
    1191872         goto error; 
     
    1208889     char *cond=object->cond_str; 
    1209890     void *ptr=object->cond_ptr; 
    1210      abac_term_t *term=abac_term_new(type,name,cond,ptr); 
     891     int isrange=(object->cond_range!=NULL)?1:0; 
     892     abac_term_t *term=abac_term_new(type,name,isrange,cond,ptr); 
    1211893     abac_aspect_t *aptr=NULL; 
    1212894     if(yytype==e_yy_OSET_TYPE) 
     
    1214896         else 
    1215897             goto error; /* can not be a role expression with obj */ 
    1216  
    1217      if(get_yy_term_data_is_variable(object)) 
    1218          _add_yy_id_certs(name,type); 
    1219  
    1220898     if (aptr==NULL) 
    1221899         goto error; 
     
    1235913 
    1236914     char *principalname=get_yy_principal_sha(principal); 
    1237      char *othername=get_yy_principal_name(principal); 
    1238  
    1239915     char *name=eptr->name; 
    1240916     abac_yy_term_t *terms=eptr->terms; 
     
    1251927         _aspect_add_aspect_terms(ptr, terms); 
    1252928     } 
    1253  
    1254      _add_yy_id_certs(othername,get_yy_principal_type(principal)); 
    1255  
    1256929     return ptr; 
    1257930 
     
    1270943 
    1271944     char *principalname=get_yy_principal_sha(principal); 
    1272      char *othername=get_yy_principal_name(principal); 
    1273  
    1274945     char *name=eptr->name; 
    1275946     abac_yy_term_t *terms=eptr->terms; 
     
    1293964         _aspect_add_aspect_terms(ptr, terms); 
    1294965     } 
    1295  
    1296      _add_yy_id_certs(othername,get_yy_principal_type(principal)); 
    1297966 
    1298967     return ptr; 
     
    13511020        } /* while */ 
    13521021 
     1022        preprocess_pl_head(head_oset); 
     1023        preprocess_pl_tail(tail_oset); 
     1024 
    13531025/* XXX collect up type clauses, constraint clauses and  
    13541026   generate rule clauses */ 
     
    13811053} 
    13821054 
     1055/*****************************************************************************/ 
     1056abac_list_t *validate_range(abac_list_t *ptr) 
     1057{ 
     1058    abac_list_t *nlist=abac_list_new(); 
     1059 
     1060    abac_item_t *nitem; 
     1061    abac_yy_range_t *cur; 
     1062    char *val; 
     1063    int type; 
     1064    abac_list_foreach(ptr, cur, 
     1065        if(cur) { 
     1066            type=cur->type; 
     1067            val=cur->val; 
     1068            if(type==e_yy_RANGE_MIN) nitem=abac_item_new("min",val); 
     1069            if(type==e_yy_RANGE_MAX) nitem=abac_item_new("max",val); 
     1070            if(type==e_yy_RANGE_TARGET) nitem=abac_item_new("target",val); 
     1071            abac_list_add(nlist,nitem); 
     1072        } 
     1073    ); 
     1074    return nlist; 
     1075} 
     1076 
     1077/****************************************************************/ 
     1078void make_yy_range_constraint(abac_yy_term_data_t *ptr) 
     1079{ 
     1080    if(is_yy_term_data_type_numeric(ptr) || 
     1081        is_yy_term_data_type_alpha(ptr) || 
     1082           is_yy_term_data_type_time(ptr)) { 
     1083       abac_list_t *rlist=get_yy_term_data_cond_range(ptr); 
     1084       if(rlist) { 
     1085           abac_list_t *nlist=validate_range(rlist); 
     1086           set_yy_term_data_cond_ptr(ptr,nlist); 
     1087       } 
     1088    } 
     1089} 
    13831090/*****************************************************************************/ 
    13841091/* build up the abac structure and also create the yap clause 
     
    14261133        } /* while */ 
    14271134 
     1135        preprocess_pl_head(head_role); 
     1136        preprocess_pl_tail(tail_role); 
     1137 
    14281138/* collect up type clauses, constraint clauses and  
    14291139   generate the final rule clauses */ 
     
    14611171   abac_yyinit(); 
    14621172   abac_yy_init_rule_id_clauses(); 
    1463    abac_yy_init_yy_id_certs(); 
    1464    abac_yy_init_yy_constraints(); 
    1465 } 
    1466  
    1467  
     1173} 
     1174 
     1175 
  • libabac/abac_pl_yy.h

    r8bd77b5 r440ba20  
    4646extern abac_list_t *make_yy_minmax_range(char *min, char *max); 
    4747extern abac_list_t *make_yy_min_range(char *min); 
    48 extern char *make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string); 
    49 extern char *make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string); 
     48extern void make_yy_range_constraint(abac_yy_term_data_t *ptr); 
     49extern void make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string); 
     50extern void make_yy_role_constraint(abac_yy_term_principal_t *ptr, char *tail_string); 
    5051extern abac_yy_principal_t *make_yy_principal(char *sha, char *cn, int type); 
    51 extern void make_yy_range_constraint(abac_yy_term_data_t *ptr, char *var); 
    5252extern abac_yy_roleoset_t *make_yy_roleoset_role(char *name, abac_yy_term_t *terms); 
    5353extern abac_yy_roleoset_t *make_yy_roleoset_oset(char *name, abac_yy_term_t *terms); 
    54 extern char *make_yy_oset_constraint(abac_yy_term_data_t *ptr, char *tail_string); 
    55 extern char *make_yy_role_constraint(abac_yy_term_principal_t *ptr, char *tail_string); 
    5654extern abac_yy_term_data_t *make_yy_term_data(); 
    5755extern void set_yy_term_data_name(abac_yy_term_data_t *ptr, char *name); 
  • libabac/abac_term.c

    rd037f54 r440ba20  
    1818static int debug=0; 
    1919 
    20 /* string will contain either  
    21      the range literal (static constraint) 
    22        or 
    23      the oset/role prologized string (dynamic constraint) 
    24    union ptr will only be set if it is a dynamic 
    25    constraint */ 
     20/* itemtype is 
     21     e_ITEM_MIN=1, 
     22     e_ITEM_MAX=2, 
     23     e_ITEM_TARGET=3, 
     24 [a..b], [a..], [..b], [a],[a,b],[many a] 
     25*/ 
     26struct _abac_item_t { 
     27    int itemtype; 
     28    char *val; 
     29}; 
     30 
     31/* condtype is 
     32     e_COND_ROLE = 1, 
     33     e_COND_OSET = 2, 
     34     e_COND_RANGE = 3 
     35   vartype is one of termtype  
     36   string will contain either  
     37       the range literal (static constraint) 
     38      or 
     39       the oset/role prologized string (dynamic constraint) 
     40      it is set if this condition has been pre-processed for codegen 
     41   of_aspect ptr will only be set only if it is a dynamic 
     42       constraint  
     43   range_list is set only if needed  
     44*/ 
    2645struct _abac_condition_t { 
    27     int type; 
     46    int condtype; 
     47    int vartype; 
    2848    char *string;  
     49    abac_list_t *range_list; 
    2950    abac_aspect_t *of_aspect; 
    3051}; 
     
    3354   idtype_t/name/p_name pair for the named principal term 
    3455*/ 
    35     
    3656struct _abac_term_t { 
    3757    int type; 
    3858    char *name; 
    39     // e_TERM_PRINCIPAL isnamed 
    4059    int isnamed; 
    4160    char *p_name;  
     
    4968}; 
    5069 
    51  
    5270/******************************************************************/ 
    53 char *abac_condtype_name(int i) 
     71char *abac_condtype_string(int i) 
    5472{ 
    5573    if(i>_condname_cnt) 
    56         panic("abac_condtype_name: went out of range on condname"); 
     74        panic("abac_condtype_string: went out of range on condname"); 
    5775    return (char *) _condname[i]; 
    5876} 
    59  
    60 abac_condition_t *abac_condition_new(int type,char* condstr,abac_aspect_t *cptr) 
     77char *abac_termtype_string(int i) 
     78{ 
     79    if(i>_termname_cnt) 
     80        panic("abac_termtype_string: went out of range on termname"); 
     81    return (char *) _termname[i]; 
     82} 
     83 
     84int abac_verify_term_type(char *type) { 
     85    int i; 
     86 
     87    if (type == NULL) 
     88        panic("abac_verify_term_type: fail with NULL type\n"); 
     89 
     90    for (i = 1; i <= _termname_cnt ; i++) 
     91        if(strcmp(type,_termname[i])==0) 
     92            return i; 
     93 
     94    panic("abac_verify_term_type: fail with unfounded type\n"); 
     95} 
     96 
     97int abac_verify_item_type(char *type) { 
     98    int i; 
     99 
     100    if (type == NULL) 
     101        panic("abac_verify_item_type: fail with NULL type\n"); 
     102 
     103    for (i = 1; i <= _itemname_cnt ; i++) 
     104        if(strcmp(type,_itemname[i])==0) 
     105            return i; 
     106    panic("abac_verify_item_type: fail with unfounded type\n"); 
     107} 
     108 
     109char *abac_range_string(abac_list_t *ptr) 
     110{ 
     111    assert(ptr); 
     112    char *tmp=NULL; 
     113    char *min=NULL; 
     114    char *max=NULL; 
     115    char *val=NULL; 
     116    int type; 
     117 
     118    abac_item_t *cur; 
     119    assert(ptr); 
     120    abac_list_foreach(ptr, cur, 
     121        type=cur->itemtype; 
     122        switch (type) { 
     123            case e_ITEM_MIN: 
     124                min=abac_xstrdup(cur->val); 
     125                break; 
     126            case e_ITEM_MAX: 
     127                max=abac_xstrdup(cur->val); 
     128                break; 
     129            case e_ITEM_TARGET: 
     130                if(val) 
     131                    asprintf(&val,"%s,%s",val,cur->val); 
     132                else val=abac_xstrdup(cur->val); 
     133                break; 
     134        } 
     135    ); 
     136    if(max && min) { 
     137         asprintf(&tmp,"[%s..%s]",min,max); 
     138         free(max); 
     139         free(min); 
     140         return tmp; 
     141    } 
     142    if(max) { 
     143         asprintf(&tmp,"[..%s]",max); 
     144         free(max); 
     145         return tmp; 
     146    } 
     147    if(min) { 
     148         asprintf(&tmp,"[%s..]",min); 
     149         free(min); 
     150         return tmp; 
     151    } 
     152    if(val) { 
     153         asprintf(&tmp,"[%s]",val); 
     154         free(val); 
     155         return tmp; 
     156    } 
     157    return NULL; 
     158} 
     159/******************************************************************/ 
     160abac_item_t *abac_item_new(char *itype, char *val) 
     161{ 
     162     abac_item_t *nptr= 
     163             (abac_item_t *)abac_xmalloc(sizeof(abac_item_t)); 
     164     nptr->itemtype=abac_verify_item_type(itype); 
     165     nptr->val=abac_xstrdup(val); 
     166     return nptr; 
     167} 
     168 
     169void abac_item_free(abac_item_t *ptr) 
     170{ 
     171     assert(ptr); 
     172     assert(ptr->val); 
     173     free(ptr->val); 
     174     free(ptr); 
     175} 
     176 
     177abac_item_t *abac_item_dup(abac_item_t *ptr) 
     178{ 
     179     abac_item_t *nptr= 
     180             (abac_item_t *)abac_xmalloc(sizeof(abac_item_t)); 
     181     nptr->itemtype=ptr->itemtype; 
     182     nptr->val=abac_xstrdup(ptr->val); 
     183     return nptr; 
     184} 
     185 
     186int abac_item_type(abac_item_t *ptr) 
     187{ 
     188    return ptr->itemtype; 
     189} 
     190 
     191char *abac_item_val(abac_item_t *ptr) 
     192{ 
     193    return ptr->val; 
     194} 
     195 
     196/******************************************************************/ 
     197static abac_condition_t *_abac_condition_new(int type, int vtype, 
     198char* condstr,void *cptr) 
    61199{ 
    62200     if(debug) { 
    63201         printf("   abac_condition_new: \n"); 
    64          printf("     type is %d(%s)\n", type, abac_condtype_name(type)); 
     202         printf("     condtype is %d(%s)\n", type, abac_condtype_string(type)); 
     203         printf("     vtype is %d(%s)\n", vtype, abac_termtype_string(type)); 
    65204         printf("     condstr is (%s)\n", condstr); 
    66205         if(cptr) printf("     yes on cptr\n"); 
     
    69208     abac_condition_t *ptr= 
    70209             (abac_condition_t *)abac_xmalloc(sizeof(abac_condition_t)); 
    71      ptr->type=type; 
     210     ptr->condtype=type; 
     211     ptr->vartype=vtype; 
    72212     ptr->string=abac_xstrdup(condstr); 
    73      if(cptr) ptr->of_aspect=abac_aspect_dup(cptr); 
    74          else ptr->of_aspect=NULL; 
     213     ptr->of_aspect=NULL; 
     214     ptr->range_list=NULL; 
     215     if(type==e_COND_RANGE) { 
     216          ptr->range_list=(abac_list_t *)cptr; 
     217          } else { 
     218             if(cptr) ptr->of_aspect=abac_aspect_dup((abac_aspect_t *)cptr); 
     219     } 
    75220     return ptr; 
    76221} 
     
    78223void abac_condition_free(abac_condition_t *ptr) 
    79224{ 
    80      switch(ptr->type) { 
     225     switch(ptr->condtype) { 
    81226        case e_COND_OSET: 
    82227        case e_COND_ROLE: 
     
    88233     } 
    89234     if(ptr->string) free(ptr->string); 
     235     if(ptr->range_list != NULL) { 
     236         abac_item_t *cur; 
     237         abac_list_foreach(ptr->range_list, cur, 
     238           abac_item_free(cur); 
     239         ); 
     240         abac_list_free(ptr->range_list); 
     241     } 
    90242     free(ptr); 
    91243} 
    92244 
    93 abac_condition_t *abac_condition_from_string(char *string) 
    94 { 
    95      assert(string); 
     245abac_aspect_t *abac_condition_of_aspect(abac_condition_t *ptr) 
     246{ 
     247   return ptr->of_aspect; 
     248} 
     249 
     250int abac_condition_is_range(abac_condition_t *ptr) 
     251{ 
     252   if(ptr->condtype==e_COND_RANGE) 
     253      return 1; 
     254      else return 0; 
     255} 
     256 
     257/* called from backend, intended as stub for range constraint */ 
     258abac_condition_t *abac_condition_create(char *vtype) 
     259{ 
    96260     abac_condition_t *nptr= 
    97261             (abac_condition_t *)abac_xmalloc(sizeof(abac_condition_t)); 
    98      nptr->type=e_COND_RANGE; 
    99      nptr->string=abac_xstrdup(string); 
     262     nptr->condtype=e_COND_RANGE; 
     263     nptr->vartype=abac_verify_term_type(vtype); 
     264     nptr->string=NULL; 
     265     nptr->range_list=NULL; 
    100266     nptr->of_aspect=NULL; 
    101267     return nptr; 
    102268} 
    103269 
    104 abac_condition_t *abac_condition_from_aspect(abac_aspect_t *ptr) 
     270abac_condition_t *abac_condition_create_from_aspect(abac_aspect_t *ptr) 
    105271{ 
    106272     assert(ptr); 
     
    108274             (abac_condition_t *)abac_xmalloc(sizeof(abac_condition_t)); 
    109275     if(abac_aspect_is_role(ptr)) 
    110          nptr->type=e_COND_ROLE; 
    111          else nptr->type=e_COND_OSET; 
     276         nptr->condtype=e_COND_ROLE; 
     277         else nptr->condtype=e_COND_OSET; 
     278     nptr->vartype=e_TERM_PRINCIPAL; 
    112279     nptr->string=NULL; 
     280     nptr->range_list=NULL; 
    113281     nptr->of_aspect=abac_aspect_dup(ptr); 
    114282     return nptr; 
     
    120288     abac_condition_t *nptr= 
    121289             (abac_condition_t *)abac_xmalloc(sizeof(abac_condition_t)); 
    122      nptr->type=ptr->type; 
     290     nptr->condtype=ptr->condtype; 
     291     nptr->vartype=ptr->vartype; 
    123292     if(ptr->string) 
    124293         nptr->string=abac_xstrdup(ptr->string); 
     
    127296         nptr->of_aspect=abac_aspect_dup(ptr->of_aspect); 
    128297         else nptr->of_aspect=NULL; 
     298 
     299     if(ptr->range_list!=NULL) { 
     300         nptr->range_list=abac_list_new(); 
     301         abac_item_t *cur; 
     302         abac_item_t *nitem; 
     303         abac_list_foreach(ptr->range_list, cur, 
     304           nitem=abac_item_dup(cur); 
     305           abac_list_add(nptr->range_list,nitem);  
     306         ); 
     307         } else { 
     308             nptr->range_list=NULL; 
     309     } 
    129310     return nptr; 
    130311} 
    131312 
     313int abac_condition_vartype(abac_condition_t *ptr) 
     314{ 
     315    return ptr->vartype; 
     316} 
     317 
     318abac_list_t *abac_condition_range_list(abac_condition_t *ptr) 
     319{ 
     320     assert(ptr); 
     321     return ptr->range_list; 
     322} 
     323 
     324 
     325int abac_condition_add_range_item(abac_condition_t *ptr, char *vtype, char* itype, char* val) 
     326{ 
     327    if(ptr->vartype != abac_verify_term_type(vtype)) 
     328       panic("abac_condition_add_range_item: attempt to add range item that does not match with the constraint's type\n"); 
     329    abac_item_t *nitem=abac_item_new(itype,val); 
     330    if(ptr->range_list==NULL) 
     331       ptr->range_list=abac_list_new(); 
     332    abac_list_add(ptr->range_list,nitem); 
     333} 
     334 
    132335char *abac_condition_string(abac_condition_t *ptr) 
    133336{ 
    134337     char *string=NULL; 
    135      switch(ptr->type) { 
     338     switch(ptr->condtype) { 
    136339        case e_COND_OSET: 
    137340        case e_COND_ROLE: 
    138341            string=abac_aspect_string_with_condition(ptr->of_aspect); 
     342            return string; 
    139343            break; 
    140344        case e_COND_RANGE: 
    141             string=abac_xstrdup(ptr->string); 
     345            if(ptr->string != NULL) { 
     346                string=abac_xstrdup(ptr->string); 
     347                return string; 
     348            } 
     349            if(ptr->range_list != NULL) { 
     350                string=abac_range_string(ptr->range_list); 
     351                return string; 
     352            } 
    142353            break; 
    143354     } 
     
    148359{ 
    149360     char *string=NULL; 
    150      switch(ptr->type) { 
     361     switch(ptr->condtype) { 
    151362        case e_COND_OSET: 
    152363        case e_COND_ROLE: 
    153364            string=abac_aspect_typed_string_with_condition(ptr->of_aspect); 
     365            return string; 
    154366            break; 
    155367        case e_COND_RANGE: 
    156             string=abac_xstrdup(ptr->string); 
     368            if(ptr->string != NULL) { 
     369                string=abac_xstrdup(ptr->string); 
     370                return string; 
     371            } 
     372            if(ptr->range_list != NULL) { 
     373                string=abac_range_string(ptr->range_list); 
     374                return string; 
     375            } 
    157376            break; 
    158377     } 
     
    160379} 
    161380 
     381int abac_condition_set_range_string(abac_condition_t *ptr) 
     382{ 
     383   char *string= abac_range_string(ptr->range_list); 
     384   ptr->string=string; 
     385   return 1; 
     386} 
     387 
     388int abac_condition_set_aspect_string(abac_condition_t *ptr, char *str) 
     389{ 
     390   ptr->string=abac_xstrdup(str); 
     391   return 1; 
     392} 
     393 
     394int abac_condition_set_aspect_ptr(abac_condition_t *ptr, abac_aspect_t *aptr) 
     395{ 
     396   ptr->of_aspect=abac_aspect_dup(aptr); 
     397   return 1; 
     398} 
     399 
     400void abac_condition_dump(abac_condition_t *ptr, char *offset) 
     401{ 
     402   printf("...constraint...\n"); 
     403   printf("%s condtype: %d(%s)\n", 
     404                offset, ptr->condtype,abac_condtype_string(ptr->condtype)); 
     405   printf("%s vartype: %d(%s)\n", 
     406                offset, ptr->vartype,abac_termtype_string(ptr->vartype)); 
     407   if(ptr->string) 
     408       printf("%s string: %s\n", offset, ptr->string); 
     409       else printf("%s string: --\n", offset); 
     410   if(ptr->range_list) 
     411       printf("%s range_list: %s\n", 
     412                     offset, abac_range_string(ptr->range_list)); 
     413       else printf("%s range_list: --\n", offset); 
     414   if(ptr->of_aspect) { 
     415       char *tmp=NULL; 
     416       asprintf(&tmp,"  %s",offset); 
     417       abac_aspect_dump(ptr->of_aspect,tmp); 
     418       free(tmp); 
     419       } else printf("%s of_aspect: --\n", offset); 
     420   printf("................\n"); 
     421} 
     422 
    162423/******************************************************************/ 
     424int abac_term_isvar(abac_term_t *term) 
     425{ 
     426    if(isupper(term->name[0])) return 1; 
     427       else return 0; 
     428}  
    163429 
    164430int abac_term_isnamed(abac_term_t *term) 
     
    184450{ 
    185451    return term->constraint; 
    186 } 
    187  
    188 char *abac_termtype_string(int i) 
    189 { 
    190     if(i>_termname_cnt) 
    191         panic("abac_termtype_string: went out of range on termname"); 
    192     return (char *) _termname[i]; 
    193452} 
    194453 
     
    253512} 
    254513 
    255 int abac_term_verify_term_type(char *type) { 
    256     int i; 
    257  
    258     if (type == NULL) 
    259         return 0; 
    260  
    261     for (i = 1; i <= _termname_cnt ; i++) 
    262         if(strcmp(type,_termname[i])==0) 
    263             return i; 
     514bool abac_term_is_alpha(abac_term_t *term) 
     515{ 
     516    if(term->type == e_TERM_URN || 
     517          term->type == e_TERM_STRING || 
     518              term->type == e_TERM_BOOLEAN) 
     519        return 1; 
     520    return 0; 
     521} 
     522 
     523bool abac_term_is_numeric(abac_term_t *term) 
     524{ 
     525    if(term->type == e_TERM_INTEGER || 
     526          term->type == e_TERM_FLOAT) 
     527        return 1; 
     528    return 0; 
     529} 
     530 
     531bool abac_term_is_time(abac_term_t *term) 
     532{ 
     533    if(term->type == e_TERM_TIME) 
     534        return 1; 
    264535    return 0; 
    265536} 
     
    275546} 
    276547 
    277 /* called from yy */ 
    278 abac_term_t *abac_term_new(int type, char *name, char *cond, abac_aspect_t *cptr) 
     548/* called from yy, cptr is either abac_aspect_t or abac_list_t */ 
     549abac_term_t *abac_term_new(int type, char *name, int isrange, char *cond, void *cptr) 
    279550{ 
    280551     if(debug) { 
     
    285556             printf("  cond is %s\n", cond); 
    286557             else printf("  no cond \n"); 
    287          if(cptr) 
    288              printf("  cptr is (%s)\n", abac_aspect_string_with_condition(cptr)); 
    289              else printf("  there is no cptr\n"); 
     558         printf("  isrange is %d\n", isrange); 
     559         if(cptr) { 
     560             if(isrange) printf("  cptr is (%s)\n",  
     561                                    abac_range_string((abac_list_t *)cptr)); 
     562                else 
     563                   printf("  cptr is (%s)\n",  
     564                          abac_aspect_string_with_condition((abac_aspect_t *)cptr)); 
     565         }    else printf("  there is no cptr\n"); 
    290566     } 
    291567     abac_condition_t *constraint=NULL; 
    292      if (cond) { 
    293          if(type==e_TERM_PRINCIPAL) { 
    294              constraint=abac_condition_new(e_COND_ROLE,cond,cptr); 
    295              } else { 
    296                  if(cptr == NULL) 
    297                     constraint=abac_condition_new(e_COND_RANGE,cond,NULL); 
    298                     else 
    299                         constraint=abac_condition_new(e_COND_OSET,cond,cptr); 
     568     if (cptr) { 
     569         if(isrange) { 
     570           constraint=_abac_condition_new(e_COND_RANGE,type,cond,cptr); 
     571           } else { 
     572             if(type==e_TERM_PRINCIPAL) 
     573               constraint=_abac_condition_new(e_COND_ROLE,type,cond,cptr); 
     574               else 
     575                 constraint=_abac_condition_new(e_COND_OSET,type,cond,cptr); 
    300576         } 
    301577     } 
     
    414690abac_term_t *abac_term_add_constraint(abac_term_t *ptr, abac_condition_t *cond) 
    415691{ 
     692    /* make sure the types are matching */ 
     693    if(abac_condition_vartype(cond) != abac_term_type(ptr)) { 
     694        panic("abac_term_add_constraint: mismatched constraint type with the dataterm\n"); 
     695        return NULL; 
     696    } 
     697     
    416698    if(ptr->constraint) { 
    417699        abac_condition_free(ptr->constraint); 
     
    467749 
    468750/********************************************************************/ 
     751abac_list_t *abac_param_list(abac_param_list_t *ptr) 
     752{ 
     753    assert(ptr); 
     754    return ptr->list; 
     755} 
     756 
     757void abac_param_dump(abac_param_list_t *ptr, char *offset) 
     758{ 
     759    printf("===params===\n"); 
     760    abac_term_t  *cur; 
     761    abac_list_foreach(ptr->list, cur, 
     762           abac_term_dump(cur, offset); 
     763    ); 
     764    printf("============\n"); 
     765} 
     766 
    469767abac_param_list_t *abac_param_list_new(abac_term_t *term) 
    470768{ 
     
    595893} 
    596894 
     895 
    597896void abac_terms_free(abac_term_t **terms) 
    598897{ 
     
    605904    free(terms); 
    606905} 
     906 
     907void abac_term_dump(abac_term_t *ptr, char *offset) 
     908{ 
     909    printf("--- term---\n"); 
     910    printf("%s type : %s\n",offset, abac_term_type_name(ptr)); 
     911    printf("%s name : %s\n",offset, abac_term_name(ptr)); 
     912    printf("%s isnamed: %d\n",offset,ptr->isnamed); 
     913    if(ptr->p_name) 
     914        printf("%s p_name: %s\n",offset,ptr->p_name); 
     915        else printf("%s p_name: --\n",offset); 
     916    if(ptr->cn) 
     917        printf("%s cn: %s\n",offset,ptr->cn); 
     918        else printf("%s cn: --\n",offset); 
     919    if(ptr->constraint) { 
     920        char *tmp=NULL; 
     921        asprintf(&tmp,"  %s", offset); 
     922        abac_condition_dump(ptr->constraint,offset); 
     923        free(tmp); 
     924        } else printf("%s constraint: --\n",offset); 
     925    printf("-----------\n"); 
     926} 
     927 
  • libabac/abac_verifier.c

    rd037f54 r440ba20  
    107107char *abac_idtype_string(int i) 
    108108{ 
    109     if(i > _idtypename_cnt) 
     109    if(i > _idtypename_cnt) { 
     110        printf("bad idtypename idx %d\n", i); 
    110111        panic("abac_idtype_string: went out of range on idtypename"); 
    111     return _idtypename[i]; 
     112    } 
     113    return (char*) _idtypename[i]; 
    112114} 
    113115 
     
    198200    char *keyid=abac_id_keyid(a_id); 
    199201 
     202    if(debug) { 
     203         printf("abac_verifier_add_id_credential, cn(%s),keyid(%s)\n", 
     204                cn, keyid); 
     205    } 
     206 
    200207    // add the abac_id to the map of id credentials 
    201208    id_cred = abac_xmalloc(sizeof(abac_id_credential_t)); 
     
    214221                                   id_cred->hashkeyid, HASH_COUNT(id_creds)); 
    215222 
    216      free(keyid); 
    217223     return id_cred; 
    218224} 
    219225 
    220226/** 
    221  * Load an ID certificate. 
     227 * Load an ID  
    222228 */ 
    223229static int _load_id(abac_id_t **a_id,certificate_t *cert, abac_id_credential_t **id_cred_ret) { 
     
    257263    HASH_FIND_STR(id_creds, keyid, id_cred); 
    258264    if (id_cred != NULL) { 
    259         ret = ABAC_CERT_SUCCESS; 
     265        if(debug) printf("existing cert \n"); 
     266        ret = ABAC_CERT_EXISTS; 
    260267        goto error; 
    261268    } 
     
    269276 
    270277    // success, add a new abac_id 
    271     if(*a_id ==NULL) 
    272         *a_id = abac_id_keyid_new(keyid,cn,cert); 
     278    if(*a_id==NULL) { 
     279        *a_id=abac_id_keyid_new(keyid,cn,cert); 
     280    } 
    273281 
    274282    abac_id_credential_t *n_id_cred=abac_verifier_add_id_credential(*a_id); 
     
    351359 
    352360    int rc=_load_id(&id,cert,id_cred_ret); 
     361    if(rc==ABAC_CERT_EXISTS) { 
     362        if(debug) printf("abac_verifier_load_id_files: id already exists\n"); 
     363        return ABAC_CERT_SUCCESS; 
     364    }  
     365 
    353366    /* try to load the private key if it is there */ 
    354     if(_exist(keyfilename)) { 
     367    if((rc==ABAC_CERT_SUCCESS) &&  _exist(keyfilename)) { 
    355368        if(debug) printf("loading... %s\n", keyfilename); 
    356369        int keyrc=abac_id_load_privkey(id, keyfilename); 
  • libabac/rt2.y

    rd037f54 r440ba20  
    288288               if(is_yy_term_data_has_constraint(ptr)) { 
    289289                  char *tail_string=get_yy_term_data_name(ptr); 
    290                   make_yy_range_constraint(ptr,tail_string); 
     290                  make_yy_range_constraint(ptr); 
    291291                  make_yy_oset_constraint(ptr,tail_string); 
    292292               } 
     
    307307                  set_yy_term_principal_name(ptr,tail_string); 
    308308                  set_yy_term_principal_cond_head_expr(ptr,expr); 
    309                   char *string=make_yy_role_constraint(ptr,tail_string); 
     309                  make_yy_role_constraint(ptr,tail_string); 
    310310                  $$=ptr; 
    311311                } 
Note: See TracChangeset for help on using the changeset viewer.