- return LDAP_OTHER;
- }
- vals[0] = hash;
- vals[1].bv_val = NULL;
- ml.sml_desc = slap_schema.si_ad_userPassword;
- ml.sml_values = vals;
- ml.sml_nvalues = NULL;
- ml.sml_op = LDAP_MOD_REPLACE;
- ml.sml_next = NULL;
-
- op2 = *op;
- op2.o_tag = LDAP_REQ_MODIFY;
- op2.o_callback = &cb;
- op2.o_req_dn = dn;
- op2.o_req_ndn = ndn;
- op2.orm_modlist = &ml;
-
- modtail = &ml.sml_next;
- rs->sr_err = slap_mods_opattrs( &op2, &ml, modtail, &rs->sr_text,
- NULL, 0 );
-
- if ( rs->sr_err == LDAP_SUCCESS ) {
- rs->sr_err = op2.o_bd->be_modify( &op2, rs );
+ rs->sr_text = "unwilling to verify old password";
+ rc = LDAP_UNWILLING_TO_PERFORM;
+ goto error_return;
+ }
+
+old_good:
+ ml = ch_malloc( sizeof(Modifications) );
+ if ( !qpw->rs_modtail ) qpw->rs_modtail = &ml->sml_next;
+
+ if ( default_passwd_hash ) {
+ for ( nhash = 0; default_passwd_hash[nhash]; nhash++ );
+ hashes = default_passwd_hash;
+ } else {
+ nhash = 1;
+ hashes = (char **)defhash;
+ }
+ ml->sml_values = ch_malloc( (nhash+1)*sizeof(struct berval) );
+ for ( i=0; hashes[i]; i++ ) {
+ slap_passwd_hash_type( &qpw->rs_new, &hash, hashes[i], &rs->sr_text );
+ if ( hash.bv_len == 0 ) {
+ if ( !rs->sr_text ) {
+ rs->sr_text = "password hash failed";
+ }
+ break;
+ }
+ ml->sml_values[i] = hash;
+ }
+ ml->sml_values[i].bv_val = NULL;
+ ml->sml_nvalues = NULL;
+ ml->sml_desc = slap_schema.si_ad_userPassword;
+ ml->sml_type = ml->sml_desc->ad_cname;
+ ml->sml_op = LDAP_MOD_REPLACE;
+ ml->sml_flags = 0;
+ ml->sml_next = qpw->rs_mods;
+ qpw->rs_mods = ml;
+
+ if ( hashes[i] ) {
+ rs->sr_err = LDAP_OTHER;
+
+ } else {
+ slap_callback *sc = op->o_callback;
+
+ op->o_tag = LDAP_REQ_MODIFY;
+ op->o_callback = &cb2;
+ op->orm_modlist = qpw->rs_mods;
+ cb2.sc_private = qpw; /* let Modify know this was pwdMod,
+ * if it cares... */
+
+ rs->sr_err = op->o_bd->be_modify( op, rs );