From 0e58996481328a383d2f246dc04152ef0e93f680 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 30 Nov 2025 12:15:15 +0100 Subject: [PATCH 1/2] Remove collection of emails for self-registered users --- webapp/migrations/Version20251130111340.php | 31 +++++++++++++++++++ .../src/Controller/API/AccessController.php | 1 - webapp/src/Controller/API/UserController.php | 1 - webapp/src/Controller/Jury/UserController.php | 1 - .../Test/SelfRegisteredUserFixture.php | 1 - webapp/src/DataTransferObject/AddUser.php | 2 -- webapp/src/DataTransferObject/UpdateUser.php | 3 +- webapp/src/Entity/User.php | 17 ---------- webapp/src/Form/Type/UserRegistrationType.php | 11 ------- webapp/src/Form/Type/UserType.php | 7 ----- webapp/templates/jury/user.html.twig | 10 ------ .../API/GeneralInfoControllerTest.php | 2 +- .../Controller/API/UserControllerTest.php | 3 -- .../Controller/Jury/UserControllerTest.php | 5 +-- .../Unit/Controller/PublicControllerTest.php | 8 ++--- 15 files changed, 38 insertions(+), 65 deletions(-) create mode 100644 webapp/migrations/Version20251130111340.php diff --git a/webapp/migrations/Version20251130111340.php b/webapp/migrations/Version20251130111340.php new file mode 100644 index 0000000000..6e2e9d4139 --- /dev/null +++ b/webapp/migrations/Version20251130111340.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE user DROP email'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE user ADD email VARCHAR(255) DEFAULT NULL COMMENT \'Email address\''); + } + + public function isTransactional(): bool + { + return false; + } +} diff --git a/webapp/src/Controller/API/AccessController.php b/webapp/src/Controller/API/AccessController.php index 08ba90b2d5..8c25ab2e98 100644 --- a/webapp/src/Controller/API/AccessController.php +++ b/webapp/src/Controller/API/AccessController.php @@ -222,7 +222,6 @@ public function getStatusAction(Request $request): Access 'team', 'roles', 'userid', - 'email', 'last_ip', 'enabled', ] diff --git a/webapp/src/Controller/API/UserController.php b/webapp/src/Controller/API/UserController.php index e3135ce267..4dcbb59e38 100644 --- a/webapp/src/Controller/API/UserController.php +++ b/webapp/src/Controller/API/UserController.php @@ -361,7 +361,6 @@ protected function addOrUpdateUser(AddUser $addUser, Request $request): Response $user ->setUsername($addUser->username) ->setName($addUser->name) - ->setEmail($addUser->email) ->setIpAddress($addUser->ip) ->setPlainPassword($addUser->password) ->setEnabled($addUser->enabled ?? true); diff --git a/webapp/src/Controller/Jury/UserController.php b/webapp/src/Controller/Jury/UserController.php index f696d82ae1..89f4247f9f 100644 --- a/webapp/src/Controller/Jury/UserController.php +++ b/webapp/src/Controller/Jury/UserController.php @@ -64,7 +64,6 @@ public function indexAction(): Response 'username' => ['title' => 'username', 'sort' => true, 'default_sort' => true], 'externalid' => ['title' => 'external ID', 'sort' => true], 'name' => ['title' => 'name', 'sort' => true], - 'email' => ['title' => 'email', 'sort' => true], 'user_roles' => ['title' => 'roles', 'sort' => true], 'teamid' => ['title' => '', 'sort' => false, 'render' => 'entity_id_badge'], 'team' => ['title' => 'team', 'sort' => true], diff --git a/webapp/src/DataFixtures/Test/SelfRegisteredUserFixture.php b/webapp/src/DataFixtures/Test/SelfRegisteredUserFixture.php index 6cfc8b48fa..1bf214fd3e 100644 --- a/webapp/src/DataFixtures/Test/SelfRegisteredUserFixture.php +++ b/webapp/src/DataFixtures/Test/SelfRegisteredUserFixture.php @@ -15,7 +15,6 @@ public function load(ObjectManager $manager): void $user ->setUsername('selfregister') ->setName('selfregistered user for example team') - ->setEmail('electronic@mail.tld') ->setPlainPassword('demo') ->setTeam($manager->getRepository(Team::class)->findOneBy(['name' => 'exteam'])) ->addUserRole($manager->getRepository(Role::class)->findOneBy(['dj_role' => 'team'])); diff --git a/webapp/src/DataTransferObject/AddUser.php b/webapp/src/DataTransferObject/AddUser.php index 9a26af0cdf..aeeed9418f 100644 --- a/webapp/src/DataTransferObject/AddUser.php +++ b/webapp/src/DataTransferObject/AddUser.php @@ -14,8 +14,6 @@ class AddUser public function __construct( public readonly string $username, public readonly string $name, - #[OA\Property(format: 'email', nullable: true)] - public readonly ?string $email, #[OA\Property(nullable: true)] public readonly ?string $ip, #[OA\Property(format: 'password', nullable: true)] diff --git a/webapp/src/DataTransferObject/UpdateUser.php b/webapp/src/DataTransferObject/UpdateUser.php index ab6e1fd0fb..9ec36daa81 100644 --- a/webapp/src/DataTransferObject/UpdateUser.php +++ b/webapp/src/DataTransferObject/UpdateUser.php @@ -11,13 +11,12 @@ public function __construct( public readonly string $id, string $username, string $name, - ?string $email, ?string $ip, ?string $password, ?bool $enabled, ?string $teamId, array $roles ) { - parent::__construct($username, $name, $email, $ip, $password, $enabled, $teamId, $roles); + parent::__construct($username, $name, $ip, $password, $enabled, $teamId, $roles); } } diff --git a/webapp/src/Entity/User.php b/webapp/src/Entity/User.php index e829805659..527a106503 100644 --- a/webapp/src/Entity/User.php +++ b/webapp/src/Entity/User.php @@ -58,12 +58,6 @@ class User extends BaseApiEntity implements #[ORM\Column(options: ['comment' => 'Name'])] private string $name = ''; - #[ORM\Column(nullable: true, options: ['comment' => 'Email address'])] - #[Assert\Email] - #[OA\Property(nullable: true)] - #[Serializer\Groups([ARC::GROUP_NONSTRICT])] - private ?string $email = null; - #[ORM\Column( type: 'decimal', precision: 32, @@ -217,17 +211,6 @@ public function getShortDescription(): string return $this->getName(); } - public function setEmail(?string $email): User - { - $this->email = $email; - return $this; - } - - public function getEmail(): ?string - { - return $this->email; - } - public function setLastLogin(string|float|null $lastLogin): User { $this->last_login = $lastLogin; diff --git a/webapp/src/Form/Type/UserRegistrationType.php b/webapp/src/Form/Type/UserRegistrationType.php index 79bb519bdf..274fa9fed0 100644 --- a/webapp/src/Form/Type/UserRegistrationType.php +++ b/webapp/src/Form/Type/UserRegistrationType.php @@ -15,7 +15,6 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\RepeatedType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; @@ -27,7 +26,6 @@ use Symfony\Component\Intl\Countries; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Callback; -use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Context\ExecutionContext; @@ -59,15 +57,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'autocomplete' => 'name', ], ]) - ->add('email', EmailType::class, [ - 'label' => false, - 'required' => false, - 'attr' => [ - 'placeholder' => 'Email address (optional)', - 'autocomplete' => 'email', - ], - 'constraints' => new Email(), - ]) ->add('teamName', TextType::class, [ 'label' => false, 'attr' => [ diff --git a/webapp/src/Form/Type/UserType.php b/webapp/src/Form/Type/UserType.php index 12da3e28c2..aa7c4d05d6 100644 --- a/webapp/src/Form/Type/UserType.php +++ b/webapp/src/Form/Type/UserType.php @@ -10,7 +10,6 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; @@ -53,12 +52,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'help' => 'Optional full name for the user.', 'empty_data' => '' ]); - $builder->add('email', EmailType::class, [ - 'required' => false, - 'attr' => [ - 'autocomplete' => 'user-email', - ], - ]); $builder->add('plainPassword', PasswordType::class, [ 'required' => false, 'label' => 'Password', diff --git a/webapp/templates/jury/user.html.twig b/webapp/templates/jury/user.html.twig index a8a071a8f3..c905667bd5 100644 --- a/webapp/templates/jury/user.html.twig +++ b/webapp/templates/jury/user.html.twig @@ -28,16 +28,6 @@ Login {{ user.username }} - - Email - - {% if user.email %} - {{ user.email }} - {% else %} - - - {% endif %} - - Password diff --git a/webapp/tests/Unit/Controller/API/GeneralInfoControllerTest.php b/webapp/tests/Unit/Controller/API/GeneralInfoControllerTest.php index 42a64aead5..3aff2b97c8 100644 --- a/webapp/tests/Unit/Controller/API/GeneralInfoControllerTest.php +++ b/webapp/tests/Unit/Controller/API/GeneralInfoControllerTest.php @@ -110,7 +110,7 @@ public function testUserEndpoint(string $username, string $fullname, string $tea static::assertTrue($response['enabled']); static::assertNull($response['last_login_time']); static::assertGreaterThanOrEqual($response['first_login_time'], $response['last_api_login_time']); - $keysExpected = ['id', 'ip', 'last_ip', 'email']; + $keysExpected = ['id', 'ip', 'last_ip']; foreach ($keysExpected as $keyExpected) { static::assertArrayHasKey($keyExpected, $response); } diff --git a/webapp/tests/Unit/Controller/API/UserControllerTest.php b/webapp/tests/Unit/Controller/API/UserControllerTest.php index fc92392a2e..4b0d4d3b4b 100644 --- a/webapp/tests/Unit/Controller/API/UserControllerTest.php +++ b/webapp/tests/Unit/Controller/API/UserControllerTest.php @@ -18,7 +18,6 @@ class UserControllerTest extends AccountBaseTestCase "id" => "admin", "username" => "admin", "name" => "Administrator", - "email" => null, "ip" => null, "enabled" => true ], @@ -30,7 +29,6 @@ class UserControllerTest extends AccountBaseTestCase "id" => "judgehost", "username" => "judgehost", "name" => "User for judgedaemons", - "email" => null, "ip" => null, "enabled" => true ], @@ -42,7 +40,6 @@ class UserControllerTest extends AccountBaseTestCase "id" => "demo", "username" => "demo", "name" => "demo user for example team", - "email" => null, "ip" => null, "enabled" => true ], diff --git a/webapp/tests/Unit/Controller/Jury/UserControllerTest.php b/webapp/tests/Unit/Controller/Jury/UserControllerTest.php index 1843de2e25..cda353c9e1 100644 --- a/webapp/tests/Unit/Controller/Jury/UserControllerTest.php +++ b/webapp/tests/Unit/Controller/Jury/UserControllerTest.php @@ -20,19 +20,16 @@ class UserControllerTest extends JuryControllerTestCase protected static string $className = User::class; protected static array $DOM_elements = ['h1' => ['Users']]; protected static string $addForm = 'user['; - protected static array $addEntitiesShown = ['name', 'username', 'email']; + protected static array $addEntitiesShown = ['name', 'username']; protected static array $overviewSingleNotShown = ['plainPassword']; protected static array $addEntities = [['username' => 'un', 'name' => 'Alice', - 'email' => 'alice@example.org', 'plainPassword' => 'plainpassword', 'ipAddress' => '10.0.0.0', 'enabled' => '1', 'team' => '0', 'user_roles' => ['0' => true, '1' => true]], ['username' => 'ABCabc123_-@', 'name' => 'Allowed username'], - ['username' => 'nem', 'name' => 'No Email', - 'email' => ''], ['username' => 'npw', 'name' => 'No password', 'plainPassword' => ''], ['username' => 'specialchar', 'name' => 'Special char in password', diff --git a/webapp/tests/Unit/Controller/PublicControllerTest.php b/webapp/tests/Unit/Controller/PublicControllerTest.php index 162fadd928..767e2e5639 100644 --- a/webapp/tests/Unit/Controller/PublicControllerTest.php +++ b/webapp/tests/Unit/Controller/PublicControllerTest.php @@ -22,7 +22,7 @@ class PublicControllerTest extends BaseTestCase protected static string $urlTeams = '/jury/teams'; protected static string $urlAffil = '/jury/affiliations'; protected static array $requiredFields = ['teamName','affiliationName','affiliationShortName','existingAffiliation']; - protected static array $formFields = ['username','name','email','teamName','affiliation','affiliationName', + protected static array $formFields = ['username','name','teamName','affiliation','affiliationName', 'affiliationShortName','affiliationCountry','existingAffiliation']; protected static array $duplicateFields = ['username'=>['input'=>'selfregister','error'=>'The username \'"selfregistered"\' is already in use.'], 'teamName'=>['input'=>'Example teamname','error'=>'This team name is already in use.'], @@ -199,7 +199,7 @@ public function testSelfRegisterWrongPassword( self::assertSelectorExists($selector); } - // username, name, email, teamName, affiliation, affiliationName + // username, name, teamName, affiliation, affiliationName // affiliationShortName, affiliationCountry, existingAffiliation // plainPassword public function selfRegisterProvider(): Generator @@ -211,7 +211,7 @@ public function selfRegisterProvider(): Generator } yield[['username'=>'minimaluser', 'teamName'=>'NewTeam','affiliation'=>'none'],'shirt-recognize-bar-together', $fixtures, $category]; yield[['username'=>'bruteforce', 'teamName'=>'Fib(9)','affiliation'=>'none'],'01123581321', $fixtures, $category]; - yield[['username'=>'fullUser', 'name'=>'Full User', 'email'=>'email@domain.com','teamName'=>'Trial','affiliation'=>'none'],'..........', $fixtures, $category]; + yield[['username'=>'fullUser', 'name'=>'Full User', 'teamName'=>'Trial','affiliation'=>'none'],'..........', $fixtures, $category]; yield[['username'=>'student@', 'teamName'=>'Student@Uni', 'affiliation'=>'new','affiliationName'=>'NewUni','affiliationShortName'=>'nu'],'p@ssword_Is_long', $fixtures, $category]; yield[['username'=>'winner@', 'teamName'=>'FunnyTeamname', @@ -220,7 +220,7 @@ public function selfRegisterProvider(): Generator yield[['username'=>'newinstsamecountry', 'name'=>'CompetingDutchTeam', 'teamName'=>'SupperT3@m','affiliation'=>'new','affiliationName'=>'Vrije Universiteit', 'affiliationShortName'=>'vu','affiliationCountry'=>'NLD'],'demodemodemo', $fixtures, $category]; if (count($fixtures)===1) { - yield[['username'=>'reusevaluesofexistinguser', 'name'=>'selfregistered user for example team','email'=>'electronic@mail.tld','teamName'=>'EasyEnough','affiliation'=>'none'],'demodemodemo', [...$fixtures, SelfRegisteredUserFixture::class],'']; + yield[['username'=>'reusevaluesofexistinguser', 'name'=>'selfregistered user for example team','teamName'=>'EasyEnough','affiliation'=>'none'],'demodemodemo', [...$fixtures, SelfRegisteredUserFixture::class],'']; } } } From b7f5a11f4e4022aea7ce7c645ec6f2b9b81c023f Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:14:48 +0100 Subject: [PATCH 2/2] Alternative, don't make it for new installs --- webapp/migrations/Version20190803123217.php | 1 - webapp/migrations/Version20251130111340.php | 31 --------------------- 2 files changed, 32 deletions(-) delete mode 100644 webapp/migrations/Version20251130111340.php diff --git a/webapp/migrations/Version20190803123217.php b/webapp/migrations/Version20190803123217.php index 3adaacdf0e..eca9f8a875 100644 --- a/webapp/migrations/Version20190803123217.php +++ b/webapp/migrations/Version20190803123217.php @@ -593,7 +593,6 @@ protected function createTables() `userid` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique ID', `username` varchar(255) NOT NULL COMMENT 'User login name', `name` varchar(255) NOT NULL COMMENT 'Name', - `email` varchar(255) DEFAULT NULL COMMENT 'Email address', `last_login` decimal(32,9) unsigned DEFAULT NULL COMMENT 'Time of last successful login', `first_login` decimal(32,9) unsigned DEFAULT NULL COMMENT 'Time of first login', `last_ip_address` varchar(255) DEFAULT NULL COMMENT 'Last IP address of successful login', diff --git a/webapp/migrations/Version20251130111340.php b/webapp/migrations/Version20251130111340.php deleted file mode 100644 index 6e2e9d4139..0000000000 --- a/webapp/migrations/Version20251130111340.php +++ /dev/null @@ -1,31 +0,0 @@ -addSql('ALTER TABLE user DROP email'); - } - - public function down(Schema $schema): void - { - $this->addSql('ALTER TABLE user ADD email VARCHAR(255) DEFAULT NULL COMMENT \'Email address\''); - } - - public function isTransactional(): bool - { - return false; - } -}