|
|
1.1 ! root 1: /* ds_read.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_read.c,v 7.1 90/07/09 14:45:48 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/RCS/ds_read.c,v 7.1 90/07/09 14:45:48 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ds_read.c,v $ ! 12: * Revision 7.1 90/07/09 14:45:48 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 89/11/23 22:17:14 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/entry.h" ! 33: #include "quipu/read.h" ! 34: ! 35: extern LLog * log_dsap; ! 36: ! 37: extern int encode_DAS_ReadArgumentData(); ! 38: Attr_Sequence eis_select (); ! 39: static cant_use_cache(); ! 40: static attribute_not_cached (); ! 41: extern AttributeType at_control; ! 42: ! 43: do_ds_read (arg, error, result, binddn, target, di_p, dsp, quipu_ctx) ! 44: struct ds_read_arg *arg; ! 45: struct ds_read_result *result; ! 46: struct DSError *error; ! 47: DN binddn; ! 48: DN target; ! 49: struct di_block **di_p; ! 50: char dsp; ! 51: char quipu_ctx; ! 52: { ! 53: Entry entryptr; ! 54: int retval; ! 55: DN realtarget; ! 56: ! 57: DLOG (log_dsap,LLOG_TRACE,("ds_read")); ! 58: ! 59: if (!dsp) ! 60: target = arg->rda_object; ! 61: ! 62: if (!dsp && dsa_read_control(arg,result)) ! 63: return (DS_OK); ! 64: ! 65: if (target == NULLDN) { ! 66: /* can't read from the root */ ! 67: error->dse_type = DSE_NAMEERROR; ! 68: error->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT; ! 69: error->ERR_NAME.DSE_na_matched = NULLDN; ! 70: return (DS_ERROR_REMOTE); ! 71: } ! 72: ! 73: switch(find_entry(target,&(arg->rda_common),binddn,NULLDNSEQ,FALSE,&(entryptr), error, di_p)) ! 74: { ! 75: case DS_OK: ! 76: /* Filled out entryptr - carry on */ ! 77: break; ! 78: case DS_CONTINUE: ! 79: /* Filled out di_p - what do we do with it ?? */ ! 80: return(DS_CONTINUE); ! 81: ! 82: case DS_X500_ERROR: ! 83: /* Filled out error - what do we do with it ?? */ ! 84: return(DS_X500_ERROR); ! 85: default: ! 86: /* SCREAM */ ! 87: LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_ds_read() - find_entry failed")); ! 88: return(DS_ERROR_LOCAL); ! 89: } ! 90: ! 91: realtarget = get_copy_dn (entryptr); ! 92: ! 93: /* entry has got a full list of attributes, eventually ! 94: select one required */ ! 95: if (check_acl (dsp ? NULLDN : binddn,ACL_READ,entryptr->e_acl->ac_entry, realtarget) == NOTOK) { ! 96: if (dsp && (check_acl (binddn,ACL_READ,entryptr->e_acl->ac_entry, realtarget) == OK)) { ! 97: error->dse_type = DSE_SECURITYERROR; ! 98: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION; ! 99: dn_free (realtarget); ! 100: return (DS_ERROR_REMOTE); ! 101: } else { ! 102: error->dse_type = DSE_SECURITYERROR; ! 103: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS; ! 104: dn_free (realtarget); ! 105: return (DS_ERROR_REMOTE); ! 106: } ! 107: } ! 108: ! 109: /* Strong authentication */ ! 110: if ((retval = check_security_parms((caddr_t) arg, ! 111: encode_DAS_ReadArgumentData, ! 112: arg->rda_common.ca_security, ! 113: arg->rda_common.ca_sig, &binddn)) != 0) ! 114: { ! 115: error->dse_type = DSE_SECURITYERROR; ! 116: error->ERR_SECURITY.DSE_sc_problem = retval; ! 117: dn_free (realtarget); ! 118: return (DS_ERROR_REMOTE); ! 119: } ! 120: ! 121: if (cant_use_cache (entryptr,binddn,arg->rda_eis,realtarget)) { ! 122: int res = referral_dsa_info(realtarget,NULLDNSEQ,FALSE,entryptr,error,di_p, ! 123: arg->rda_common.ca_servicecontrol.svc_options & SVC_OPT_PREFERCHAIN); ! 124: dn_free (realtarget); ! 125: return res; ! 126: } ! 127: dn_free (realtarget); ! 128: ! 129: if (dsp && (eis_check (arg->rda_eis,entryptr, binddn) != OK)) { ! 130: /* Can only send public things over DSP - but user is entitled to more */ ! 131: error->dse_type = DSE_SECURITYERROR; ! 132: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION; ! 133: return (DS_ERROR_REMOTE); ! 134: } ! 135: ! 136: if ((result->rdr_entry.ent_attr = eis_select (arg->rda_eis,entryptr, dsp ? NULLDN : binddn, quipu_ctx)) == NULLATTR) ! 137: if (! arg->rda_eis.eis_allattributes) { ! 138: error->dse_type = DSE_ATTRIBUTEERROR; ! 139: error->ERR_ATTRIBUTE.DSE_at_name = get_copy_dn (entryptr); ! 140: error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_what =DSE_AT_NOSUCHATTRIBUTE; ! 141: if (arg->rda_eis.eis_select != NULLATTR) ! 142: error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = AttrT_cpy(arg->rda_eis.eis_select->attr_type); ! 143: else ! 144: error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_type = NULLAttrT; ! 145: error->ERR_ATTRIBUTE.DSE_at_plist.DSE_at_value = NULLAttrV; ! 146: error->ERR_ATTRIBUTE.DSE_at_plist.dse_at_next = DSE_AT_NOPROBLEM; ! 147: return (DS_ERROR_REMOTE); ! 148: } ! 149: ! 150: result->rdr_entry.ent_dn = get_copy_dn (entryptr); ! 151: ! 152: result->rdr_entry.ent_iscopy = entryptr->e_data; ! 153: result->rdr_entry.ent_age = (time_t) 0; ! 154: result->rdr_entry.ent_next = NULLENTRYINFO; ! 155: result->rdr_common.cr_requestor = NULLDN; ! 156: /* if no error and NOT SVC_OPT_DONTDEREFERENCEALIASES then */ ! 157: /* the alias will have been derefeferenced -signified by */ ! 158: /* NO_ERROR !!! */ ! 159: result->rdr_common.cr_aliasdereferenced = (error->dse_type == DSE_NOERROR) ? FALSE : TRUE; ! 160: return (DS_OK); ! 161: ! 162: } ! 163: ! 164: static cant_use_cache (ptr,dn,eis,target) ! 165: Entry ptr; ! 166: DN dn; ! 167: EntryInfoSelection eis; ! 168: DN target; ! 169: { ! 170: register Attr_Sequence as; ! 171: char dfltacl = FALSE; ! 172: ! 173: if (dn == NULLDN) ! 174: return FALSE; ! 175: ! 176: if ((ptr->e_data == E_DATA_MASTER) || (ptr->e_data == E_TYPE_SLAVE)) ! 177: return FALSE; ! 178: ! 179: /* see if more than cached data is required */ ! 180: ! 181: if (eis.eis_allattributes) { ! 182: struct acl_attr * aa; ! 183: struct oid_seq * oidptr; ! 184: /* look for attr acl */ ! 185: /* see if any attributes use can see */ ! 186: ! 187: if (check_acl (NULLDN,ACL_READ,ptr->e_acl->ac_default,target) == NOTOK) ! 188: if (check_acl (dn,ACL_READ,ptr->e_acl->ac_default,target) == OK) ! 189: return TRUE; ! 190: ! 191: if (ptr->e_acl->ac_attributes == NULLACL_ATTR) ! 192: return FALSE; ! 193: ! 194: for ( aa = ptr->e_acl->ac_attributes; aa!=NULLACL_ATTR; aa=aa->aa_next) ! 195: for ( oidptr=aa->aa_types;oidptr != NULLOIDSEQ; oidptr=oidptr->oid_next) ! 196: /* The attribute is in the attribute ACL list */ ! 197: /* Would a referral help the DUA ? */ ! 198: if (check_acl (NULLDN,ACL_READ,aa->aa_acl,target) == NOTOK) ! 199: if (check_acl (dn,ACL_READ,aa->aa_acl,target) == OK) ! 200: return TRUE; ! 201: ! 202: } else { ! 203: /* for each attribute in eis.eis_select, see is user ! 204: entitled to it. */ ! 205: ! 206: if (check_acl (NULLDN,ACL_READ,ptr->e_acl->ac_default,target) == NOTOK) ! 207: if (check_acl (dn,ACL_READ,ptr->e_acl->ac_default,target) == OK) ! 208: dfltacl = TRUE; ! 209: ! 210: for(as=eis.eis_select; as != NULLATTR; as=as->attr_link) { ! 211: if (as_find_type (ptr->e_attributes, as->attr_type) == NULLATTR) ! 212: if (attribute_not_cached (ptr,dn,grab_oid(as->attr_type),target,ACL_READ,dfltacl)) ! 213: return TRUE; ! 214: ! 215: } ! 216: } ! 217: return FALSE; ! 218: } ! 219: ! 220: static attribute_not_cached (ptr,dn,at,target,level,dfltacl) ! 221: Entry ptr; ! 222: DN dn; ! 223: OID at; ! 224: DN target; ! 225: int level; ! 226: char dfltacl; ! 227: { ! 228: register struct acl_attr * aa; ! 229: register struct oid_seq * oidptr; ! 230: ! 231: /* see if more than cached data is required */ ! 232: if (ptr->e_acl->ac_attributes == NULLACL_ATTR) ! 233: return (dfltacl); ! 234: ! 235: for ( aa = ptr->e_acl->ac_attributes; aa!=NULLACL_ATTR; aa=aa->aa_next) ! 236: for ( oidptr=aa->aa_types;oidptr != NULLOIDSEQ; oidptr=oidptr->oid_next) ! 237: if (oid_cmp (oidptr->oid_oid,at) == 0) { ! 238: /* The attribute is in the attribute ACL list */ ! 239: /* Would a referral help the DUA ? */ ! 240: if (check_acl (NULLDN,level,aa->aa_acl,target) == NOTOK) ! 241: if (check_acl (dn,level,aa->aa_acl,target) == OK) ! 242: return TRUE; ! 243: return FALSE; ! 244: } ! 245: return (dfltacl); ! 246: ! 247: } ! 248: ! 249: ! 250: static Attr_Sequence dsa_control_info() ! 251: { ! 252: extern int slave_edbs; ! 253: extern int master_edbs; ! 254: extern int local_master_size; ! 255: extern int local_slave_size; ! 256: extern int local_cache_size; ! 257: char buffer [LINESIZE]; ! 258: Attr_Sequence as; ! 259: ! 260: (void) sprintf (buffer,"%d Master entries (in %d EDBs), %d Slave entries (in %d EDBs), %d Cached entries", ! 261: local_master_size,master_edbs,local_slave_size,slave_edbs,local_cache_size); ! 262: ! 263: as=as_comp_alloc(); ! 264: as->attr_acl = NULLACL_INFO; ! 265: as->attr_type = at_control; ! 266: as->attr_link = NULLATTR; ! 267: if ((as->attr_value = str2avs (buffer,as->attr_type)) == NULLAV) { ! 268: as_free (as); ! 269: return (NULLATTR); ! 270: } ! 271: ! 272: return (as); ! 273: } ! 274: ! 275: dsa_read_control (arg,result) ! 276: struct ds_read_arg *arg; ! 277: struct ds_read_result *result; ! 278: { ! 279: extern DN mydsadn; ! 280: ! 281: if ((arg->rda_eis.eis_allattributes) || ! 282: (arg->rda_eis.eis_infotypes == EIS_ATTRIBUTETYPESONLY)) ! 283: return FALSE; ! 284: ! 285: if ((arg->rda_eis.eis_select == NULLATTR) ! 286: || (arg->rda_eis.eis_select->attr_link != NULLATTR)) ! 287: return FALSE; ! 288: ! 289: if (AttrT_cmp (at_control,arg->rda_eis.eis_select->attr_type) != 0) ! 290: return FALSE; ! 291: ! 292: if ((result->rdr_entry.ent_attr = dsa_control_info()) == NULLATTR) ! 293: return FALSE; ! 294: ! 295: /* Fiddle DN - for DUA caching !!! */ ! 296: result->rdr_entry.ent_dn = dn_cpy (mydsadn); ! 297: ! 298: result->rdr_entry.ent_iscopy = FALSE; ! 299: result->rdr_entry.ent_age = (time_t) 0; ! 300: result->rdr_entry.ent_next = NULLENTRYINFO; ! 301: result->rdr_common.cr_requestor = NULLDN; ! 302: result->rdr_common.cr_aliasdereferenced = FALSE; ! 303: ! 304: return TRUE; ! 305: } ! 306:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.