From c5a4b4575536e889fb4cbea23f997d35336214c6 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:19:23 +0900 Subject: [PATCH 01/11] refactor: move `label` for validation rules to Config\Auth --- src/Config/Auth.php | 20 ++++++++++------ src/Controllers/LoginController.php | 10 ++------ src/Controllers/MagicLinkController.php | 5 +--- .../RegistrationValidationRules.php | 23 +++++++++---------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/Config/Auth.php b/src/Config/Auth.php index c5e15b035..fc1dd7b86 100644 --- a/src/Config/Auth.php +++ b/src/Config/Auth.php @@ -206,10 +206,13 @@ class Auth extends BaseConfig * @var string[] */ public array $usernameValidationRules = [ - 'required', - 'max_length[30]', - 'min_length[3]', - 'regex_match[/\A[a-zA-Z0-9\.]+\z/]', + 'label' => 'Auth.username', + 'rules' => [ + 'required', + 'max_length[30]', + 'min_length[3]', + 'regex_match[/\A[a-zA-Z0-9\.]+\z/]', + ], ]; /** @@ -220,9 +223,12 @@ class Auth extends BaseConfig * @var string[] */ public array $emailValidationRules = [ - 'required', - 'max_length[254]', - 'valid_email', + 'label' => 'Auth.email', + 'rules' => [ + 'required', + 'max_length[254]', + 'valid_email', + ], ]; /** diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index ba7efe56f..d9306e85c 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -83,14 +83,8 @@ public function loginAction(): RedirectResponse protected function getValidationRules(): array { return setting('Validation.login') ?? [ - // 'username' => [ - // 'label' => 'Auth.username', - // 'rules' => config('Auth')->usernameValidationRules, - // ], - 'email' => [ - 'label' => 'Auth.email', - 'rules' => config('Auth')->emailValidationRules, - ], + // 'username' => config('Auth')->usernameValidationRules, + 'email' => config('Auth')->emailValidationRules, 'password' => [ 'label' => 'Auth.password', 'rules' => 'required|' . Passwords::getMaxLengthRule(), diff --git a/src/Controllers/MagicLinkController.php b/src/Controllers/MagicLinkController.php index 45ac55a43..ebdeda0ca 100644 --- a/src/Controllers/MagicLinkController.php +++ b/src/Controllers/MagicLinkController.php @@ -234,10 +234,7 @@ private function recordLoginAttempt( protected function getValidationRules(): array { return [ - 'email' => [ - 'label' => 'Auth.email', - 'rules' => config('Auth')->emailValidationRules, - ], + 'email' => config('Auth')->emailValidationRules, ]; } } diff --git a/src/Validation/RegistrationValidationRules.php b/src/Validation/RegistrationValidationRules.php index ca2c5a44f..9200fbfe1 100644 --- a/src/Validation/RegistrationValidationRules.php +++ b/src/Validation/RegistrationValidationRules.php @@ -23,26 +23,25 @@ public function __construct() public function get(): array { - $registrationUsernameRules = array_merge( - config('Auth')->usernameValidationRules, + $config = config('Auth'); + + $usernameValidationRules = $config->usernameValidationRules; + $emailValidationRules = $config->emailValidationRules; + + $usernameValidationRules['rules'] = array_merge( + $usernameValidationRules['rules'], [sprintf('is_unique[%s.username]', $this->tables['users'])] ); - $registrationEmailRules = array_merge( - config('Auth')->emailValidationRules, + $emailValidationRules['rules'] = array_merge( + $emailValidationRules['rules'], [sprintf('is_unique[%s.secret]', $this->tables['identities'])] ); helper('setting'); return setting('Validation.registration') ?? [ - 'username' => [ - 'label' => 'Auth.username', - 'rules' => $registrationUsernameRules, - ], - 'email' => [ - 'label' => 'Auth.email', - 'rules' => $registrationEmailRules, - ], + 'username' => $usernameValidationRules, + 'email' => $emailValidationRules, 'password' => [ 'label' => 'Auth.password', 'rules' => 'required|' . Passwords::getMaxLengthRule() . '|strong_password[]', From 84df605b20dc33bbf966e007aea7ba9fce0361f1 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:22:06 +0900 Subject: [PATCH 02/11] refactor: rename classname and method name --- src/Commands/User.php | 6 +++--- src/Controllers/RegisterController.php | 6 +++--- ...{RegistrationValidationRules.php => ValidationRules.php} | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/Validation/{RegistrationValidationRules.php => ValidationRules.php} (95%) diff --git a/src/Commands/User.php b/src/Commands/User.php index 9a2b39c1f..4a2d1b1e1 100644 --- a/src/Commands/User.php +++ b/src/Commands/User.php @@ -13,7 +13,7 @@ use CodeIgniter\Shield\Entities\User as UserEntity; use CodeIgniter\Shield\Exceptions\UserNotFoundException; use CodeIgniter\Shield\Models\UserModel; -use CodeIgniter\Shield\Validation\RegistrationValidationRules; +use CodeIgniter\Shield\Validation\ValidationRules; use Config\Services; class User extends BaseCommand @@ -219,9 +219,9 @@ private function setTables(): void private function setValidationRules(): void { - $validationRules = new RegistrationValidationRules(); + $validationRules = new ValidationRules(); - $rules = $validationRules->get(); + $rules = $validationRules->getRegistrationRules(); // Remove `strong_password` because it only supports use cases // to check the user's own password. diff --git a/src/Controllers/RegisterController.php b/src/Controllers/RegisterController.php index 0e49e3851..e0eea5014 100644 --- a/src/Controllers/RegisterController.php +++ b/src/Controllers/RegisterController.php @@ -14,7 +14,7 @@ use CodeIgniter\Shield\Exceptions\ValidationException; use CodeIgniter\Shield\Models\UserModel; use CodeIgniter\Shield\Traits\Viewable; -use CodeIgniter\Shield\Validation\RegistrationValidationRules; +use CodeIgniter\Shield\Validation\ValidationRules; use Psr\Log\LoggerInterface; /** @@ -167,8 +167,8 @@ protected function getUserEntity(): User */ protected function getValidationRules(): array { - $rules = new RegistrationValidationRules(); + $rules = new ValidationRules(); - return $rules->get(); + return $rules->getRegistrationRules(); } } diff --git a/src/Validation/RegistrationValidationRules.php b/src/Validation/ValidationRules.php similarity index 95% rename from src/Validation/RegistrationValidationRules.php rename to src/Validation/ValidationRules.php index 9200fbfe1..66da07714 100644 --- a/src/Validation/RegistrationValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -7,7 +7,7 @@ use CodeIgniter\Shield\Authentication\Passwords; use CodeIgniter\Shield\Config\Auth; -class RegistrationValidationRules +class ValidationRules { /** * Auth Table names @@ -21,7 +21,7 @@ public function __construct() $this->tables = $authConfig->tables; } - public function get(): array + public function getRegistrationRules(): array { $config = config('Auth'); From cc481f5e9c950774f40d9a3496c519c74337d6fc Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:26:17 +0900 Subject: [PATCH 03/11] refactor: extract methods for password fields --- src/Validation/ValidationRules.php | 34 +++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index 66da07714..5794373a8 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -40,19 +40,29 @@ public function getRegistrationRules(): array helper('setting'); return setting('Validation.registration') ?? [ - 'username' => $usernameValidationRules, - 'email' => $emailValidationRules, - 'password' => [ - 'label' => 'Auth.password', - 'rules' => 'required|' . Passwords::getMaxLengthRule() . '|strong_password[]', - 'errors' => [ - 'max_byte' => 'Auth.errorPasswordTooLongBytes', - ], - ], - 'password_confirm' => [ - 'label' => 'Auth.passwordConfirm', - 'rules' => 'required|matches[password]', + 'username' => $usernameValidationRules, + 'email' => $emailValidationRules, + 'password' => $this->getPasswordRules(), + 'password_confirm' => $this->getPasswordConfirmRules(), + ]; + } + + public function getPasswordRules(): array + { + return [ + 'label' => 'Auth.password', + 'rules' => 'required|' . Passwords::getMaxLengthRule() . '|strong_password[]', + 'errors' => [ + 'max_byte' => 'Auth.errorPasswordTooLongBytes', ], ]; } + + public function getPasswordConfirmRules(): array + { + return [ + 'label' => 'Auth.passwordConfirm', + 'rules' => 'required|matches[password]', + ]; + } } From 82fe260de811eb2b7e35762b611641a6e169b88a Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:31:34 +0900 Subject: [PATCH 04/11] refactor: add private property --- src/Validation/ValidationRules.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index 5794373a8..91d68a46a 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -9,6 +9,8 @@ class ValidationRules { + private Auth $config; + /** * Auth Table names */ @@ -17,16 +19,16 @@ class ValidationRules public function __construct() { /** @var Auth $authConfig */ - $authConfig = config('Auth'); - $this->tables = $authConfig->tables; + $authConfig = config('Auth'); + + $this->config = $authConfig; + $this->tables = $this->config->tables; } public function getRegistrationRules(): array { - $config = config('Auth'); - - $usernameValidationRules = $config->usernameValidationRules; - $emailValidationRules = $config->emailValidationRules; + $usernameValidationRules = $this->config->usernameValidationRules; + $emailValidationRules = $this->config->emailValidationRules; $usernameValidationRules['rules'] = array_merge( $usernameValidationRules['rules'], From d1c065805772afe1657fd7466503c544e2782cd9 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:38:02 +0900 Subject: [PATCH 05/11] refactor: move validation rules to ValidationRules --- src/Controllers/LoginController.php | 16 ++++------------ src/Validation/ValidationRules.php | 11 +++++++++++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index d9306e85c..e38fa3817 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -7,8 +7,8 @@ use App\Controllers\BaseController; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\Shield\Authentication\Authenticators\Session; -use CodeIgniter\Shield\Authentication\Passwords; use CodeIgniter\Shield\Traits\Viewable; +use CodeIgniter\Shield\Validation\ValidationRules; class LoginController extends BaseController { @@ -82,17 +82,9 @@ public function loginAction(): RedirectResponse */ protected function getValidationRules(): array { - return setting('Validation.login') ?? [ - // 'username' => config('Auth')->usernameValidationRules, - 'email' => config('Auth')->emailValidationRules, - 'password' => [ - 'label' => 'Auth.password', - 'rules' => 'required|' . Passwords::getMaxLengthRule(), - 'errors' => [ - 'max_byte' => 'Auth.errorPasswordTooLongBytes', - ], - ], - ]; + $rules = new ValidationRules(); + + return $rules->getLoginRules(); } /** diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index 91d68a46a..d85949a4a 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -49,6 +49,17 @@ public function getRegistrationRules(): array ]; } + public function getLoginRules(): array + { + helper('setting'); + + return setting('Validation.login') ?? [ + // 'username' => $this->config->usernameValidationRules, + 'email' => $this->config->emailValidationRules, + 'password' => $this->getPasswordRules(), + ]; + } + public function getPasswordRules(): array { return [ From e25fe078840ce91f0857f7d2c57a5c3f207bc818 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:45:02 +0900 Subject: [PATCH 06/11] refactor: if setting returns values, returns it --- src/Validation/ValidationRules.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index d85949a4a..20d0a5117 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -27,6 +27,13 @@ public function __construct() public function getRegistrationRules(): array { + helper('setting'); + + $setting = setting('Validation.registration'); + if ($setting !== null) { + return $setting; + } + $usernameValidationRules = $this->config->usernameValidationRules; $emailValidationRules = $this->config->emailValidationRules; @@ -39,9 +46,7 @@ public function getRegistrationRules(): array [sprintf('is_unique[%s.secret]', $this->tables['identities'])] ); - helper('setting'); - - return setting('Validation.registration') ?? [ + return [ 'username' => $usernameValidationRules, 'email' => $emailValidationRules, 'password' => $this->getPasswordRules(), From 95ecdc1f227b31b85e9fc414b02252dc558b3b9d Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 16:53:38 +0900 Subject: [PATCH 07/11] docs: update doc comments --- src/Config/Auth.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Config/Auth.php b/src/Config/Auth.php index fc1dd7b86..e7ad04189 100644 --- a/src/Config/Auth.php +++ b/src/Config/Auth.php @@ -203,7 +203,9 @@ class Auth extends BaseConfig * The validation rules for username * -------------------------------------------------------------------- * - * @var string[] + * Do not use string rules like `required|valid_email`. + * + * @var array|string> */ public array $usernameValidationRules = [ 'label' => 'Auth.username', @@ -220,7 +222,9 @@ class Auth extends BaseConfig * The validation rules for email * -------------------------------------------------------------------- * - * @var string[] + * Do not use string rules like `required|valid_email`. + * + * @var array|string> */ public array $emailValidationRules = [ 'label' => 'Auth.email', From 114cfba7beeffd7acef5356f2a7073eaeea7f180 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 17:30:20 +0900 Subject: [PATCH 08/11] fix: wrong password validation rules for login --- src/Validation/ValidationRules.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index 20d0a5117..8612d0c65 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -46,10 +46,13 @@ public function getRegistrationRules(): array [sprintf('is_unique[%s.secret]', $this->tables['identities'])] ); + $passwordRules = $this->getPasswordRules(); + $passwordRules['rules'][] = 'strong_password[]'; + return [ 'username' => $usernameValidationRules, 'email' => $emailValidationRules, - 'password' => $this->getPasswordRules(), + 'password' => $passwordRules, 'password_confirm' => $this->getPasswordConfirmRules(), ]; } @@ -69,7 +72,7 @@ public function getPasswordRules(): array { return [ 'label' => 'Auth.password', - 'rules' => 'required|' . Passwords::getMaxLengthRule() . '|strong_password[]', + 'rules' => ['required', Passwords::getMaxLengthRule()], 'errors' => [ 'max_byte' => 'Auth.errorPasswordTooLongBytes', ], From 76f8c977644c7fd38159ea1559f481bf3f9d92c6 Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 17:33:22 +0900 Subject: [PATCH 09/11] refactor: do not use array_merge() --- src/Validation/ValidationRules.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index 8612d0c65..c0827bc79 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -34,16 +34,16 @@ public function getRegistrationRules(): array return $setting; } - $usernameValidationRules = $this->config->usernameValidationRules; - $emailValidationRules = $this->config->emailValidationRules; - - $usernameValidationRules['rules'] = array_merge( - $usernameValidationRules['rules'], - [sprintf('is_unique[%s.username]', $this->tables['users'])] + $usernameValidationRules = $this->config->usernameValidationRules; + $usernameValidationRules['rules'][] = sprintf( + 'is_unique[%s.username]', + $this->tables['users'] ); - $emailValidationRules['rules'] = array_merge( - $emailValidationRules['rules'], - [sprintf('is_unique[%s.secret]', $this->tables['identities'])] + + $emailValidationRules = $this->config->emailValidationRules; + $emailValidationRules['rules'][] = sprintf( + 'is_unique[%s.secret]', + $this->tables['identities'] ); $passwordRules = $this->getPasswordRules(); From b080a71b0bbf876e3eaa09cf7ff6a40de555289b Mon Sep 17 00:00:00 2001 From: kenjis Date: Wed, 27 Sep 2023 17:37:20 +0900 Subject: [PATCH 10/11] refactor: shorten variable names --- src/Validation/ValidationRules.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Validation/ValidationRules.php b/src/Validation/ValidationRules.php index c0827bc79..c0d8da438 100644 --- a/src/Validation/ValidationRules.php +++ b/src/Validation/ValidationRules.php @@ -34,14 +34,14 @@ public function getRegistrationRules(): array return $setting; } - $usernameValidationRules = $this->config->usernameValidationRules; - $usernameValidationRules['rules'][] = sprintf( + $usernameRules = $this->config->usernameValidationRules; + $usernameRules['rules'][] = sprintf( 'is_unique[%s.username]', $this->tables['users'] ); - $emailValidationRules = $this->config->emailValidationRules; - $emailValidationRules['rules'][] = sprintf( + $emailRules = $this->config->emailValidationRules; + $emailRules['rules'][] = sprintf( 'is_unique[%s.secret]', $this->tables['identities'] ); @@ -50,8 +50,8 @@ public function getRegistrationRules(): array $passwordRules['rules'][] = 'strong_password[]'; return [ - 'username' => $usernameValidationRules, - 'email' => $emailValidationRules, + 'username' => $usernameRules, + 'email' => $emailRules, 'password' => $passwordRules, 'password_confirm' => $this->getPasswordConfirmRules(), ]; From 8badb41bc7752445c285e6910a0eb1b027d1dd25 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 30 Sep 2023 15:59:59 +0900 Subject: [PATCH 11/11] docs: update default validation rules --- docs/customization/validation_rules.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/customization/validation_rules.md b/docs/customization/validation_rules.md index 7e9a7afdc..074009d23 100644 --- a/docs/customization/validation_rules.md +++ b/docs/customization/validation_rules.md @@ -27,7 +27,11 @@ Shield has the following rules for registration by default: ], 'password' => [ 'label' => 'Auth.password', - 'rules' => 'required|max_byte[72]|strong_password[]', + 'rules' => [ + 'required', + 'max_byte[72]', + 'strong_password[]', + ], 'errors' => [ 'max_byte' => 'Auth.errorPasswordTooLongBytes' ] @@ -98,8 +102,13 @@ Similar to the process for validation rules in the **Registration** section, you //-------------------------------------------------------------------- public $login = [ // 'username' => [ - // 'label' => 'Auth.username', - // 'rules' => 'required|max_length[30]|min_length[3]|regex_match[/\A[a-zA-Z0-9\.]+\z/]', + // 'label' => 'Auth.username', + // 'rules' => [ + // 'required', + // 'max_length[30]', + // 'min_length[3]', + // 'regex_match[/\A[a-zA-Z0-9\.]+\z/]', + // ], // ], 'email' => [ 'label' => 'Auth.email', @@ -111,7 +120,10 @@ public $login = [ ], 'password' => [ 'label' => 'Auth.password', - 'rules' => 'required|max_byte[72]', + 'rules' => [ + 'required', + 'max_byte[72]', + ], 'errors' => [ 'max_byte' => 'Auth.errorPasswordTooLongBytes', ]