int VmDirPerformRename( PVDIR_OPERATION pOperation ) { ModifyReq * modReq = &(pOperation->request.modifyReq); int retVal = LDAP_SUCCESS; PVDIR_LDAP_RESULT pResult = &(pOperation->ldapResult); ber_len_t size = 0; PSTR pszLocalErrorMsg = NULL; if (!_VmDirIsRenameSupported()) { pResult->errCode = retVal = LDAP_UNWILLING_TO_PERFORM; BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, pszLocalErrorMsg, "Operation is not enabled on this server or is not supported at this domain fuctional level."); } // Get entry DN. 'm' => reqDn.bv_val points to DN within (in-place) ber if ( ber_scanf( pOperation->ber, "{mmb", &modReq->dn, &modReq->newrdn, &modReq->bDeleteOldRdn) == LBER_ERROR ) { VMDIR_LOG_ERROR( LDAP_DEBUG_ARGS, "VmDirPerformRename: ber_scanf failed" ); pResult->errCode = LDAP_PROTOCOL_ERROR; retVal = LDAP_NOTICE_OF_DISCONNECT; BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "Decoding error while parsing the target DN"); } if (ber_peek_tag(pOperation->ber, &size) == LDAP_TAG_NEWSUPERIOR) { if ( ber_scanf(pOperation->ber, "m", &modReq->newSuperior ) == LBER_ERROR ) { pResult->errCode = LDAP_PROTOCOL_ERROR; retVal = LDAP_NOTICE_OF_DISCONNECT; BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "Decoding error while parsing newSuperior"); } } if ( ber_scanf( pOperation->ber, "}") == LBER_ERROR ) { VMDIR_LOG_ERROR( LDAP_DEBUG_ARGS, "PerformRename: ber_scanf failed" ); pResult->errCode = LDAP_PROTOCOL_ERROR; retVal = LDAP_NOTICE_OF_DISCONNECT; BAIL_ON_VMDIR_ERROR_WITH_MSG( retVal, (pszLocalErrorMsg), "Decoding error while parsing the end of message."); } retVal = pResult->errCode = VmDirMLModify( pOperation ); BAIL_ON_VMDIR_ERROR(retVal); cleanup: if (retVal != LDAP_NOTICE_OF_DISCONNECT) { VmDirSendLdapResult( pOperation ); } VMDIR_SAFE_FREE_MEMORY(pszLocalErrorMsg); return retVal; error: VMDIR_APPEND_ERROR_MSG(pResult->pszErrMsg, pszLocalErrorMsg); goto cleanup; }
DWORD VmDirRESTObjectPatch( void* pIn, void** ppOut ) { DWORD dwError = 0; PSTR pszTenant = NULL; PSTR pszDN = NULL; PVDIR_REST_OPERATION pRestOp = NULL; PVDIR_OPERATION pModifyOp = NULL; if (!pIn) { dwError = VMDIR_ERROR_INVALID_PARAMETER; BAIL_ON_VMDIR_ERROR(dwError); } pRestOp = (PVDIR_REST_OPERATION)pIn; dwError = VmDirExternalOperationCreate( NULL, -1, LDAP_REQ_MODIFY, pRestOp->pConn, &pModifyOp); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirRESTGetObjectTenantParam(pRestOp, &pszTenant); BAIL_ON_VMDIR_ERROR(dwError) dwError = VmDirRESTDecodeObjectPathToDN( pRestOp->pszSubPath, pszTenant, &pszDN); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirStringToBervalContent(pszDN, &pModifyOp->reqDn); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirStringToBervalContent(pszDN, &pModifyOp->request.modifyReq.dn); BAIL_ON_VMDIR_ERROR(dwError); dwError = VmDirRESTDecodeObjectMods( pRestOp->pjInput, pszTenant, &pModifyOp->request.modifyReq.mods, &pModifyOp->request.modifyReq.numMods); BAIL_ON_VMDIR_ERROR(dwError); if (pRestOp->pszHeaderIfMatch) { dwError = _VmDirRESTCreateCondWriteCtrl( pModifyOp, pszTenant, pRestOp->pszHeaderIfMatch); BAIL_ON_VMDIR_ERROR(dwError); } dwError = VmDirMLModify(pModifyOp); BAIL_ON_VMDIR_ERROR(dwError); cleanup: VMDIR_SET_REST_RESULT(pRestOp, pModifyOp, dwError, NULL); VMDIR_SAFE_FREE_MEMORY(pszTenant); VMDIR_SAFE_FREE_MEMORY(pszDN); VmDirFreeOperation(pModifyOp); return dwError; error: VMDIR_LOG_ERROR( VMDIR_LOG_MASK_ALL, "%s failed, error (%d)", __FUNCTION__, dwError); goto cleanup; }