add constructor to PasswordValidator and codereview changes

This commit is contained in:
Jolien Trog 2025-08-27 09:48:05 +02:00
parent 08e24ad860
commit 3b481e4cbe
5 changed files with 31 additions and 38 deletions

View File

@ -36,7 +36,7 @@ class ChangePasswordForm extends Form
*
* @param PasswordPolicyHook|null $passwordPolicyObject
*/
public function __construct($passwordPolicyObject = null)
public function __construct(?PasswordPolicyHook $passwordPolicyObject = null)
{
$this->passwordPolicyObject = $passwordPolicyObject;
parent::__construct();
@ -84,7 +84,7 @@ class ChangePasswordForm extends Form
array(
'label' => $this->translate('New Password'),
'required' => true,
'validators' => [new PasswordValidator()]
'validators' => [new PasswordValidator($this->passwordPolicyObject)]
)
);
$this->addElement(

View File

@ -1,4 +1,5 @@
<?php
/* Icinga Web 2 | (c) 2025 Icinga GmbH | GPLv2+ */
namespace Icinga\Forms\Config\General;
@ -12,34 +13,14 @@ use Icinga\Web\Form;
*/
class PasswordPolicyConfigForm extends Form
{
/**
* {@inheritdoc}
*/
public function init(): void
{
$this->setName('form_config_general_password_policy');
}
/**
* {@inheritdoc}
*
* @return $this
*/
public function createElements(array $formData)
public function createElements(array $formData): self
{
$this->addElement(
'checkbox',
'global_password_policy',
array(
'label' => $this->translate('Password Policy'),
'value' => true,
'description' => $this->translate(
'Enforce strong password requirements for new passwords'
),
)
);
$passwordPolicies = [];
$passwordPolicies = [];
foreach (Hook::all('passwordpolicy') as $class => $policy) {
$passwordPolicies[$class] = $policy->getName();
@ -49,19 +30,16 @@ class PasswordPolicyConfigForm extends Form
$this->addElement(
'select',
'global_password_policy',
array(
[
'description' => $this->translate(
'Enforce strong password requirements for new passwords'
),
'label' => $this->translate('Password Policy'),
'multiOptions' => array_merge(
['' => sprintf(
' - %s - ',
$this->translate('No Password Policy')
)],
['' => $this->translate('No Password Policy')],
$passwordPolicies
),
)
]
);
return $this;

View File

@ -1,4 +1,5 @@
<?php
/* Icinga Web 2 | (c) 2025 Icinga GmbH | GPLv2+ */
namespace Icinga\Application\Hook;

View File

@ -1,4 +1,5 @@
<?php
/* Icinga Web 2 | (c) 2025 Icinga GmbH | GPLv2+ */
namespace Icinga\Application\ProvidedHook;

View File

@ -1,17 +1,33 @@
<?php
/* Icinga Web 2 | (c) 2025 Icinga GmbH | GPLv2+ */
namespace Icinga\Authentication;
use Icinga\Application\Config;
use Icinga\Application\Hook\PasswordPolicyHook;
use Zend_Validate_Abstract;
class PasswordValidator extends Zend_Validate_Abstract
{
/**
* @var PasswordPolicyHook|null
*/
private ?PasswordPolicyHook $passwordPolicyObject;
/**
* Constructor
*
* @param PasswordPolicyHook|null $passwordPolicyObject
*/
public function __construct(?PasswordPolicyHook $passwordPolicyObject = null)
{
$this->passwordPolicyObject = $passwordPolicyObject;
}
/**
* Checks if password matches with password policy
* throws a message if not
*
* If no password policy is configured, all passwords are considered valid
* If no password policy is set, all passwords are considered valid
*
* @param mixed $value The password to validate
*
@ -21,17 +37,14 @@ class PasswordValidator extends Zend_Validate_Abstract
public function isValid($value): bool
{
$this->_messages = [];
$passwordPolicy = Config::app()
->get('global', 'password_policy');
if (! isset($passwordPolicy) || ! class_exists($passwordPolicy)) {
if ($this->passwordPolicyObject === null) {
return true;
}
$passwordPolicyObject = new $passwordPolicy();
$errorMessage = $passwordPolicyObject->validatePassword($value);
$errorMessage = $this->passwordPolicyObject->validatePassword($value);
if ($errorMessage != null) {
if ($errorMessage !== null) {
$this->_messages[] = $errorMessage;
return false;
}