|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 3259 (0xcbb) Types: TextFile Names: »dl_permit.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Chans/dirlist/dl_permit.c«
/* dl_permit.c: */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl_permit.c,v 5.0 90/09/20 15:45:33 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl_permit.c,v 5.0 90/09/20 15:45:33 pp Exp Locker: pp $ * * $Log: dl_permit.c,v $ * Revision 5.0 90/09/20 15:45:33 pp * rcsforce : 5.0 public release * */ #include "dlist.h" #include "adr.h" #include "or.h" #include <isode/quipu/attrvalue.h> extern AttributeType at_Permit; extern AttributeType at_GroupMember; extern AttributeType at_Member; extern ORName *addr2orname(); static check_group (addr,dn) ADDR * addr; DN dn; { Attr_Sequence as, read_group_entry(); Attr_Sequence tmp; AV_Sequence avs; DN ad_dn; if (! addr->ad_dn) return NOTOK; if ((as = read_group_entry (dn)) == NULLATTR) return NOTOK; if ((tmp = as_find_type(as,at_GroupMember)) == NULLATTR) return NOTOK; if ((ad_dn = str2dn (addr->ad_dn)) == NULLDN) return NOTOK; for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next) if (dn_cmp (ad_dn,(DN)avs->avseq_av.av_struct) == 0) { dn_free (ad_dn); return OK; } dn_free (ad_dn); return NOTOK; } static check_individual (addr,or) ADDR * addr; ORName * or; { ORName * newor; int res; newor = addr2orname (addr); res = orName_cmp_user (or,newor); orName_free (newor); return res; } static check_member (addr,or) ADDR * addr; ORName * or; { Attr_Sequence tmp; AV_Sequence avs; Attr_Sequence as, dir_getdl_aux(); if (or->on_dn == NULLDN) return NOTOK; if ((as = dir_getdl_aux (or->on_dn)) == NULLATTR) return NOTOK; if ((tmp = as_find_type(as,at_Member)) == NULLATTR) return NOTOK; for (avs=tmp->attr_value; avs!= NULLAV; avs=avs->avseq_next) if (check_individual (addr,(ORName *)avs->avseq_av.av_struct) == OK) return OK; return NOTOK; } static or_cmp_prefix (a,b) OR_ptr a,b; { for (; (a != NULLOR) && (b != NULLOR); b = b->or_next) { if (or_cmp (a,b) == TRUE) a = a->or_next; } if (a == NULLOR) return OK; else return NOTOK; } static check_pattern (addr,or) ADDR * addr; ORName * or; { ORName * newor; newor = addr2orname (addr); if (or->on_dn) { if (!newor->on_dn) goto out; if (dn_cmp_prefix (or->on_dn,newor->on_dn) == NOTOK) goto out; } if (or->on_or) { if (!newor->on_or) goto out; if (or_cmp_prefix (or->on_or,newor->on_or) == NOTOK) goto out; } orName_free (newor); return OK; out:; orName_free (newor); return NOTOK; } check_dl_permission (addr, as) ADDR * addr; Attr_Sequence as; { Attr_Sequence tmp; AV_Sequence loop; struct dl_permit * ptr; int res; if ((tmp = as_find_type (as,at_Permit)) == NULLATTR) return NOTOK; /* Attribute is mandatory */ for (loop= tmp->attr_value;loop != NULLAV;loop = loop->avseq_next) { ptr = (struct dl_permit *)loop->avseq_av.av_struct; switch (ptr->dp_type) { case DP_GROUP: res = check_group (addr,ptr->dp_dn); break; case DP_INDIVIDUAL: res = check_individual (addr,ptr->dp_or); break; case DP_MEMBER: res = check_member (addr,ptr->dp_or); break; case DP_PATTERN: res = check_pattern (addr,ptr->dp_or); break; } if (res == OK) return OK; } return NOTOK; }