sam_ctx,
a_state->account_dn,
a_state->domain_state->domain_dn,
- &r->in.info->info31.password);
+ &r->in.info->info31.password,
+ DSDB_PASSWORD_RESET);
if (!NT_STATUS_IS_OK(status)) {
goto done;
}
a_state->sam_ctx,
a_state->account_dn,
a_state->domain_state->domain_dn,
- &r->in.info->info32.password);
+ &r->in.info->info32.password,
+ DSDB_PASSWORD_RESET);
}
else IFSET(SAMR_FIELD_LM_PASSWORD_PRESENT)
{
a_state->sam_ctx,
a_state->account_dn,
a_state->domain_state->domain_dn,
- &r->in.info->info32.password);
+ &r->in.info->info32.password,
+ DSDB_PASSWORD_RESET);
}
if (!NT_STATUS_IS_OK(status)) {
goto done;
.data = cdk_data,
.length = sizeof(cdk_data),
};
+ struct auth_session_info *call_session_info = NULL;
+ struct auth_session_info *old_session_info = NULL;
NTSTATUS status = NT_STATUS_WRONG_PASSWORD;
int rc;
goto done;
}
+ /* Drop to user privileges for the password change */
+
+ old_session_info = ldb_get_opaque(sam_ctx, DSDB_SESSION_INFO);
+ call_session_info = dcesrv_call_session_info(dce_call);
+
+ rc = ldb_set_opaque(sam_ctx, DSDB_SESSION_INFO, call_session_info);
+ if (rc != LDB_SUCCESS) {
+ ldb_transaction_cancel(sam_ctx);
+ status = NT_STATUS_INVALID_SYSTEM_SERVICE;
+ goto done;
+ }
+
status = samr_set_password_aes(dce_call,
mem_ctx,
&cdk,
sam_ctx,
dn,
NULL,
- r->in.password);
+ r->in.password,
+ DSDB_PASSWORD_CHECKED_AND_CORRECT);
BURN_DATA(cdk_data);
+
+ /* Restore our privileges to system level */
+ if (old_session_info != NULL) {
+ ldb_set_opaque(sam_ctx, DSDB_SESSION_INFO, old_session_info);
+ }
+
if (!NT_STATUS_IS_OK(status)) {
ldb_transaction_cancel(sam_ctx);
status = NT_STATUS_WRONG_PASSWORD;
struct ldb_context *sam_ctx,
struct ldb_dn *account_dn,
struct ldb_dn *domain_dn,
- struct samr_EncryptedPasswordAES *pwbuf)
+ struct samr_EncryptedPasswordAES *pwbuf,
+ enum dsdb_password_checked old_password_checked)
{
DATA_BLOB pw_data = data_blob_null;
DATA_BLOB new_password = data_blob_null;
domain_dn,
&new_password,
NULL,
- DSDB_PASSWORD_RESET,
+ old_password_checked,
NULL,
NULL);
TALLOC_FREE(new_password.data);