|
|
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;
}