Annotation of 43BSDReno/contrib/isode-beta/dsap/common/acl.c, revision 1.1.1.1

1.1       root        1: /* acl.c - General Access Control routines */
                      2: 
                      3: #ifndef lint
                      4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/acl.c,v 7.1 89/12/19 16:19:09 mrose Exp $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/dsap/common/RCS/acl.c,v 7.1 89/12/19 16:19:09 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       acl.c,v $
                     12:  * Revision 7.1  89/12/19  16:19:09  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:41:28  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                                NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: /* LINTLIBRARY */
                     32: 
                     33: #include "quipu/util.h"
                     34: #include "quipu/entry.h"
                     35: #include "cmd_srch.h"
                     36: 
                     37: static struct acl_info * defaultacl = (struct acl_info *) NULL;
                     38: 
                     39: static acl_free (aclptr)
                     40: register struct acl * aclptr;
                     41: {
                     42:        acl_info_free (aclptr->ac_child);
                     43:        acl_info_free (aclptr->ac_entry);
                     44:        acl_info_free (aclptr->ac_default);
                     45:        acl_attr_free (aclptr);
                     46:        free ((char *) aclptr);
                     47: }
                     48: 
                     49: static acl_attr_free (aclptr)
                     50: register struct acl * aclptr;
                     51: {
                     52: register struct acl_attr * ptr;
                     53: register struct acl_attr * next;
                     54: 
                     55:        for (ptr=aclptr->ac_attributes ; ptr!=NULLACL_ATTR; ptr=next ) {
                     56:                next = ptr->aa_next;
                     57:                oid_seq_free (ptr->aa_types);
                     58:                if (ptr->aa_acl != aclptr->ac_default)
                     59:                        acl_info_free (ptr->aa_acl);
                     60:                free ((char *) ptr);
                     61:        }
                     62: }
                     63: 
                     64: static acl_info_free (aclptr)
                     65: register struct acl_info * aclptr;
                     66: {
                     67: register struct acl_info * ptr;
                     68: register struct acl_info * next;
                     69: 
                     70:        if (test_acl_default(aclptr) == OK)
                     71:                return;
                     72: 
                     73:        for (ptr=aclptr ; ptr!=NULLACL_INFO; ptr=next ) {
                     74:                next = ptr->acl_next;
                     75:                dn_seq_free (ptr->acl_name);
                     76:                free ((char *) ptr);
                     77:        }
                     78: 
                     79: }
                     80: 
                     81: int      acl_cmp (acl1, acl2)
                     82: struct acl     * acl1;
                     83: struct acl     * acl2;
                     84: {
                     85:     int          i;
                     86: 
                     87:     if((acl1 == NULLACL) && (acl2 == NULLACL))
                     88:        return(0);
                     89: 
                     90:     if(acl1 == NULLACL)
                     91:        return(-1);
                     92: 
                     93:     if(acl2 == NULLACL)
                     94:        return(1);
                     95: 
                     96:     if((i = acl_info_cmp(acl1->ac_child, acl2->ac_child)) != 0)
                     97:        return(i);
                     98: 
                     99:     if((i = acl_info_cmp(acl1->ac_entry, acl2->ac_entry)) != 0)
                    100:        return(i);
                    101: 
                    102:     if((i = acl_info_cmp(acl1->ac_default, acl2->ac_default)) != 0)
                    103:        return(i);
                    104: 
                    105:     if((i = acl_attr_cmp(acl1->ac_attributes, acl2->ac_attributes)) != 0)
                    106:        return(i);
                    107: 
                    108:     return(0);
                    109: }
                    110: 
                    111: static int       acl_attr_cmp (acl_attr1, acl_attr2)
                    112: struct acl_attr        * acl_attr1;
                    113: struct acl_attr        * acl_attr2;
                    114: {
                    115:     struct acl_attr    * aa1;
                    116:     struct acl_attr    * aa2;
                    117: 
                    118:     if((acl_attr1 == NULLACL_ATTR) && (acl_attr2 == NULLACL_ATTR))
                    119:        return(0);
                    120: 
                    121:     if(acl_attr1 == NULLACL_ATTR)
                    122:        return(-1);
                    123: 
                    124:     if(acl_attr2 == NULLACL_ATTR)
                    125:        return(1);
                    126: 
                    127:     for(aa1=acl_attr1; aa1 != NULLACL_ATTR; aa1=aa1->aa_next)
                    128:     {
                    129:        for(aa2=acl_attr2; aa2 != NULLACL_ATTR; aa2=aa2->aa_next)
                    130:        {
                    131:            if(acl_attr_comp_cmp(aa1, aa2) == 0)
                    132:                break;
                    133:        }
                    134:        if(aa2 == NULLACL_ATTR)
                    135:            return(1);
                    136:     }
                    137: 
                    138:     for(aa2=acl_attr2; aa2 != NULLACL_ATTR; aa2=aa2->aa_next)
                    139:     {
                    140:        for(aa1=acl_attr1; aa1 != NULLACL_ATTR; aa1=aa1->aa_next)
                    141:        {
                    142:            if(acl_attr_comp_cmp(aa1, aa2) == 0)
                    143:                break;
                    144:        }
                    145:        if(aa1 == NULLACL_ATTR)
                    146:            return(-1);
                    147:     }
                    148: 
                    149:     return(0);
                    150: 
                    151: }
                    152: 
                    153: static int       acl_attr_comp_cmp (acl_attr1, acl_attr2)
                    154: struct acl_attr        * acl_attr1;
                    155: struct acl_attr        * acl_attr2;
                    156: {
                    157:     int          i;
                    158: 
                    159:     if((acl_attr1 == NULLACL_ATTR) && (acl_attr2 == NULLACL_ATTR))
                    160:        return(0);
                    161: 
                    162:     if(acl_attr1 == NULLACL_ATTR)
                    163:        return(-1);
                    164: 
                    165:     if(acl_attr2 == NULLACL_ATTR)
                    166:        return(1);
                    167: 
                    168:     if((i = oid_seq_cmp(acl_attr1->aa_types, acl_attr2->aa_types)) != 0)
                    169:        return(i);
                    170: 
                    171:     if((i = acl_info_cmp(acl_attr1->aa_acl, acl_attr2->aa_acl)) != 0)
                    172:        return(i);
                    173: 
                    174:     return(0);
                    175: }
                    176: 
                    177: static int       acl_info_cmp (acl_info1, acl_info2)
                    178: struct acl_info        * acl_info1;
                    179: struct acl_info        * acl_info2;
                    180: {
                    181:     struct acl_info    * ai1;
                    182:     struct acl_info    * ai2;
                    183: 
                    184:     if((acl_info1 == NULLACL_INFO) && (acl_info2 == NULLACL_INFO))
                    185:        return(0);
                    186: 
                    187:     if(acl_info1 == NULLACL_INFO) 
                    188:         if (test_acl_default(acl_info2) == OK)
                    189:                return(0);
                    190:        else
                    191:                return(-1);
                    192: 
                    193:     if(acl_info2 == NULLACL_INFO)
                    194:         if (test_acl_default(acl_info1) == OK)
                    195:                return(0);
                    196:        else
                    197:                return(11);
                    198: 
                    199:     for(ai1=acl_info1; ai1 != NULLACL_INFO; ai1=ai1->acl_next)
                    200:     {
                    201:        for(ai2=acl_info2; ai2 != NULLACL_INFO; ai2=ai2->acl_next)
                    202:        {
                    203:            if(acl_info_comp_cmp(ai1, ai2) == 0)
                    204:                break;
                    205:        }
                    206:        if(ai2 == NULLACL_INFO)
                    207:            return(1);
                    208:     }
                    209: 
                    210:     for(ai2=acl_info2; ai2 != NULLACL_INFO; ai2=ai2->acl_next)
                    211:     {
                    212:        for(ai1=acl_info1; ai1 != NULLACL_INFO; ai1=ai1->acl_next)
                    213:        {
                    214:            if(acl_info_comp_cmp(ai2, ai1) == 0)
                    215:                break;
                    216:        }
                    217:        if(ai1 == NULLACL_INFO)
                    218:            return(-1);
                    219:     }
                    220: 
                    221:     return(0);
                    222: }
                    223: 
                    224: static int       acl_info_comp_cmp (acl_info1, acl_info2)
                    225: struct acl_info        * acl_info1;
                    226: struct acl_info        * acl_info2;
                    227: {
                    228:     int          i;
                    229: 
                    230:     if((acl_info1 == NULLACL_INFO) && (acl_info2 == NULLACL_INFO))
                    231:        return(0);
                    232: 
                    233:     if(acl_info1 == NULLACL_INFO)
                    234:        return(-1);
                    235: 
                    236:     if(acl_info2 == NULLACL_INFO)
                    237:        return(1);
                    238: 
                    239:     if(acl_info1->acl_categories > acl_info2->acl_categories)
                    240:        return(1);
                    241: 
                    242:     if(acl_info2->acl_categories > acl_info1->acl_categories)
                    243:        return(-1);
                    244: 
                    245:     if(acl_info1->acl_selector_type > acl_info2->acl_selector_type)
                    246:        return(1);
                    247: 
                    248:     if(acl_info2->acl_selector_type > acl_info1->acl_selector_type)
                    249:        return(-1);
                    250: 
                    251:     if((i = dn_seq_cmp(acl_info1->acl_name, acl_info2->acl_name)) != 0)
                    252:        return(i);
                    253: 
                    254:     return(0);
                    255: }
                    256: 
                    257: 
                    258: struct acl_info * acl_info_new (x,y,z)
                    259: register int x,y;
                    260: struct dn_seq * z;
                    261: {
                    262: register struct acl_info * ptr;
                    263: 
                    264:        ptr = acl_info_alloc ();
                    265:        acl_info_fill (ptr,x,y,z);
                    266:        ptr->acl_next = NULLACL_INFO;
                    267:        return (ptr);
                    268: }
                    269: 
                    270: static struct acl * acl_cpy (aclptr)
                    271: register struct acl * aclptr;
                    272: {
                    273: register struct acl * ptr;
                    274: 
                    275:        ptr = (struct acl *) smalloc (sizeof (struct acl));
                    276:        ptr->ac_child = acl_info_cpy (aclptr->ac_child);
                    277:        ptr->ac_entry = acl_info_cpy (aclptr->ac_entry);
                    278:        ptr->ac_default = acl_info_cpy (aclptr->ac_default);
                    279:        ptr->ac_attributes = acl_attr_cpy (aclptr->ac_attributes,ptr->ac_default);
                    280:        return (ptr);
                    281: 
                    282: }
                    283: 
                    284: static struct acl * acl_decode (pe)
                    285: PE pe;
                    286: {
                    287: struct acl * aclptr;
                    288: 
                    289:        aclptr = acl_alloc ();
                    290:        if (decode_Quipu_ACLSyntax(pe,1,NULLIP,NULLVP,aclptr) == NOTOK) {
                    291:                free ((char *)aclptr);
                    292:                return (struct acl *) NULL;
                    293:        }
                    294:        return (aclptr);
                    295: 
                    296: }
                    297: 
                    298: static struct acl_attr * acl_attr_cpy (aclptr,dflt)
                    299: struct acl_attr * aclptr;
                    300: struct acl_info * dflt;
                    301: {
                    302: register struct acl_attr * ptr;
                    303: register struct acl_attr * ptr2;
                    304: register struct acl_attr * result = NULLACL_ATTR;
                    305: 
                    306:        for (ptr=aclptr ; ptr!=NULLACL_ATTR; ptr=ptr->aa_next ) {
                    307:                ptr2 = acl_attr_alloc ();
                    308:                ptr2->aa_next = result;
                    309:                result = ptr2;
                    310:                ptr2->aa_types = oid_seq_cpy (ptr->aa_types);
                    311:                if (ptr->aa_acl != dflt)
                    312:                        ptr2->aa_acl = acl_info_cpy (ptr->aa_acl);
                    313:                else
                    314:                        ptr2->aa_acl = dflt;
                    315:        }
                    316:        return (result);
                    317: }
                    318: 
                    319: 
                    320: static struct acl_info * acl_info_cpy (aclptr)
                    321: struct acl_info * aclptr;
                    322: {
                    323: register struct acl_info * ptr;
                    324: register struct acl_info * ptr2;
                    325: register struct acl_info * result = NULLACL_INFO;
                    326: 
                    327:        if (test_acl_default(aclptr) == OK) {
                    328:                return (defaultacl);
                    329:        }
                    330: 
                    331:        for (ptr=aclptr ; ptr!=NULLACL_INFO; ptr=ptr->acl_next ) {
                    332:                ptr2 = acl_info_alloc();
                    333:                ptr2 -> acl_next = result;
                    334:                result = ptr2;
                    335:                result->acl_categories = ptr->acl_categories;
                    336:                result->acl_selector_type = ptr->acl_selector_type;
                    337:                result->acl_name = dn_seq_cpy (ptr->acl_name);
                    338:        }
                    339:        return (result);
                    340: }
                    341: 
                    342: struct acl_info * acl_default ()
                    343: {
                    344:        return (defaultacl);
                    345: }
                    346: 
                    347: get_default_acl ()
                    348: {
                    349:        defaultacl = acl_info_alloc ();
                    350:        set_default_acl(defaultacl);
                    351: }
                    352: 
                    353: set_default_acl (ai_ptr)
                    354: struct acl_info * ai_ptr;
                    355: 
                    356: {
                    357:        /* default -   others # read & self # write */
                    358: 
                    359:        ai_ptr ->acl_categories = ACL_READ;
                    360:        ai_ptr ->acl_selector_type = ACL_OTHER;
                    361:        ai_ptr ->acl_name = NULLDNSEQ;
                    362:        ai_ptr ->acl_next = acl_info_alloc();
                    363:        ai_ptr ->acl_next->acl_categories = ACL_WRITE;
                    364:        ai_ptr ->acl_next->acl_selector_type = ACL_ENTRY;
                    365:        ai_ptr ->acl_next->acl_next = NULLACL_INFO;
                    366:        ai_ptr ->acl_next->acl_name = NULLDNSEQ;
                    367: 
                    368: }
                    369: 
                    370: test_acl_default (a)
                    371: struct acl_info * a;
                    372: {
                    373:        if (a == NULLACL_INFO)
                    374:                return (OK);    /* used to NOTOK, is OK safe !!! */
                    375: 
                    376:        if (a ->acl_categories != ACL_READ) {
                    377:        
                    378:                if (a ->acl_categories != ACL_WRITE)
                    379:                        return (NOTOK);
                    380:                if (a ->acl_selector_type != ACL_ENTRY)
                    381:                        return (NOTOK);
                    382:                if (a ->acl_next == NULLACL_INFO)
                    383:                        return (NOTOK);
                    384:                if (a ->acl_next->acl_categories != ACL_READ)
                    385:                        return (NOTOK);
                    386:                if (a ->acl_next->acl_selector_type != ACL_OTHER)
                    387:                        return (NOTOK);
                    388:                if (a ->acl_next->acl_next != NULLACL_INFO)
                    389:                        return (NOTOK);
                    390:                return (OK);
                    391:                
                    392:        } if (a ->acl_selector_type != ACL_OTHER)
                    393:                return (NOTOK);
                    394:        if (a ->acl_next == NULLACL_INFO)
                    395:                return (NOTOK);
                    396:        if (a ->acl_next->acl_categories != ACL_WRITE)
                    397:                return (NOTOK);
                    398:        if (a ->acl_next->acl_selector_type != ACL_ENTRY)
                    399:                return (NOTOK);
                    400:        if (a ->acl_next->acl_next != NULLACL_INFO)
                    401:                return (NOTOK);
                    402: 
                    403:        return (OK);
                    404: }
                    405: 
                    406: static struct acl_attr * acl_attr_merge (a,b)
                    407: struct acl_attr *a;
                    408: struct acl_attr *b;
                    409: {
                    410: struct acl_attr *c;
                    411: 
                    412:        if (b == NULLACL_ATTR)
                    413:                return (a);
                    414: 
                    415:        for (c=a ; c!= NULLACL_ATTR; c=c->aa_next) {
                    416:                if (oid_seq_cmp (c->aa_types,b->aa_types) == 0) {
                    417:                        b->aa_acl->acl_next = c->aa_acl;
                    418:                        c->aa_acl = b->aa_acl;
                    419:                        return (a);
                    420:                }
                    421:        }
                    422: 
                    423:        b->aa_next = a;
                    424:        return (b);
                    425:                        
                    426:        
                    427:        
                    428: }
                    429: 
                    430: static acl_merge (a,str)
                    431: AV_Sequence a;
                    432: char * str;
                    433: {
                    434: struct acl * aclptr, aclstr;
                    435: struct acl * newacl, *str2acl_aux();
                    436: 
                    437:        bzero ((char*)&aclstr,sizeof(struct acl));
                    438: 
                    439:        if ((newacl = str2acl_aux(str,&aclstr)) == NULLACL)
                    440:                return;
                    441: 
                    442:        aclptr = (struct acl *) a->avseq_av.av_struct;
                    443: 
                    444:        if (newacl->ac_child != NULLACL_INFO) {
                    445:                newacl->ac_child->acl_next = aclptr->ac_child;
                    446:                aclptr->ac_child = newacl->ac_child;
                    447:        }
                    448:        if (newacl->ac_entry != NULLACL_INFO) {
                    449:                newacl->ac_entry->acl_next = aclptr->ac_entry;
                    450:                aclptr->ac_entry = newacl->ac_entry;
                    451:        }
                    452:        if (newacl->ac_default != NULLACL_INFO) {
                    453:                newacl->ac_default->acl_next = aclptr->ac_default;
                    454:                aclptr->ac_default = newacl->ac_default;
                    455:        }
                    456:        if (newacl->ac_attributes != NULLACL_ATTR) 
                    457:                aclptr->ac_attributes = acl_attr_merge (aclptr->ac_attributes,newacl->ac_attributes);
                    458: }
                    459: 
                    460: 
                    461: static char * acl_cat [] = {
                    462:        "none",
                    463:        "detect",
                    464:        "compare",
                    465:        "read",
                    466:        "add",
                    467:        "write"
                    468:        };
                    469: static char * acl_sel  []  = {
                    470:        "self",
                    471:        "others",
                    472:        "prefix",
                    473:        "group"
                    474:        };
                    475: 
                    476: static acl_info_comp_print (ps,aclptr,format)
                    477: register PS ps;
                    478: register struct acl_info * aclptr;
                    479: register int format;
                    480: {
                    481:        if (format == READOUT) {
                    482:           switch (aclptr->acl_selector_type) {
                    483:                case ACL_PREFIX:
                    484:                case ACL_GROUP:
                    485:                        ps_printf (ps,"%s ( ",acl_sel[aclptr->acl_selector_type]);
                    486:                        dn_seq_print  (ps,aclptr->acl_name,format);
                    487:                        ps_printf (ps," ) can %s ",acl_cat[aclptr->acl_categories]);
                    488:                        break;
                    489:                default:
                    490:                        ps_printf (ps,"%s can %s ", acl_sel[aclptr->acl_selector_type], acl_cat[aclptr->acl_categories]);
                    491:           }
                    492:        } else {
                    493:           switch (aclptr->acl_selector_type) {
                    494:                case ACL_PREFIX:
                    495:                case ACL_GROUP:
                    496:                        ps_printf (ps,"%s # ",acl_sel[aclptr->acl_selector_type]);
                    497:                        dn_seq_print  (ps,aclptr->acl_name,format);
                    498:                        ps_printf (ps," # %s ",acl_cat[aclptr->acl_categories]);
                    499:                        break;
                    500:                default:
                    501:                        ps_printf (ps,"%s # %s ", acl_sel[aclptr->acl_selector_type], acl_cat[aclptr->acl_categories]);
                    502:           }
                    503:        }
                    504: }
                    505: 
                    506: static acl_info_print (ps,aclptr,format,acl_type,oidseq)
                    507: register PS ps;
                    508: struct   acl_info * aclptr;
                    509: register int format;
                    510: char * acl_type;
                    511: struct oid_seq *oidseq;
                    512: {
                    513: register struct acl_info * ptr;
                    514: char printed = FALSE;
                    515: 
                    516:        if (test_acl_default(aclptr) == OK)
                    517:                return;
                    518: 
                    519:        for (ptr=aclptr ; ptr!=NULLACL_INFO; ptr=ptr->acl_next ) {
                    520: 
                    521:                if (printed)
                    522:                        if (format != READOUT)
                    523:                                ps_print (ps,"\nacl= ");
                    524:                        else
                    525:                                ps_print (ps,"\n\t\t\t");
                    526:                else
                    527:                        printed = TRUE;
                    528: 
                    529:                acl_info_comp_print (ps,ptr,format);
                    530: 
                    531:                if (format == READOUT) {
                    532:                        if (oidseq != NULLOIDSEQ) {
                    533:                                ps_printf (ps,"the %s: ",acl_type);
                    534:                                oid_seq_print (ps,oidseq,format) ;
                    535:                        } else
                    536:                                ps_printf (ps,"the %s",acl_type);
                    537: 
                    538:                } else {
                    539:                        ps_printf (ps,"# %s",acl_type);
                    540:                        if (oidseq != NULLOIDSEQ) {
                    541:                                ps_print (ps," # ");
                    542:                                oid_seq_print (ps,oidseq,format) ;
                    543:                        }
                    544:                }
                    545:        }
                    546: }
                    547: 
                    548: static acl_print (ps,aclptr,format)
                    549: register PS ps;
                    550: struct   acl * aclptr;
                    551: register int format;
                    552: {
                    553: char printed = FALSE;
                    554: register struct acl_attr * ptr;
                    555: 
                    556: 
                    557:        if (test_acl_default(aclptr->ac_child) != OK) {
                    558:                acl_info_print (ps,aclptr->ac_child,format, "child", NULLOIDSEQ);
                    559:                printed = TRUE;
                    560:        }
                    561: 
                    562:        if (test_acl_default(aclptr->ac_entry) != OK) {
                    563:                if (printed)
                    564:                        if (format != READOUT)
                    565:                                ps_print (ps,"\nacl= ");
                    566:                        else
                    567:                                ps_print (ps,"\n\t\t\t");
                    568:                else
                    569:                        printed = TRUE;
                    570:                acl_info_print (ps,aclptr->ac_entry,format,"entry", NULLOIDSEQ);
                    571:        }
                    572: 
                    573:        if (test_acl_default(aclptr->ac_default) != OK) {
                    574:                if (printed)
                    575:                        if (format != READOUT)
                    576:                                ps_print (ps,"\nacl= ");
                    577:                        else
                    578:                                ps_print (ps,"\n\t\t\t");
                    579:                else {
                    580:                        printed = TRUE;
                    581:                }
                    582:                acl_info_print (ps,aclptr->ac_default,format,"default", NULLOIDSEQ);
                    583:        }
                    584: 
                    585:        for (ptr=aclptr->ac_attributes ; ptr!=NULLACL_ATTR; ptr=ptr->aa_next ) {
                    586:                if (test_acl_default(ptr->aa_acl) == OK)
                    587:                        continue;
                    588: 
                    589:                if (acl_info_cmp(ptr->aa_acl,aclptr->ac_default) == 0)
                    590:                        continue;
                    591: 
                    592:                if (printed)
                    593:                        if (format != READOUT)
                    594:                                ps_print (ps,"\nacl= ");
                    595:                        else
                    596:                                ps_print (ps,"\n\t\t\t");
                    597:                else {
                    598:                        printed = TRUE;
                    599:                }
                    600:                acl_info_print (ps,ptr->aa_acl,format, "attributes", ptr->aa_types);
                    601:        }
                    602: 
                    603:        if (! printed)
                    604:             if (format == READOUT)
                    605:                ps_print (ps,"(default)");
                    606: }
                    607: 
                    608: static struct acl_info * str2acl_info (strptr)
                    609: char ** strptr;
                    610: {
                    611: char * ptr;
                    612: char * save,val;
                    613: int class,what;
                    614: struct dn_seq * dnseq = NULLDNSEQ;
                    615: 
                    616: static CMD_TABLE cmd_what [] = {
                    617:         "none",         ACL_NONE,
                    618:         "detect",       ACL_DETECT,
                    619:         "compare",      ACL_COMPARE,
                    620:         "read",         ACL_READ,
                    621:         "add",          ACL_ADD,
                    622:         "write",        ACL_WRITE,
                    623:         0,              -1
                    624:         } ;
                    625: 
                    626: static CMD_TABLE cmd_class [] = {
                    627:        "SELF",         ACL_ENTRY,
                    628:        "OTHERS",       ACL_OTHER,
                    629:        "GROUP",        ACL_GROUP,
                    630:        "PREFIX",       ACL_PREFIX,
                    631:         0,              -1,
                    632:         } ;
                    633: 
                    634:        if ((ptr = index (*strptr,'#')) == 0) {
                    635:                parse_error ("# missing in acl syntax '%s'",*strptr);
                    636:                return (NULLACL_INFO);
                    637:        }
                    638: 
                    639:        save = ptr++;
                    640:        if (**strptr == '#') {
                    641:                parse_error ("acl class missing before first '#' ",NULLCP);
                    642:                return (NULLACL_INFO);
                    643:        } else {
                    644:                if (! isspace (*--save))
                    645:                        save++;
                    646:                val = *save;
                    647:                *save = 0;
                    648: 
                    649:                if (( class = cmd_srch (*strptr,cmd_class)) == -1) {
                    650:                        parse_error ("unknown acl class '%s'",*strptr);
                    651:                        *save = val;
                    652:                        return (NULLACL_INFO);
                    653:                }
                    654:                *save = val;
                    655:        }
                    656: 
                    657:        *strptr = SkipSpace(ptr);
                    658:        if ((ptr = index (*strptr,'#')) == 0) {
                    659:                parse_error ("2nd # missing in acl syntax ",NULLCP);
                    660:                return (NULLACL_INFO);
                    661:        }
                    662: 
                    663:        if ( (class == ACL_GROUP) || (class == ACL_PREFIX) ) {  /* group or prefix */
                    664:                save = ptr++;
                    665:                if (**strptr == '#') {
                    666:                        parse_error ("acl class missing before first '#' ",NULLCP);
                    667:                        return (NULLACL_INFO);
                    668:                } else {
                    669:                        if (! isspace (*--save))
                    670:                                save++;
                    671:                        val = *save;
                    672:                        *save = 0;
                    673: 
                    674:                        if ((dnseq = str2dnseq (*strptr)) == NULLDNSEQ)
                    675:                                return (NULLACL_INFO);
                    676: 
                    677:                        *save = val;
                    678:                }
                    679:                *strptr = SkipSpace(ptr);
                    680:                if ((ptr = index (*strptr,'#')) == 0) {
                    681:                        parse_error ("3rd # missing in acl syntax ",NULLCP);
                    682:                        return (NULLACL_INFO);
                    683:                }
                    684:        }
                    685: 
                    686:        save = ptr++;
                    687:        if (**strptr == '#') {
                    688:                parse_error ("acl level missing",NULLCP);
                    689:                return (NULLACL_INFO);
                    690:        } else {
                    691:                if (! isspace (*--save))
                    692:                        save++;
                    693:                val = *save;
                    694:                *save = 0;
                    695: 
                    696:                if (( what = cmd_srch (*strptr,cmd_what)) == -1) {
                    697:                        parse_error ("unknown level '%s'",*strptr);
                    698:                        *save = val;
                    699:                        return (NULLACL_INFO);
                    700:                }
                    701:                *save = val;
                    702:        }
                    703: 
                    704:        *strptr = SkipSpace(ptr);
                    705: 
                    706:        return (acl_info_new (what,class,dnseq));
                    707: }
                    708: 
                    709: static struct acl * str2acl_aux (str,the_acl)
                    710: char * str;
                    711: struct acl * the_acl;
                    712: {
                    713: struct acl_info * info;
                    714: char * save, *ptr, val = 0;
                    715: int oidlist;
                    716: struct oid_seq * str2oidseq();
                    717: 
                    718: static CMD_TABLE cmd_who [] = {
                    719:         "child",        0,
                    720:         "entry",        1,
                    721:         "default",      2,
                    722:         0,              -1,
                    723:         };
                    724: 
                    725:        if ((info = str2acl_info (&str)) == NULLACL_INFO)
                    726:                return ( (struct acl *) NULL );
                    727: 
                    728:        /* this has left us with "string [#oidlist] [#]" */
                    729: 
                    730:        if ((ptr = index (str,'#')) != 0) {
                    731:                save = ptr++;
                    732:                if (*ptr == 0) 
                    733:                        oidlist = FALSE;
                    734:                else
                    735:                        oidlist = TRUE;
                    736: 
                    737:                if (! isspace (*--save))
                    738:                        save++;
                    739:                val = *save;
                    740:                *save = 0;
                    741: 
                    742:        } else
                    743:                oidlist = FALSE;
                    744: 
                    745:        if (oidlist) {
                    746:                struct acl_attr * at_acl;
                    747: 
                    748:                if (lexequ (str,"attributes") != 0) {
                    749:                        parse_error ("\"attributes\" expected",NULLCP);
                    750:                        if (val != 0)
                    751:                                *save = val;
                    752:                        return ( (struct acl *) NULL );
                    753:                }
                    754:                at_acl = acl_attr_alloc();
                    755:                at_acl->aa_next = NULLACL_ATTR;
                    756:                at_acl->aa_acl = info;
                    757: 
                    758:                if ((str = rindex(ptr,'#')) != NULLCP) {
                    759:                        *str-- = 0;
                    760:                        if (isspace (*str))
                    761:                                *str = 0;
                    762:                }
                    763:                
                    764:                if ((at_acl->aa_types = str2oidseq (SkipSpace(ptr))) == NULLOIDSEQ) {
                    765:                        if (val != 0)
                    766:                                *save = val;
                    767:                        return ( (struct acl *) NULL );
                    768:                }
                    769:                the_acl->ac_child = NULLACL_INFO;
                    770:                the_acl->ac_entry = NULLACL_INFO;
                    771:                the_acl->ac_default = NULLACL_INFO;
                    772:                the_acl->ac_attributes = at_acl;
                    773:                
                    774:        } else {
                    775:                int who;
                    776:                if ((who = cmd_srch (str,cmd_who)) == -1) {
                    777:                        parse_error ("unknown acl type specifier '%s'",str);
                    778:                        if (val != 0)
                    779:                                *save = val;
                    780:                        return ( (struct acl *) NULL );
                    781:                }
                    782:                the_acl->ac_child = NULLACL_INFO;
                    783:                the_acl->ac_entry = NULLACL_INFO;
                    784:                the_acl->ac_default = NULLACL_INFO;
                    785:                the_acl->ac_attributes = NULLACL_ATTR;
                    786:                switch (who) {
                    787:                case 0:
                    788:                        the_acl->ac_child = info;
                    789:                        break;
                    790:                case 1:
                    791:                        the_acl->ac_entry = info;
                    792:                        break;
                    793:                case 2:
                    794:                        the_acl->ac_default = info;
                    795:                        break;
                    796:                }
                    797:        }
                    798: 
                    799:        if (val != 0)
                    800:                *save = val;    
                    801: 
                    802:        return (the_acl);
                    803: }
                    804: 
                    805: static struct acl * str2acl (str)
                    806: char * str;
                    807: {
                    808: struct acl * the_acl;
                    809: 
                    810:        the_acl = acl_alloc ();
                    811:        if (str2acl_aux(str,the_acl) != NULLACL)
                    812:                return (the_acl);
                    813:        free ((char *)the_acl);
                    814:        return (NULLACL);
                    815: }
                    816: 
                    817: 
                    818: static PE acl_enc (acl)
                    819: struct acl * acl;
                    820: {
                    821: PE ret_pe;
                    822: 
                    823:        (void) encode_Quipu_ACLSyntax (&ret_pe,0,0,NULLCP,acl);
                    824:        return (ret_pe);
                    825: }
                    826: 
                    827: 
                    828: acl_syntax ()
                    829: {
                    830: extern short acl_sntx;
                    831: extern IFP merge_acl;
                    832: extern IFP acl_fn;
                    833: 
                    834:        acl_sntx = add_attribute_syntax ("acl",
                    835:                (IFP) acl_enc,  (IFP) acl_decode,
                    836:                (IFP) str2acl,  acl_print,
                    837:                (IFP) acl_cpy,  acl_cmp,
                    838:                acl_free,       NULLCP,
                    839:                NULLIFP,        TRUE);
                    840: 
                    841:        merge_acl = (IFP) acl_merge;
                    842:        acl_fn = (IFP) acl_default;
                    843:        get_default_acl();
                    844: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.