|
|
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: 6800 (0x1a90)
Types: TextFile
Names: »ds_list.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/quipu/ds_list.c«
/* ds_list.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_list.c,v 7.0 89/11/23 22:17:09 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/ds_list.c,v 7.0 89/11/23 22:17:09 mrose Rel $
*
*
* $Log: ds_list.c,v $
* Revision 7.0 89/11/23 22:17:09 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
* this agreement.
*
*/
#include "quipu/util.h"
#include "quipu/connection.h"
#include "quipu/list.h"
extern LLog * log_dsap;
extern Entry database_root;
extern int encode_DAS_ListArgumentData();
static int build_result();
do_ds_list (arg, error, result, binddn, target, di_p, dsp)
register struct ds_list_arg *arg;
register struct ds_list_result *result;
struct DSError *error;
DN binddn;
DN target;
struct di_block **di_p;
char dsp;
{
Entry entryptr;
int retval;
DLOG (log_dsap,LLOG_TRACE,("ds_list"));
if (!dsp)
target = arg->lsa_object;
(void) dn_decode (target);
switch(find_child_entry(target,&(arg->lsa_common),binddn,NULLDNSEQ,FALSE,&(entryptr),error,di_p))
{
case DS_OK:
/* Filled out entryptr - carry on */
break;
case DS_CONTINUE:
/* Filled out di_p - what do we do with it ?? */
return(DS_CONTINUE);
case DS_X500_ERROR:
/* Filled out error - what do we do with it ?? */
return(DS_X500_ERROR);
default:
/* SCREAM */
LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_ds_list() - find_child_entry failed"));
return(DS_ERROR_LOCAL);
}
/* Strong authentication */
if ((retval = check_security_parms((caddr_t) arg,
encode_DAS_ListArgumentData,
arg->lsa_common.ca_security,
arg->lsa_common.ca_sig, &binddn)) != 0)
{
error->dse_type = DSE_SECURITYERROR;
error->ERR_SECURITY.DSE_sc_problem = retval;
return (DS_ERROR_REMOTE);
}
if (entryptr->e_leaf) {
if ((entryptr->e_master != NULLAV) || (entryptr->e_slave != NULLAV)) {
/* PROBLEM: Might not list everything if user is entitled to more... */
if (try_cache (arg,result,target) == OK)
return (DS_OK);
return (constructor_dsa_info(target,NULLDNSEQ,FALSE,entryptr,error,di_p));
}
result->lsr_subordinates = NULLSUBORD;
result->lsr_age = (time_t) 0 ;
result->lsr_common.cr_requestor = NULLDN;
if ( error->dse_type == DSE_NOERROR ) {
result->lsr_object = NULLDN;
result->lsr_common.cr_aliasdereferenced = FALSE;
} else {
result->lsr_common.cr_aliasdereferenced = TRUE;
result->lsr_object = get_copy_dn (entryptr->e_parent);
}
result->lsr_cr = NULLCONTINUATIONREF;
result->lsr_limitproblem = LSR_NOLIMITPROBLEM;
return (DS_OK);
}
/* check parent will allow listing */
if (check_acl (dsp ? NULLDN : binddn,ACL_READ, entryptr->e_acl->ac_child, target) != OK) {
if (dsp && (check_acl (binddn,ACL_READ, entryptr->e_acl->ac_child, target) == OK)) {
error->dse_type = DSE_SECURITYERROR;
error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION;
return (DS_ERROR_REMOTE);
}
error->dse_type = DSE_SECURITYERROR;
error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
return (DS_ERROR_REMOTE);
}
if (entryptr->e_child == NULLENTRY) {
if (try_cache (arg,result,target) == OK)
return (DS_OK);
return (constructor_dsa_info(target,NULLDNSEQ,FALSE,entryptr,error,di_p));
}
build_result (arg,entryptr->e_child,result,error,dsp ? NULLDN : binddn, dsp);
return (DS_OK);
}
static int build_result (arg,ptr,result,error,binddn,dsp)
register Entry ptr;
struct ds_list_arg *arg;
struct ds_list_result *result;
struct DSError * error;
DN binddn;
char dsp;
{
register struct subordinate *sub;
register struct subordinate *trail = NULLSUBORD;
DN dn;
DN dnend;
RDN dnrdn;
int size;
register int cnt;
extern int admin_size;
char adminlimit = FALSE;
DLOG (log_dsap,LLOG_DEBUG,("building list results"));
result->lsr_subordinates = NULLSUBORD;
if (!dsp && manager (binddn))
size = arg->lsa_common.ca_servicecontrol.svc_sizelimit;
else
if ((size = MIN(admin_size,arg->lsa_common.ca_servicecontrol.svc_sizelimit)) == SVC_NOSIZELIMIT) {
size = admin_size;
adminlimit = TRUE;
}
result->lsr_age = (time_t) 0 ;
result->lsr_common.cr_requestor = NULLDN;
/* if no error and NOT SVC_OPT_DONTDEREFERENCEALIASES then */
/* the alias will have been derefeferenced -signified by */
/* NO_ERROR !!! */
if ( error->dse_type == DSE_NOERROR ) {
result->lsr_object = NULLDN;
result->lsr_common.cr_aliasdereferenced = FALSE;
} else {
result->lsr_common.cr_aliasdereferenced = TRUE;
result->lsr_object = get_copy_dn (ptr->e_parent);
}
result->lsr_cr = NULLCONTINUATIONREF;
dn = get_copy_dn (ptr);
for (dnend = dn; dnend->dn_parent != NULLDN; dnend=dnend->dn_parent)
; /* NO-OP */
dnrdn = dnend->dn_rdn;
for (cnt =0; (ptr!=NULLENTRY) && (size == SVC_NOSIZELIMIT || cnt < size) ; ptr=ptr->e_sibling) {
dnend->dn_rdn = ptr->e_name;
if (check_acl (binddn,ACL_READ,ptr->e_acl->ac_entry,dn) == OK) {
sub = (struct subordinate *) smalloc (sizeof(struct subordinate));
sub->sub_copy = ptr->e_data;
sub->sub_rdn = rdn_cpy(ptr->e_name);
sub->sub_aliasentry = (ptr->e_alias == NULLDN ? FALSE : TRUE);
if (trail != NULLSUBORD)
trail->sub_next = sub;
else
result->lsr_subordinates = sub;
trail = sub;
cnt++;
}
}
sub->sub_next = NULLSUBORD;
if ( (size != SVC_NOSIZELIMIT && cnt >= size) && (ptr!=NULLENTRY) )
/* stopped look up due to size limit */
/* need to send continuation reference */
result->lsr_limitproblem = adminlimit ?
LSR_ADMINSIZEEXCEEDED : LSR_SIZELIMITEXCEEDED;
else
result->lsr_limitproblem = LSR_NOLIMITPROBLEM;
dnend->dn_rdn = NULLRDN;
dn_free (dn);
rdn_free (dnrdn);
}
try_cache (arg,result,target)
register struct ds_list_arg *arg;
register struct ds_list_result *result;
DN target;
{
struct list_cache *ptr;
struct subordinate * subord_cpy();
if ((arg->lsa_common.ca_servicecontrol.svc_options & SVC_OPT_DONTUSECOPY) == 0) {
if ((ptr = find_list_cache (target,arg->lsa_common.ca_servicecontrol.svc_sizelimit)) != NULLCACHE) {
DLOG (log_dsap,LLOG_DEBUG,("building list results using cache"));
result->lsr_subordinates = subord_cpy(ptr->list_subs);
result->lsr_age = (time_t) 0 ;
result->lsr_common.cr_aliasdereferenced = FALSE;
result->lsr_common.cr_requestor = NULLDN;
result->lsr_object = NULLDN;
result->lsr_cr = NULLCONTINUATIONREF;
result->lsr_limitproblem = ptr->list_problem;
return (OK);
}
}
return (NOTOK);
}