]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/passwd.c
remove a componentCertificate attribute from the organizationalPerson objectclass
[openldap] / servers / slapd / passwd.c
index 2faa368c3c04de7f0344f97ffd03a4b7dc658c31..d848e7a6cc2e4f7491bea1daf914d253899cc744 100644 (file)
@@ -49,6 +49,7 @@ int passwd_extop(
        slap_callback cb2 = { NULL, slap_replog_cb, NULL, NULL };
        int i, nhash;
        char **hashes;
+       int     rc;
 
        cb2.sc_next = &cb;
 
@@ -72,17 +73,19 @@ int passwd_extop(
        }
 
        if ( id.bv_len ) {
-               op->o_req_dn = id;
+               ber_dupbv_x( &op->o_req_dn, &id, op->o_tmpmemctx );
                /* ndn is in tmpmem, so we don't need to free it */
                rs->sr_err = dnNormalize( 0, NULL, NULL, &id, &op->o_req_ndn, op->o_tmpmemctx );
                if ( rs->sr_err != LDAP_SUCCESS ) {
                        rs->sr_text = "Invalid DN";
-                       return rs->sr_err;
+                       rc = rs->sr_err;
+                       goto error_return;
                }
                op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );
+
        } else {
-               op->o_req_dn = op->o_dn;
-               op->o_req_ndn = op->o_ndn;
+               ber_dupbv_x( &op->o_req_dn, &op->o_dn, op->o_tmpmemctx );
+               ber_dupbv_x( &op->o_req_ndn, &op->o_ndn, op->o_tmpmemctx );
                ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
                op->o_bd = op->o_conn->c_authz_backend;
                ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
@@ -90,42 +93,50 @@ int passwd_extop(
 
        if( op->o_bd == NULL ) {
 #ifdef HAVE_CYRUS_SASL
-               return slap_sasl_setpass( op, rs );
+               rc = slap_sasl_setpass( op, rs );
 #else
                rs->sr_text = "no authz backend";
-               return LDAP_OTHER;
+               rc = LDAP_OTHER;
 #endif
+               goto error_return;
        }
 
        if ( op->o_req_ndn.bv_len == 0 ) {
                rs->sr_text = "no password is associated with the Root DSE";
-               return LDAP_UNWILLING_TO_PERFORM;
+               rc = LDAP_UNWILLING_TO_PERFORM;
+               goto error_return;
        }
 
        if (backend_check_restrictions( op, rs,
                        (struct berval *)&slap_EXOP_MODIFY_PASSWD ) != LDAP_SUCCESS) {
-               return rs->sr_err;
+               rc = rs->sr_err;
+               goto error_return;
        }
 
 
 #ifndef SLAPD_MULTIMASTER
        /* This does not apply to multi-master case */
-       if( op->o_bd->be_update_ndn.bv_len ) {
+       if(!( !SLAP_SHADOW( op->o_bd ) || be_isupdate( op ))) {
                /* we SHOULD return a referral in this case */
-               BerVarray defref = NULL;
-               if ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
-                       syncinfo_t *si;
-                       LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) {
-                               struct berval tmpbv;
-                               ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] );
-                               ber_bvarray_add( &defref, &tmpbv );
-                       }
-               } else {
-                       defref = referral_rewrite( op->o_bd->be_update_refs,
+               BerVarray defref = op->o_bd->be_update_refs
+                       ? op->o_bd->be_update_refs : default_referral; 
+
+               if( defref != NULL ) {
+                       rs->sr_ref = referral_rewrite( op->o_bd->be_update_refs,
                                NULL, NULL, LDAP_SCOPE_DEFAULT );
+                       if(rs->sr_ref) {
+                               rs->sr_flags |= REP_REF_MUSTBEFREED;
+                       } else {
+                               rs->sr_ref = defref;
+                       }
+                       rc = LDAP_REFERRAL;
+                       goto error_return;
+
                }
-               rs->sr_ref = defref;
-               return LDAP_REFERRAL;
+
+               rs->sr_text = "shadow context; no update referral";
+               rc = LDAP_UNWILLING_TO_PERFORM;
+               goto error_return;
        }
 #endif /* !SLAPD_MULTIMASTER */
 
@@ -138,7 +149,8 @@ int passwd_extop(
        }
        if ( qpw->rs_new.bv_len == 0 ) {
                rs->sr_text = "password generation failed";
-               return LDAP_OTHER;
+               rc = LDAP_OTHER;
+               goto error_return;
        }
 
        /* Give the backend a chance to handle this itself */
@@ -146,14 +158,16 @@ int passwd_extop(
                rs->sr_err = op->o_bd->be_extended( op, rs );
                if ( rs->sr_err != LDAP_UNWILLING_TO_PERFORM &&
                        rs->sr_err != SLAP_CB_CONTINUE ) {
-                       return rs->sr_err;
+                       rc = rs->sr_err;
+                       goto error_return;
                }
        }
 
        /* The backend didn't handle it, so try it here */
        if( op->o_bd && !op->o_bd->be_modify ) {
                rs->sr_text = "operation not supported for current user";
-               return LDAP_UNWILLING_TO_PERFORM;
+               rc = LDAP_UNWILLING_TO_PERFORM;
+               goto error_return;
        }
 
        ml = ch_malloc( sizeof(Modifications) );
@@ -180,14 +194,14 @@ int passwd_extop(
        ml->sml_values[i].bv_val = NULL;
        ml->sml_nvalues = NULL;
        ml->sml_desc = slap_schema.si_ad_userPassword;
-       ml->sml_op = qpw->rs_old.bv_val ? LDAP_MOD_ADD : LDAP_MOD_REPLACE;
+       ml->sml_op = LDAP_MOD_REPLACE;
        ml->sml_next = qpw->rs_mods;
        qpw->rs_mods = ml;
 
        if ( hashes[i] ) {
                rs->sr_err = LDAP_OTHER;
-       } else {
 
+       } else {
                op2 = *op;
                op2.o_tag = LDAP_REQ_MODIFY;
                op2.o_callback = &cb2;
@@ -196,10 +210,13 @@ int passwd_extop(
                                         * if it cares... */
 
                rs->sr_err = slap_mods_opattrs( &op2, ml, qpw->rs_modtail, &rs->sr_text,
-                       NULL, 0 );
+                       NULL, 0, 1 );
                
                if ( rs->sr_err == LDAP_SUCCESS ) {
                        rs->sr_err = op2.o_bd->be_modify( &op2, rs );
+                       /* FIXME: in case it got rewritten... */
+                       op->o_req_dn = op2.o_req_dn;
+                       op->o_req_ndn = op2.o_req_ndn;
                }
                if ( rs->sr_err == LDAP_SUCCESS ) {
                        rs->sr_rspdata = rsp;
@@ -212,7 +229,17 @@ int passwd_extop(
                free( qpw->rs_new.bv_val );
        }
 
-       return rs->sr_err;
+       rc = rs->sr_err;
+
+error_return:;
+       if ( !BER_BVISNULL( &op->o_req_dn ) ) {
+               op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
+       }
+       if ( !BER_BVISNULL( &op->o_req_ndn ) ) {
+               op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
+       }
+
+       return rc;
 }
 
 int slap_passwd_parse( struct berval *reqdata,
@@ -242,13 +269,8 @@ int slap_passwd_parse( struct berval *reqdata,
        tag = ber_scanf( ber, "{" /*}*/ );
 
        if( tag == LBER_ERROR ) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( OPERATION, ERR, 
-                       "slap_passwd_parse: decoding error\n", 0, 0, 0 );
-#else
                Debug( LDAP_DEBUG_TRACE,
                        "slap_passwd_parse: decoding error\n", 0, 0, 0 );
-#endif
                rc = LDAP_PROTOCOL_ERROR;
                goto done;
        }
@@ -256,13 +278,8 @@ int slap_passwd_parse( struct berval *reqdata,
        tag = ber_peek_tag( ber, &len );
        if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_ID ) {
                if( id == NULL ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse: ID not allowed.\n", 0, 0, 0 );
-#else
                        Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: ID not allowed.\n",
                                0, 0, 0 );
-#endif
 
                        *text = "user must change own password";
                        rc = LDAP_UNWILLING_TO_PERFORM;
@@ -272,13 +289,8 @@ int slap_passwd_parse( struct berval *reqdata,
                tag = ber_scanf( ber, "m", id );
 
                if( tag == LBER_ERROR ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse:  ID parse failed.\n", 0, 0, 0 );
-#else
                        Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: ID parse failed.\n",
                                0, 0, 0 );
-#endif
 
                        goto decoding_error;
                }
@@ -288,13 +300,8 @@ int slap_passwd_parse( struct berval *reqdata,
 
        if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_OLD ) {
                if( oldpass == NULL ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse: OLD not allowed.\n" , 0, 0, 0 );
-#else
                        Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: OLD not allowed.\n",
                                0, 0, 0 );
-#endif
 
                        *text = "use bind to verify old password";
                        rc = LDAP_UNWILLING_TO_PERFORM;
@@ -304,13 +311,8 @@ int slap_passwd_parse( struct berval *reqdata,
                tag = ber_scanf( ber, "m", oldpass );
 
                if( tag == LBER_ERROR ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse:  ID parse failed.\n" , 0, 0, 0 );
-#else
-                       Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: ID parse failed.\n",
+                       Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: OLD parse failed.\n",
                                0, 0, 0 );
-#endif
 
                        goto decoding_error;
                }
@@ -320,13 +322,8 @@ int slap_passwd_parse( struct berval *reqdata,
 
        if( tag == LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ) {
                if( newpass == NULL ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse:  NEW not allowed.\n", 0, 0, 0 );
-#else
                        Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: NEW not allowed.\n",
                                0, 0, 0 );
-#endif
 
                        *text = "user specified passwords disallowed";
                        rc = LDAP_UNWILLING_TO_PERFORM;
@@ -336,13 +333,8 @@ int slap_passwd_parse( struct berval *reqdata,
                tag = ber_scanf( ber, "m", newpass );
 
                if( tag == LBER_ERROR ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( OPERATION, ERR,
-                          "slap_passwd_parse:  OLD parse failed.\n", 0, 0, 0 );
-#else
-                       Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: OLD parse failed.\n",
+                       Debug( LDAP_DEBUG_TRACE, "slap_passwd_parse: NEW parse failed.\n",
                                0, 0, 0 );
-#endif
 
                        goto decoding_error;
                }
@@ -352,14 +344,9 @@ int slap_passwd_parse( struct berval *reqdata,
 
        if( len != 0 ) {
 decoding_error:
-#ifdef NEW_LOGGING
-               LDAP_LOG( OPERATION, ERR, 
-                       "slap_passwd_parse: decoding error, len=%ld\n", (long)len, 0, 0 );
-#else
                Debug( LDAP_DEBUG_TRACE,
                        "slap_passwd_parse: decoding error, len=%ld\n",
                        (long) len, 0, 0 );
-#endif
 
                *text = "data decoding error";
                rc = LDAP_PROTOCOL_ERROR;
@@ -380,13 +367,8 @@ struct berval * slap_passwd_return(
 
        assert( cred != NULL );
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ENTRY, 
-               "slap_passwd_return: %ld\n",(long)cred->bv_len, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "slap_passwd_return: %ld\n",
                (long) cred->bv_len, 0, 0 );
-#endif
        
        ber_init_w_nullc( ber, LBER_USE_DER );
 
@@ -439,11 +421,7 @@ slap_passwd_check(
 void
 slap_passwd_generate( struct berval *pass )
 {
-#ifdef NEW_LOGGING
-       LDAP_LOG( OPERATION, ENTRY, "slap_passwd_generate: begin\n", 0, 0, 0 );
-#else
        Debug( LDAP_DEBUG_TRACE, "slap_passwd_generate\n", 0, 0, 0 );
-#endif
        pass->bv_val = NULL;
        pass->bv_len = 0;