|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.