talloc_free(req);
return NT_STATUS_NO_MEMORY;
}
+
+ /* a KDC-triggered smart card password rollover (ResetSmartCardAccountPassword) */
+ } else if (old_password_checked == DSDB_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD) {
+ ret = ldb_request_add_control(req,
+ DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD,
+ true, NULL);
+ if (ret != LDB_SUCCESS) {
+ talloc_free(req);
+ return NT_STATUS_NO_MEMORY;
+ }
}
if (hash_values) {
ret = ldb_request_add_control(req,
bool pwd_last_set_bypass;
bool pwd_last_set_default;
bool smartcard_reset;
+ bool kdc_reset_smartcard_account_password;
const char **userPassword_schemes;
};
static int setup_password_fields(struct setup_password_fields_io *io)
{
struct ldb_context *ldb = ldb_module_get_ctx(io->ac->module);
+ bool prepare_random;
+
int ret;
ret = setup_last_set_field(io);
}
}
+ prepare_random = io->u.is_krbtgt || io->ac->smartcard_reset ||
+ io->ac->kdc_reset_smartcard_account_password;
+
/*
- * Both krbtgt and smartcard reset (on addition of
- * UF_SMARTCARD_REQUIRED) need random passwords for all
- * supported keys
+ * krbtgt, smartcard reset (on addition of
+ * UF_SMARTCARD_REQUIRED) and KDC-triggered rollover (for
+ * ResetSmartCardAccountPassword) need random passwords for
+ * all supported keys
*/
- if (io->u.is_krbtgt || io->ac->smartcard_reset) {
+ if (prepare_random) {
size_t min = 196;
size_t max = 255;
size_t diff = max - min;
* to declare this a password update so that the change is
* made (this ensures that the other rules about updates are
* skipped in case, which is the setting of
- * UF_SMARTCARD_REQUIRED on an account
+ * UF_SMARTCARD_REQUIRED on an account)
*/
io->ac->update_password = true;
return ret;
}
+ /* Do not apply restrictions on a KDC-issued rollover (eg ResetSmartCardAccountPassword) */
+ if (io->ac->kdc_reset_smartcard_account_password) {
+ return LDB_SUCCESS;
+ }
+
/*
* First check the old password is correct, for password
* changes when this hasn't already been checked by a
/* Mark the "smartcard required" control as uncritical (done) */
ctrl->critical = false;
}
+
+ ac->kdc_reset_smartcard_account_password = false;
+ ctrl = ldb_request_get_control(ac->req,
+ DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD);
+ if (ctrl != NULL) {
+ ac->kdc_reset_smartcard_account_password = true;
+
+ /* Mark KDC running ResetSmartCardAccountPassword control as uncritical (done) */
+ ctrl->critical = false;
+ }
+
}
static int ph_op_callback(struct ldb_request *req, struct ldb_reply *ares)
enum dsdb_password_checked {
DSDB_PASSWORD_NOT_CHECKED = 0, /* unused */
DSDB_PASSWORD_RESET,
- DSDB_PASSWORD_CHECKED_AND_CORRECT
+ DSDB_PASSWORD_CHECKED_AND_CORRECT,
+ /*
+ * This disables the password rules for this new random
+ * password for ResetSmartCardAccountPassword handling. This
+ * produces a
+ * DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD
+ * control.
+ */
+ DSDB_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD
};
#include "lib/util/data_blob.h"
#define DSDB_CONTROL_GMSA_UPDATE_OID "1.3.6.1.4.1.7165.4.3.38"
/* struct gmsa_update */
+/*
+ * KDC is running ResetSmartCardAccountPassword behaviour, the password needs to be made random
+ */
+#define DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD "1.3.6.1.4.1.7165.4.3.39"
+
#define DSDB_EXTENDED_REPLICATED_OBJECTS_OID "1.3.6.1.4.1.7165.4.4.1"
struct dsdb_extended_replicated_object {
struct ldb_message *msg;
{ DSDB_CONTROL_FORCE_ALLOW_VALIDATED_DNS_HOSTNAME_SPN_WRITE_OID, NULL, NULL },
{ DSDB_CONTROL_ACL_READ_OID, NULL, NULL },
{ DSDB_CONTROL_GMSA_UPDATE_OID, NULL, NULL },
+ { DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD, NULL, NULL },
{ DSDB_EXTENDED_SCHEMA_UPGRADE_IN_PROGRESS_OID, NULL, NULL },
{ DSDB_CONTROL_TRANSACTION_IDENTIFIER_OID, NULL, NULL},
{ DSDB_CONTROL_CALCULATED_DEFAULT_SD_OID, NULL, NULL },
#Allocated: DSDB_CONTROL_CALCULATED_DEFAULT_SD_OID 1.3.6.1.4.1.7165.4.3.36
#Allocated: DSDB_CONTROL_ACL_READ_OID 1.3.6.1.4.1.7165.4.3.37
#Allocated: DSDB_CONTROL_GMSA_UPDATE_OID 1.3.6.1.4.1.7165.4.3.38
-
+#Allocated: DSDB_CONTROL_PASSWORD_KDC_RESET_SMARTCARD_ACCOUNT_PASSWORD 1.3.6.1.4.1.7165.4.3.39
# Extended 1.3.6.1.4.1.7165.4.4.x
#Allocated: DSDB_EXTENDED_REPLICATED_OBJECTS_OID 1.3.6.1.4.1.7165.4.4.1