feat: enforce minimum password length

This commit is contained in:
Björn Fromme committed 2026-06-23 16:27:08 +02:00
1 parent 161029ec7c
commit 69885b939a
4 files changed
+109 -19

No files matched your search

+58 -11
View File
@@ -23,6 +23,7 @@ class RegistrationControllerTest extends WebTestCase
{
$client = self::createClient([], [
'HTTPS' => 'on',
'HTTP_HX_REQUEST' => 'true',
]);
$client->disableReboot();
@@ -54,8 +55,8 @@ class RegistrationControllerTest extends WebTestCase
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'secret-password',
'registration[plainPassword][second]' => 'secret-password',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',
@@ -107,8 +108,8 @@ class RegistrationControllerTest extends WebTestCase
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'secret-password',
'registration[plainPassword][second]' => 'secret-password',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',
@@ -153,8 +154,8 @@ class RegistrationControllerTest extends WebTestCase
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'secret-password',
'registration[plainPassword][second]' => 'secret-password',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',
@@ -171,6 +172,52 @@ class RegistrationControllerTest extends WebTestCase
self::assertResponseStatusCodeSame(422);
}
public function testMismatchedPasswordRegistrationSubmissionIsRejectedBeforeApiCalls(): void
{
$client = self::createClient([], [
'HTTPS' => 'on',
]);
$client->disableReboot();
$userRepository = $this->createMock(UserRepository::class);
$userRepository->expects(self::never())->method('findOneByNormalizedEmail');
$rateLimiter = $this->createMock(PublicFormRateLimiter::class);
$rateLimiter->expects(self::never())->method('isRegistrationAllowed');
$apiClient = $this->createMock(ApiClient::class);
$apiClient->expects(self::never())->method('register');
$apiClient->expects(self::never())->method('getCrmAttributesWithPassword');
$apiClient->expects(self::never())->method('getPersonalDataWithPassword');
self::getContainer()->set(UserRepository::class, $userRepository);
self::getContainer()->set(PublicFormRateLimiter::class, $rateLimiter);
self::getContainer()->set(ApiClient::class, $apiClient);
$crawler = $client->request('GET', '/registration');
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',
'registration[personalData][dateOfBirth][year]' => '1990',
'registration[personalData][street]' => 'Main Street 1',
'registration[personalData][postCode]' => '12345',
'registration[personalData][city]' => 'Berlin',
'registration[personalData][country]' => 'DE',
'registration[personalData][nationality]' => 'DE',
'registration[personalData][email]' => '[email protected]',
'registration[personalData][mobile]' => '0123456789',
]);
$client->submit($form);
self::assertResponseStatusCodeSame(422);
self::assertStringContainsString('Die beiden Passwortangaben müssen identisch sein.', $client->getResponse()->getContent());
}
public function testSuccessfulRegistrationDoesNotRefetchPersonalData(): void
{
$client = self::createClient([], [
@@ -214,7 +261,7 @@ class RegistrationControllerTest extends WebTestCase
$passwordHasher
->expects(self::once())
->method('hashPassword')
->with(self::isInstanceOf(User::class), 'secret-password')
->with(self::isInstanceOf(User::class), 'Str0ng-Passw0rd!')
->willReturn('hashed-secret');
$persistedUser = null;
@@ -241,8 +288,8 @@ class RegistrationControllerTest extends WebTestCase
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'secret-password',
'registration[plainPassword][second]' => 'secret-password',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',
@@ -319,8 +366,8 @@ class RegistrationControllerTest extends WebTestCase
$form = $crawler->selectButton('Jetzt registrieren')->form([
'registration[firstName]' => 'Customer',
'registration[name]' => 'Example',
'registration[plainPassword][first]' => 'secret-password',
'registration[plainPassword][second]' => 'secret-password',
'registration[plainPassword][first]' => 'Str0ng-Passw0rd!',
'registration[plainPassword][second]' => 'Str0ng-Passw0rd!',
'registration[personalData][gender]' => 'M',
'registration[personalData][dateOfBirth][day]' => '1',
'registration[personalData][dateOfBirth][month]' => '1',