Add support for passwordrules attribute
authorJoshua Rüsweg <josh@bastelstu.be>
Mon, 27 Aug 2018 12:28:04 +0000 (14:28 +0200)
committerJoshua Rüsweg <josh@bastelstu.be>
Mon, 27 Aug 2018 12:28:04 +0000 (14:28 +0200)
See #2746

com.woltlab.wcf/templates/accountManagement.tpl
com.woltlab.wcf/templates/newPassword.tpl
com.woltlab.wcf/templates/register.tpl
wcfsetup/install/files/lib/form/AccountManagementForm.class.php
wcfsetup/install/files/lib/form/NewPasswordForm.class.php
wcfsetup/install/files/lib/form/RegisterForm.class.php
wcfsetup/install/files/lib/util/UserRegistrationUtil.class.php

index d1bd5e5c8a1cb1ccb2d0866944101ca0b87ecef2..3d900ba13073957016187a8cc9aa194c5d6faefe 100644 (file)
@@ -74,7 +74,7 @@
                        <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">
@@ -88,7 +88,7 @@
                        <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">
index 558f5044a4dd54e8b9e3b5b0f9f70241f63352ac..1c771802f4ac6f9aa23fd6be9df9d4e369cd492f 100644 (file)
@@ -9,7 +9,7 @@
                <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">
@@ -23,7 +23,7 @@
                <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">
index 17424c9ed3e14147c29bb507b65a2f6ad38952cd..ed5f7883d711b9d3533781c94d6b6e8b3152fb34 100644 (file)
                                        <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}
index eee2c24fee1493433543e3c144843d1def8a6a48..e8304960940d7fed75a29840a46dd473144ecf5e 100644 (file)
@@ -288,7 +288,8 @@ class AccountManagementForm extends AbstractForm {
                        'facebookConnect' => $this->facebookConnect,
                        'facebookDisconnect' => $this->facebookDisconnect,
                        'googleConnect' => $this->googleConnect,
-                       'googleDisconnect' => $this->googleDisconnect
+                       'googleDisconnect' => $this->googleDisconnect,
+                       'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
                ]);
        }
        
index 20d115932ed80244ebb6f6882053aa7f99abb363..2509092e4af541f1b919cf59cfd682a354448ca9 100644 (file)
@@ -155,7 +155,8 @@ class NewPasswordForm extends AbstractForm {
                WCF::getTPL()->assign([
                        'user' => $this->user,
                        'newPassword' => $this->newPassword,
-                       'confirmNewPassword' => $this->confirmNewPassword
+                       'confirmNewPassword' => $this->confirmNewPassword,
+                       'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
                ]);
        }
 }
index 8a82f690852b7d43793cdb183b9d8b965b3715f1..e798ee51a18f423cc4727088c57717b88af3bf59 100644 (file)
@@ -229,7 +229,8 @@ class RegisterForm extends UserAddForm {
                WCF::getTPL()->assign([
                        'captchaObjectType' => $this->captchaObjectType,
                        'isExternalAuthentication' => $this->isExternalAuthentication,
-                       'randomFieldNames' => $this->randomFieldNames
+                       'randomFieldNames' => $this->randomFieldNames,
+                       'passwordRulesAttributeValue' => UserRegistrationUtil::getPasswordRulesAttributeValue()
                ]);
        }
        
index 3c9556cc8400e1ecf55d874fd19e3793d885a3d5..ce51c15c942f25d5d1a0593920ebfaf29e0ef162 100644 (file)
@@ -87,6 +87,43 @@ final class UserRegistrationUtil {
                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.