|
|
1.1 ! root 1: /* ds_modifyrdn.c - */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/quipu/RCS/ds_modifyrdn.c,v 7.1 90/07/09 14:45:47 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/quipu/RCS/ds_modifyrdn.c,v 7.1 90/07/09 14:45:47 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ds_modifyrdn.c,v $ ! 12: * Revision 7.1 90/07/09 14:45:47 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.0 89/11/23 22:17:12 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/config.h" ! 32: #include "quipu/util.h" ! 33: #include "quipu/entry.h" ! 34: #include "quipu/modifyrdn.h" ! 35: #include "quipu/malloc.h" ! 36: ! 37: extern LLog * log_dsap; ! 38: extern int encode_DAS_ModifyRDNArgumentData(); ! 39: ! 40: do_ds_modifyrdn (arg, error, binddn,target,di_p,dsp) ! 41: register struct ds_modifyrdn_arg *arg; ! 42: struct DSError *error; ! 43: DN binddn; ! 44: DN target; ! 45: struct di_block **di_p; ! 46: char dsp; ! 47: { ! 48: Entry entryptr; ! 49: register RDN rdn; ! 50: Attr_Sequence as; ! 51: AV_Sequence avs; ! 52: RDN modrdn; ! 53: char * new_version (); ! 54: int retval; ! 55: extern int read_only; ! 56: ! 57: DLOG (log_dsap,LLOG_TRACE,("ds_modifyrdn")); ! 58: ! 59: if (!dsp) ! 60: target = arg->mra_object; ! 61: ! 62: /* stop aliases being dereferenced */ ! 63: arg->mra_common.ca_servicecontrol.svc_options |= SVC_OPT_DONTDEREFERENCEALIAS; ! 64: ! 65: if (target == NULLDN) { ! 66: error->dse_type = DSE_NAMEERROR; ! 67: error->ERR_NAME.DSE_na_problem = DSE_NA_NOSUCHOBJECT; ! 68: error->ERR_NAME.DSE_na_matched = NULLDN; ! 69: return (DS_ERROR_REMOTE); ! 70: } ! 71: ! 72: switch(find_entry(target,&(arg->mra_common),binddn,NULLDNSEQ,TRUE,&(entryptr), error, di_p)) ! 73: { ! 74: case DS_OK: ! 75: /* Filled out entryptr - carry on */ ! 76: break; ! 77: case DS_CONTINUE: ! 78: /* Filled out di_p - what do we do with it ?? */ ! 79: return(DS_CONTINUE); ! 80: ! 81: case DS_X500_ERROR: ! 82: /* Filled out error - what do we do with it ?? */ ! 83: return(DS_X500_ERROR); ! 84: default: ! 85: /* SCREAM */ ! 86: LLOG(log_dsap, LLOG_EXCEPTIONS, ("do_ds_modifyrdn() - find_entry failed")); ! 87: return(DS_ERROR_LOCAL); ! 88: } ! 89: ! 90: if (read_only || entryptr->e_parent->e_lock) { ! 91: error->dse_type = DSE_SERVICEERROR; ! 92: error->ERR_SERVICE.DSE_sv_problem = DSE_SV_UNAVAILABLE; ! 93: return (DS_ERROR_REMOTE); ! 94: } ! 95: ! 96: /* Strong authentication */ ! 97: if ((retval = check_security_parms((caddr_t) arg, ! 98: encode_DAS_ModifyRDNArgumentData, ! 99: arg->mra_common.ca_security, ! 100: arg->mra_common.ca_sig, &binddn)) != 0) ! 101: { ! 102: error->dse_type = DSE_SECURITYERROR; ! 103: error->ERR_SECURITY.DSE_sc_problem = retval; ! 104: return (DS_ERROR_REMOTE); ! 105: } ! 106: ! 107: /* not prepared to accept operation over DSP */ ! 108: if (dsp) { ! 109: error->dse_type = DSE_SECURITYERROR; ! 110: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_AUTHENTICATION; ! 111: return (DS_ERROR_REMOTE); ! 112: } ! 113: ! 114: if ((check_acl (binddn,ACL_WRITE,entryptr->e_acl->ac_entry, target) == NOTOK) ! 115: || ((entryptr->e_parent->e_data != E_TYPE_CONSTRUCTOR) && (check_acl (binddn,ACL_WRITE,entryptr->e_parent->e_acl->ac_entry, target) == NOTOK)) ) { ! 116: error->dse_type = DSE_SECURITYERROR; ! 117: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS; ! 118: return (DS_ERROR_REMOTE); ! 119: } ! 120: if ( ! (entryptr->e_leaf)) { ! 121: error->dse_type = DSE_UPDATEERROR; ! 122: error->ERR_UPDATE.DSE_up_problem = DSE_UP_NOTONNONLEAF; ! 123: return (DS_ERROR_REMOTE); ! 124: } ! 125: ! 126: /* first check that it is an allowed type */ ! 127: for (rdn=arg->mra_newrdn; rdn!=NULLRDN; rdn=rdn->rdn_next) ! 128: if (check_schema_type (entryptr, rdn->rdn_at, error) == NOTOK) ! 129: return (DS_ERROR_REMOTE); ! 130: ! 131: if (arg->deleterdn) ! 132: for (rdn=entryptr->e_name; rdn!=NULLRDN; rdn=rdn->rdn_next) ! 133: if (remove_attribute (entryptr,rdn->rdn_at,error,binddn,target,entryptr) != OK) ! 134: return (DS_ERROR_REMOTE); ! 135: ! 136: ! 137: /* must now add rdn as attribute */ ! 138: for (rdn=arg->mra_newrdn; rdn!=NULLRDN; rdn=rdn->rdn_next) { ! 139: avs = avs_comp_new (AttrV_cpy(&rdn->rdn_av)); ! 140: as = as_comp_new (AttrT_cpy(rdn->rdn_at),avs, NULLACL_INFO); ! 141: if (addrdn_attribute (entryptr,as,error,binddn,target) != OK) ! 142: return (DS_ERROR_REMOTE); ! 143: ! 144: } ! 145: ! 146: #ifdef TURBO_DISK ! 147: if (turbo_delete(entryptr) != OK) ! 148: fatal (-34,"mod rdn delete failed - check database"); ! 149: #endif ! 150: ! 151: modrdn = entryptr->e_name; ! 152: DATABASE_HEAP; ! 153: entryptr->e_name = rdn_cpy(arg->mra_newrdn); ! 154: ! 155: modify_attr (entryptr,binddn); ! 156: if (unravel_attribute (entryptr,error) != OK) { ! 157: GENERAL_HEAP; ! 158: LLOG (log_dsap,LLOG_EXCEPTIONS,("modify rdn protocol error")); ! 159: rdn_free (modrdn); ! 160: return (DS_ERROR_REMOTE); ! 161: } else { ! 162: GENERAL_HEAP; ! 163: if (entryptr->e_parent != NULLENTRY) { ! 164: if (entryptr->e_parent->e_edbversion) ! 165: free (entryptr->e_parent->e_edbversion); ! 166: entryptr->e_parent->e_edbversion = new_version(); ! 167: } ! 168: ! 169: #ifdef TURBO_DISK ! 170: if (turbo_write(entryptr) != OK) ! 171: fatal (-34,"mod rdn failed - check database"); ! 172: #else ! 173: if ((journal (entryptr)) != OK) ! 174: fatal (-34,"mod rdn failed - check database"); ! 175: #endif ! 176: ! 177: rdn_free (modrdn); ! 178: return (DS_OK); ! 179: } ! 180: ! 181: } ! 182: ! 183: ! 184: addrdn_attribute (eptr,newas,error,requestor,dn) ! 185: Entry eptr; ! 186: Attr_Sequence newas; ! 187: struct DSError *error; ! 188: DN requestor,dn; ! 189: { ! 190: register Attr_Sequence as; ! 191: struct acl_info * acl; ! 192: ! 193: DLOG (log_dsap,LLOG_DEBUG,("add attribute")); ! 194: ! 195: if ( (as = as_find_type (eptr->e_attributes,newas->attr_type)) == NULLATTR) ! 196: acl = eptr->e_acl->ac_default; ! 197: else ! 198: acl = as->attr_acl; ! 199: ! 200: if (check_acl(requestor,ACL_WRITE,acl,dn) == NOTOK) { ! 201: error->dse_type = DSE_SECURITYERROR; ! 202: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS; ! 203: DLOG (log_dsap,LLOG_DEBUG,("add acl failed")); ! 204: return (NOTOK); ! 205: } ! 206: ! 207: eptr->e_attributes = as_merge (newas,eptr->e_attributes); ! 208: return (OK); ! 209: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.