<dl{if $errorField == 'newPassword'} class="formError"{/if}>
<dt><label for="newPassword">{lang}wcf.user.newPassword{/lang}</label></dt>
<dd>
- <input type="password" id="newPassword" name="newPassword" value="{$newPassword}" class="medium" autocomplete="new-password">
+ <input type="password" id="newPassword" name="newPassword" value="{$newPassword}" class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorField == 'newPassword'}
<small class="innerError">
<dl{if $errorField == 'confirmNewPassword'} class="formError"{/if}>
<dt><label for="confirmNewPassword">{lang}wcf.user.confirmPassword{/lang}</label></dt>
<dd>
- <input type="password" id="confirmNewPassword" name="confirmNewPassword" value="{$confirmNewPassword}" class="medium" autocomplete="new-password">
+ <input type="password" id="confirmNewPassword" name="confirmNewPassword" value="{$confirmNewPassword}" class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorField == 'confirmNewPassword'}
<small class="innerError">
<dl{if $errorField == 'newPassword'} class="formError"{/if}>
<dt><label for="newPassword">{lang}wcf.user.newPassword{/lang}</label></dt>
<dd>
- <input type="password" id="newPassword" name="newPassword" value="{$newPassword}" class="medium" autocomplete="new-password">
+ <input type="password" id="newPassword" name="newPassword" value="{$newPassword}" class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorField == 'newPassword'}
<small class="innerError">
<dl{if $errorField == 'confirmNewPassword'} class="formError"{/if}>
<dt><label for="confirmNewPassword">{lang}wcf.user.confirmPassword{/lang}</label></dt>
<dd>
- <input type="password" id="confirmNewPassword" name="confirmNewPassword" value="{$confirmNewPassword}" class="medium" autocomplete="new-password">
+ <input type="password" id="confirmNewPassword" name="confirmNewPassword" value="{$confirmNewPassword}" class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorField == 'confirmNewPassword'}
<small class="innerError">
<label for="{@$randomFieldNames[password]}">{lang}wcf.user.password{/lang}</label>
</dt>
<dd>
- <input type="password" id="{@$randomFieldNames[password]}" name="{@$randomFieldNames[password]}" value="{$password}" required class="medium" autocomplete="new-password">
+ <input type="password" id="{@$randomFieldNames[password]}" name="{@$randomFieldNames[password]}" value="{$password}" required class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorType.password|isset}
<small class="innerError">
{if $errorType.password == 'empty'}{lang}wcf.global.form.error.empty{/lang}{/if}
<label for="{@$randomFieldNames[confirmPassword]}">{lang}wcf.user.confirmPassword{/lang}</label>
</dt>
<dd>
- <input type="password" id="{@$randomFieldNames[confirmPassword]}" name="{@$randomFieldNames[confirmPassword]}" value="{$confirmPassword}" required class="medium" autocomplete="new-password">
+ <input type="password" id="{@$randomFieldNames[confirmPassword]}" name="{@$randomFieldNames[confirmPassword]}" value="{$confirmPassword}" required class="medium" autocomplete="new-password" passwordrules="{$passwordRulesAttributeValue}">
{if $errorType.confirmPassword|isset}
<small class="innerError">
{if $errorType.confirmPassword == 'notEqual'}{lang}wcf.user.confirmPassword.error.notEqual{/lang}{/if}
'facebookConnect' => $this->facebookConnect,
'facebookDisconnect' => $this->facebookDisconnect,
'googleConnect' => $this->googleConnect,
- 'googleDisconnect' => $this->googleDisconnect
+ 'googleDisconnect' => $this->googleDisconnect,
+ 'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
]);
}
WCF::getTPL()->assign([
'user' => $this->user,
'newPassword' => $this->newPassword,
- 'confirmNewPassword' => $this->confirmNewPassword
+ 'confirmNewPassword' => $this->confirmNewPassword,
+ 'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
]);
}
}
WCF::getTPL()->assign([
'captchaObjectType' => $this->captchaObjectType,
'isExternalAuthentication' => $this->isExternalAuthentication,
- 'randomFieldNames' => $this->randomFieldNames
+ 'randomFieldNames' => $this->randomFieldNames,
+ 'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
]);
}
return true;
}
+ /**
+ * Returns the `passwordrules` attribute value.
+ *
+ * @see https://developer.apple.com/password-rules/
+ * @return string
+ */
+ public static function getPasswordRulesAttributeValue() {
+ if (REGISTER_ENABLE_PASSWORD_SECURITY_CHECK) {
+ $rules = '';
+
+ if (REGISTER_PASSWORD_MIN_LENGTH) {
+ $rules .= 'minlength:'.REGISTER_PASSWORD_MIN_LENGTH.';';
+ }
+
+ if (REGISTER_PASSWORD_MUST_CONTAIN_DIGIT) {
+ $rules .= 'required:digit;';
+ }
+
+ if (REGISTER_PASSWORD_MUST_CONTAIN_LOWER_CASE) {
+ $rules .= 'required:lower;';
+ }
+
+ if (REGISTER_PASSWORD_MUST_CONTAIN_UPPER_CASE) {
+ $rules .= 'required:upper;';
+ }
+
+ if (REGISTER_PASSWORD_MUST_CONTAIN_SPECIAL_CHAR) {
+ $rules .= 'required:special;';
+ }
+ }
+ else {
+ $rules = "minlength:8;";
+ }
+
+ return $rules;
+ }
+
/**
* Generates a random activation code with the given length.
* Warning: A length greater than 9 is out of integer range.