--- samba/source/smbd/chgpasswd.c.orig 2004-12-13 20:11:25.000000000 -0800 +++ samba/source/smbd/chgpasswd.c 2004-12-13 20:22:16.000000000 -0800 @@ -703,7 +703,32 @@ { pstring new_passwd; SAM_ACCOUNT *sampass = NULL; - NTSTATUS nt_status = check_oem_password(user, password_encrypted_with_lm_hash, + NTSTATUS nt_status = NT_STATUS_WRONG_PASSWORD; + +#ifdef WITH_OPENDIRECTORY + tDirStatus dir_status = eDSNullParameter; + u_int8_t passwordFormat = 0; + + if (lp_opendirectory()) { + if(password_encrypted_with_nt_hash != NULL && old_nt_hash_encrypted != NULL) + passwordFormat = 1; /* 0 - UTF8 | 1 - UCS2 Unicode, >1 == codepage */ + become_root(); + dir_status = opendirectory_lmchap2changepasswd(user, password_encrypted_with_lm_hash, old_lm_hash_encrypted, passwordFormat, NULL); + unbecome_root(); + DEBUG(3, ("pass_oem_change: [%d]opendirectory_lmchap2changepasswd passwordFormat(%d)\n", dir_status, passwordFormat)); + if (eDSNoErr == dir_status) + nt_status = NT_STATUS_OK; + else if (eDSAuthPasswordTooShort == dir_status || + eDSAuthPasswordTooLong == dir_status || + eDSAuthPasswordNeedsLetter == dir_status || + eDSAuthPasswordNeedsDigit == dir_status || + eDSAuthPasswordChangeTooSoon == dir_status || + eDSAuthPasswordQualityCheckFailed == dir_status) { + nt_status = NT_STATUS_PASSWORD_RESTRICTION; + } + } else { +#endif + nt_status = check_oem_password(user, password_encrypted_with_lm_hash, old_lm_hash_encrypted, password_encrypted_with_nt_hash, old_nt_hash_encrypted, @@ -720,6 +745,9 @@ memset(new_passwd, 0, sizeof(new_passwd)); pdb_free_sam(&sampass); +#ifdef WITH_OPENDIRECTORY + } +#endif return nt_status; }