DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T d

⟦edb0f6527⟧ TextFile

    Length: 3259 (0xcbb)
    Types: TextFile
    Names: »dl_permit.c«

Derivation

└─⟦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« 

TextFile

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