|
|
1.1 ! root 1: /* ds_list.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_list.c,v 7.1 90/07/09 14:45:43 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/RCS/ds_list.c,v 7.1 90/07/09 14:45:43 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ds_list.c,v $ ! 12: * Revision 7.1 90/07/09 14:45:43 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 89/11/23 22:17:09 mrose ! 16: * Release 6.0 ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: #include "quipu/util.h" ! 32: #include "quipu/connection.h" ! 33: #include "quipu/list.h" ! 34: ! 35: extern LLog * log_dsap; ! 36: extern Entry database_root; ! 37: extern int encode_DAS_ListArgumentData(); ! 38: static int build_result(); ! 39: ! 40: do_ds_list (arg, error, result, binddn, target, di_p, dsp) ! 41: register struct ds_list_arg *arg; ! 42: register struct ds_list_result *result; ! 43: struct DSError *error; ! 44: DN binddn; ! 45: DN target; ! 46: struct di_block **di_p; ! 47: char dsp; ! 48: { ! 49: Entry entryptr; ! 50: int retval; ! 51: DN realtarget; ! 52: ! 53: DLOG (log_dsap,LLOG_TRACE,("ds_list")); ! 54: ! 55: if (!dsp) ! 56: target = arg->lsa_object; ! 57: ! 58: switch(find_child_entry(target,&(arg->lsa_common),binddn,NULLDNSEQ,FALSE,&(entryptr),error,di_p)) ! 59: { ! 60: case DS_OK: ! 61: /* Filled out entryptr - carry on */ ! 62: break; ! 63: case DS_CONTINUE: ! 64: /* Filled out di_p - what do we do with it ?? */ ! 65: return(DS_CONTINUE); ! 66: ! 67: case DS_X500_ERROR: ! 68: /* Filled out error - what do we do with it ?? */ ! 69: return(DS_X500_ERROR); ! 70: default: ! 71: /* SCREAM */ ! 72: LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_ds_list() - find_child_entry failed")); ! 73: return(DS_ERROR_LOCAL); ! 74: } ! 75: ! 76: /* Strong authentication */ ! 77: if ((retval = check_security_parms((caddr_t) arg, ! 78: encode_DAS_ListArgumentData, ! 79: arg->lsa_common.ca_security, ! 80: arg->lsa_common.ca_sig, &binddn)) != 0) ! 81: { ! 82: error->dse_type = DSE_SECURITYERROR; ! 83: error->ERR_SECURITY.DSE_sc_problem = retval; ! 84: return (DS_ERROR_REMOTE); ! 85: } ! 86: ! 87: realtarget = get_copy_dn(entryptr); ! 88: ! 89: if (entryptr->e_leaf) { ! 90: if ((entryptr->e_master != NULLAV) || (entryptr->e_slave != NULLAV)) { ! 91: int res; ! 92: /* PROBLEM: Might not list everything if user is entitled to more... */ ! 93: if (try_cache (arg,result,realtarget) == OK) { ! 94: dn_free (realtarget); ! 95: return (DS_OK); ! 96: } ! 97: res = constructor_dsa_info(realtarget,NULLDNSEQ,FALSE,entryptr,error,di_p); ! 98: dn_free (realtarget); ! 99: return res; ! 100: } ! 101: ! 102: dn_free (realtarget); ! 103: ! 104: result->lsr_subordinates = NULLSUBORD; ! 105: result->lsr_age = (time_t) 0 ; ! 106: result->lsr_common.cr_requestor = NULLDN; ! 107: if ( error->dse_type == DSE_NOERROR ) { ! 108: result->lsr_object = NULLDN; ! 109: result->lsr_common.cr_aliasdereferenced = FALSE; ! 110: } else { ! 111: result->lsr_common.cr_aliasdereferenced = TRUE; ! 112: result->lsr_object = get_copy_dn (entryptr->e_parent); ! 113: } ! 114: result->lsr_cr = NULLCONTINUATIONREF; ! 115: result->lsr_limitproblem = LSR_NOLIMITPROBLEM; ! 116: return (DS_OK); ! 117: } ! 118: ! 119: /* check parent will allow listing */ ! 120: if (check_acl (dsp ? NULLDN : binddn,ACL_READ, entryptr->e_acl->ac_child, realtarget) != OK) { ! 121: if (dsp && (check_acl (binddn,ACL_READ, entryptr->e_acl->ac_child, realtarget) == OK)) { ! 122: error->dse_type = DSE_SECURITYERROR; ! 123: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION; ! 124: dn_free (realtarget); ! 125: return (DS_ERROR_REMOTE); ! 126: } ! 127: error->dse_type = DSE_SECURITYERROR; ! 128: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS; ! 129: dn_free (realtarget); ! 130: return (DS_ERROR_REMOTE); ! 131: } ! 132: ! 133: if (entryptr->e_child == NULLENTRY) { ! 134: int res; ! 135: if (try_cache (arg,result,realtarget) == OK) { ! 136: dn_free (realtarget); ! 137: return (DS_OK); ! 138: } ! 139: res = constructor_dsa_info(realtarget,NULLDNSEQ,FALSE,entryptr,error,di_p); ! 140: dn_free (realtarget); ! 141: return res; ! 142: } ! 143: ! 144: dn_free (realtarget); ! 145: ! 146: build_result (arg,entryptr->e_child,result,error,dsp ? NULLDN : binddn, dsp); ! 147: return (DS_OK); ! 148: } ! 149: ! 150: static int build_result (arg,ptr,result,error,binddn,dsp) ! 151: register Entry ptr; ! 152: struct ds_list_arg *arg; ! 153: struct ds_list_result *result; ! 154: struct DSError * error; ! 155: DN binddn; ! 156: char dsp; ! 157: { ! 158: register struct subordinate *sub; ! 159: register struct subordinate *trail = NULLSUBORD; ! 160: DN dn; ! 161: DN dnend; ! 162: RDN dnrdn; ! 163: int size; ! 164: register int cnt; ! 165: extern int admin_size; ! 166: char adminlimit = FALSE; ! 167: ! 168: DLOG (log_dsap,LLOG_DEBUG,("building list results")); ! 169: ! 170: result->lsr_subordinates = NULLSUBORD; ! 171: if (!dsp && manager (binddn)) ! 172: size = arg->lsa_common.ca_servicecontrol.svc_sizelimit; ! 173: else ! 174: if ((size = MIN(admin_size,arg->lsa_common.ca_servicecontrol.svc_sizelimit)) == SVC_NOSIZELIMIT) { ! 175: size = admin_size; ! 176: adminlimit = TRUE; ! 177: } ! 178: ! 179: result->lsr_age = (time_t) 0 ; ! 180: result->lsr_common.cr_requestor = NULLDN; ! 181: /* if no error and NOT SVC_OPT_DONTDEREFERENCEALIASES then */ ! 182: /* the alias will have been derefeferenced -signified by */ ! 183: /* NO_ERROR !!! */ ! 184: if ( error->dse_type == DSE_NOERROR ) { ! 185: result->lsr_object = NULLDN; ! 186: result->lsr_common.cr_aliasdereferenced = FALSE; ! 187: } else { ! 188: result->lsr_common.cr_aliasdereferenced = TRUE; ! 189: result->lsr_object = get_copy_dn (ptr->e_parent); ! 190: } ! 191: result->lsr_cr = NULLCONTINUATIONREF; ! 192: ! 193: dn = get_copy_dn (ptr); ! 194: for (dnend = dn; dnend->dn_parent != NULLDN; dnend=dnend->dn_parent) ! 195: ; /* NO-OP */ ! 196: dnrdn = dnend->dn_rdn; ! 197: ! 198: for (cnt =0; (ptr!=NULLENTRY) && (size == SVC_NOSIZELIMIT || cnt < size) ; ptr=ptr->e_sibling) { ! 199: dnend->dn_rdn = ptr->e_name; ! 200: if (check_acl (binddn,ACL_READ,ptr->e_acl->ac_entry,dn) == OK) { ! 201: sub = (struct subordinate *) smalloc (sizeof(struct subordinate)); ! 202: sub->sub_copy = ptr->e_data; ! 203: sub->sub_rdn = rdn_cpy(ptr->e_name); ! 204: sub->sub_aliasentry = (ptr->e_alias == NULLDN ? FALSE : TRUE); ! 205: if (trail != NULLSUBORD) ! 206: trail->sub_next = sub; ! 207: else ! 208: result->lsr_subordinates = sub; ! 209: trail = sub; ! 210: cnt++; ! 211: } ! 212: } ! 213: sub->sub_next = NULLSUBORD; ! 214: ! 215: if ( (size != SVC_NOSIZELIMIT && cnt >= size) && (ptr!=NULLENTRY) ) ! 216: /* stopped look up due to size limit */ ! 217: /* need to send continuation reference */ ! 218: result->lsr_limitproblem = adminlimit ? ! 219: LSR_ADMINSIZEEXCEEDED : LSR_SIZELIMITEXCEEDED; ! 220: else ! 221: result->lsr_limitproblem = LSR_NOLIMITPROBLEM; ! 222: ! 223: dnend->dn_rdn = NULLRDN; ! 224: dn_free (dn); ! 225: rdn_free (dnrdn); ! 226: } ! 227: ! 228: ! 229: try_cache (arg,result,target) ! 230: register struct ds_list_arg *arg; ! 231: register struct ds_list_result *result; ! 232: DN target; ! 233: { ! 234: struct list_cache *ptr; ! 235: struct subordinate * subord_cpy(); ! 236: ! 237: if ((arg->lsa_common.ca_servicecontrol.svc_options & SVC_OPT_DONTUSECOPY) == 0) { ! 238: if ((ptr = find_list_cache (target,arg->lsa_common.ca_servicecontrol.svc_sizelimit)) != NULLCACHE) { ! 239: DLOG (log_dsap,LLOG_DEBUG,("building list results using cache")); ! 240: result->lsr_subordinates = subord_cpy(ptr->list_subs); ! 241: result->lsr_age = (time_t) 0 ; ! 242: result->lsr_common.cr_aliasdereferenced = FALSE; ! 243: result->lsr_common.cr_requestor = NULLDN; ! 244: result->lsr_object = NULLDN; ! 245: result->lsr_cr = NULLCONTINUATIONREF; ! 246: result->lsr_limitproblem = ptr->list_problem; ! 247: return (OK); ! 248: } ! 249: } ! 250: ! 251: return (NOTOK); ! 252: } ! 253:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.