|
|
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: 10431 (0x28bf)
Types: TextFile
Names: »dl_x500.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_x500.c«
/* dl_x500.c: */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl_x500.c,v 5.0 90/09/20 15:45:41 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/dl_x500.c,v 5.0 90/09/20 15:45:41 pp Exp Locker: pp $
*
* $Log: dl_x500.c,v $
* Revision 5.0 90/09/20 15:45:41 pp
* rcsforce : 5.0 public release
*
*/
#include "dlist.h"
#include <isode/quipu/dua.h>
#include <isode/quipu/read.h>
#include <isode/quipu/modify.h>
#include <isode/quipu/ds_search.h>
#include <isode/quipu/connection.h> /* ds_search uses di_block - include this for lint !!! */
#include <isode/quipu/bind.h>
extern AttributeType at_Member;
extern AttributeType at_RoleOccupant;
extern AttributeType at_CommonName;
extern AttributeType at_Owner;
extern AttributeType at_Permit;
extern AttributeType at_Policy;
extern AttributeType at_ORAddress;
extern AttributeType at_RFC822;
extern AttributeType at_GroupMember;
extern AttributeType at_ObjectClass;
extern OID role_oc;
extern LLog * log_dsap;
extern Filter strfilter(), ocfilter(), joinfilter();
static Attr_Sequence mailas = NULLATTR;
static Attr_Sequence ds_cache_read (dn,as)
DN dn;
Attr_Sequence as;
{
struct ds_read_arg read_arg;
struct ds_read_result result;
struct DSError error;
static CommonArgs ca = default_common_args;
Entry ptr;
if ((ptr = local_find_entry (dn,TRUE)) != NULLENTRY) {
if (ptr->e_complete)
return (ptr->e_attributes);
if (as != NULLATTR) {
Attr_Sequence tmp;
for (tmp = as; tmp!= NULLATTR; tmp = tmp->attr_link)
#if ISODE >= 65
if (as_find_type(ptr->e_attributes,tmp->attr_type) == NULLATTR)
#else
if (as_find_type(ptr->e_attributes,&tmp->attr_type) == NULLATTR)
#endif
goto do_read;
return (ptr->e_attributes);
}
}
do_read:;
read_arg.rda_common = ca; /* struct copy */
read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
read_arg.rda_eis.eis_allattributes = FALSE;
read_arg.rda_eis.eis_select = as;
read_arg.rda_object = dn;
if (ds_read (&read_arg, &error, &result) != DS_OK) {
log_ds_error (&error);
ds_error_free (&error);
return NULLATTR;
}
#if ISODE < 65
(void) as_decode (result.rdr_entry.ent_attr);
#endif
result.rdr_entry.ent_attr = as_merge (result.rdr_entry.ent_attr,as_cpy(as));
cache_entry (&result.rdr_entry,FALSE,TRUE);
return (result.rdr_entry.ent_attr);
}
Attr_Sequence dn2addr (dn)
DN dn;
{
Attr_Sequence tmp, found;
if (mailas == NULLATTR) {
Attr_Sequence as;
mailas = as_comp_new (at_ORAddress, NULLAV, NULLACL_INFO);
as = as_comp_new (at_RFC822, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
as = as_comp_new (at_ObjectClass, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
as = as_comp_new (at_RoleOccupant, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
}
tmp = ds_cache_read (dn,mailas);
/* Have we got an address ? */
if ((found = as_find_type (tmp,at_ORAddress)) != NULLATTR)
return tmp;
if ((found = as_find_type (tmp,at_RFC822)) == NULLATTR)
return tmp;
/* NO address, is it a role ? */
if ((found = as_find_type (tmp,at_ObjectClass)) == NULLATTR)
return NULLATTR;
if (check_in_oc(role_oc,found->attr_value)) {
/* Its a role :- follow member... */
if ((found = as_find_type (tmp,at_RoleOccupant)) == NULLATTR)
return NULLATTR;
tmp = dn2addr ((DN)&found->attr_value->avseq_av);
}
return tmp;
}
Attr_Sequence dir_getdl_aux (dn)
DN dn;
{
static Attr_Sequence astop = NULLATTR;
Attr_Sequence res;
if (astop == NULLATTR) {
Attr_Sequence as;
astop = as_comp_new (at_Member, NULLAV, NULLACL_INFO);
as = as_comp_new (at_Owner, NULLAV, NULLACL_INFO);
astop = as_merge (astop,as);
as = as_comp_new (at_Permit, NULLAV, NULLACL_INFO);
astop = as_merge (astop,as);
as = as_comp_new (at_Policy, NULLAV, NULLACL_INFO);
astop = as_merge (astop,as);
/*
as = as_comp_new (acl_at, NULLAV, NULLACL_INFO);
astop = as_merge (astop,as);
*/
}
res = ds_cache_read (dn,astop);
return res;
}
Attr_Sequence dir_getdl (list)
char * list;
{
DN dn;
Attr_Sequence as;
if ((dn = str2dn(list)) == NULLDN)
return NULLATTR;
as = dir_getdl_aux (dn);
dn_free (dn);
return as;
}
Attr_Sequence read_group_entry (dn)
DN dn;
{
static Attr_Sequence astop = NULLATTR;
if (astop == NULLATTR)
astop = as_comp_new (at_GroupMember, NULLAV, NULLACL_INFO);
return (ds_cache_read (dn,astop));
}
or_modify (ps,old,newname,at,dn)
PS ps;
ORName * old;
OR_ptr newname;
AttributeType at;
DN dn;
{
struct ds_modifyentry_arg mod_arg;
struct DSError error;
static CommonArgs ca = default_common_args;
struct entrymod *emnew;
AttributeValue av;
AV_Sequence avs;
ORName * newor;
ORName * orName_cpy();
OR_ptr or_cpy();
mod_arg.mea_common = ca;
mod_arg.mea_object = dn;
emnew = em_alloc ();
emnew->em_type = EM_ADDVALUES;
av = AttrV_alloc();
av->av_syntax = str2syntax("ORName");
newor = orName_cpy (old);
if (newor->on_or != NULLOR)
or_free (newor->on_or);
newor->on_or = or_cpy(newname);
av->av_struct = (caddr_t) newor;
avs = avs_comp_new(av);
emnew->em_what = as_comp_new (AttrT_cpy(at),avs,NULLACL_INFO);
mod_arg.mea_changes = emnew;
emnew = em_alloc ();
emnew->em_type = EM_REMOVEVALUES;
av = AttrV_alloc();
av->av_syntax = str2syntax("ORName");
av->av_struct = (caddr_t) orName_cpy(old);
avs = avs_comp_new(av);
emnew->em_what = as_comp_new (AttrT_cpy(at),avs,NULLACL_INFO);
emnew->em_next = NULLMOD;
mod_arg.mea_changes->em_next = emnew;
if (ds_modifyentry (&mod_arg, &error) != DS_OK) {
ds_error (ps, &error);
return FALSE;
}
delete_cache (old->on_dn);
ems_free (mod_arg.mea_changes);
return TRUE;
}
dl_modify (ps,name,dn,delete)
PS ps;
ORName * name;
DN dn;
char delete;
{
struct ds_modifyentry_arg mod_arg;
struct DSError error;
static CommonArgs ca = default_common_args;
struct entrymod *emnew;
AttributeValue av;
AV_Sequence avs;
mod_arg.mea_common = ca;
mod_arg.mea_object = dn;
emnew = em_alloc ();
if (delete)
emnew->em_type = EM_REMOVEVALUES;
else
emnew->em_type = EM_ADDVALUES;
av = AttrV_alloc();
av->av_syntax = str2syntax("ORName");
av->av_struct = (caddr_t) name;
avs = avs_comp_new(av);
emnew->em_what = as_comp_new (AttrT_cpy(at_Member),avs,NULLACL_INFO);
emnew->em_next = NULLMOD;
mod_arg.mea_changes = emnew;
if (ds_modifyentry (&mod_arg, &error) != DS_OK) {
ds_error (ps, &error);
return FALSE;
}
delete_cache (dn);
ems_free (mod_arg.mea_changes);
return TRUE;
}
dl_bind (name,passwd)
DN name;
char * passwd;
{
struct ds_bind_arg bindarg;
struct ds_bind_arg bindresult;
struct ds_bind_error binderr;
bindarg.dba_version = DBA_VERSION_V1988;
if ((bindarg.dba_dn = name) == NULLDN) {
bindarg.dba_passwd_len = 0;
bindarg.dba_passwd [0] = '\0';
} else {
bindarg.dba_passwd_len = strlen (passwd);
(void) strcpy (bindarg.dba_passwd,passwd);
}
if (ds_bind (&bindarg,&binderr,&bindresult) != DS_OK)
return NOTOK;
else
return OK;
}
dl_unbind ()
{
(void) ds_unbind ();
}
DN str2dl (str,localdn)
char * str;
DN localdn;
{
extern int print_parse_errors;
DN res;
int old;
struct ds_search_arg search_arg;
static struct ds_search_result result;
struct DSError err;
static CommonArgs ca = default_common_args;
Filter filtcn, filtoc, filtand;
old = print_parse_errors;
print_parse_errors = FALSE;
res = str2dn (str);
print_parse_errors = old;
if (res != NULLDN)
return res;
filtcn = strfilter (at_CommonName,str,FILTERITEM_EQUALITY);
if ((filtoc = ocfilter ("ppDistributionList")) == NULLFILTER)
return NULLDN;
filtoc->flt_next = filtcn;
filtand = joinfilter (filtoc,FILTER_AND);
search_arg.sra_baseobject = localdn;
search_arg.sra_filter = filtand;
search_arg.sra_subset = SRA_ONELEVEL;
search_arg.sra_searchaliases = FALSE;
search_arg.sra_common = ca; /* struct copy */
search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
search_arg.sra_eis.eis_allattributes = FALSE;
search_arg.sra_eis.eis_select = NULLATTR;
if (ds_search (&search_arg, &err, &result) != DS_OK) {
filter_free (filtoc);
log_ds_error (&err);
ds_error_free (&err);
return NULLDN;
}
filter_free (filtoc);
if (result.CSR_entries) {
#if ISODE < 65
(void) dn_decode (result.CSR_entries->ent_dn);
#endif
return (result.CSR_entries->ent_dn);
}
return NULLDN;
}
DN search_postmaster (localdn)
DN localdn;
{
struct ds_search_arg search_arg;
static struct ds_search_result result;
struct DSError err;
static CommonArgs ca = default_common_args;
Filter filtcn;
if (mailas == NULLATTR) {
Attr_Sequence as;
mailas = as_comp_new (at_ORAddress, NULLAV, NULLACL_INFO);
as = as_comp_new (at_RFC822, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
as = as_comp_new (at_ObjectClass, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
as = as_comp_new (at_RoleOccupant, NULLAV, NULLACL_INFO);
mailas = as_merge (mailas,as);
}
filtcn = strfilter (at_CommonName,"PostMaster",FILTERITEM_EQUALITY);
search_arg.sra_baseobject = localdn;
search_arg.sra_filter = filtcn;
search_arg.sra_subset = SRA_ONELEVEL;
search_arg.sra_searchaliases = TRUE;
search_arg.sra_common = ca; /* struct copy */
search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
search_arg.sra_eis.eis_allattributes = FALSE;
search_arg.sra_eis.eis_select = mailas;
if (ds_search (&search_arg, &err, &result) != DS_OK) {
filter_free (filtcn);
log_ds_error (&err);
ds_error_free (&err);
return NULLDN;
}
filter_free (filtcn);
if (result.CSR_entries) {
cache_entry (result.CSR_entries,FALSE,TRUE);
return (result.CSR_entries->ent_dn);
}
return NULLDN;
}
dl_showentry(ps,dn)
PS ps;
DN dn;
{
struct ds_read_arg read_arg;
struct ds_read_result result;
struct DSError error;
static CommonArgs ca = default_common_args;
Entry ptr;
if ((ptr = local_find_entry (dn,TRUE)) != NULLENTRY)
if (ptr->e_complete) {
as_print (ps,ptr->e_attributes,READOUT);
return;
}
read_arg.rda_common = ca; /* struct copy */
read_arg.rda_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
read_arg.rda_eis.eis_allattributes = TRUE;
read_arg.rda_eis.eis_select = NULLATTR;
read_arg.rda_object = dn;
if (ds_read (&read_arg, &error, &result) != DS_OK)
ds_error(ps,&error);
#if ISODE < 65
(void) as_decode (result.rdr_entry.ent_attr);
#endif
cache_entry (&result.rdr_entry,FALSE,TRUE);
as_print (ps,result.rdr_entry.ent_attr,READOUT);
}