From 39b2fb5f5c7749d5007bd06ecbdc9daab5dc04d3 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 04:28:52 +0100 Subject: [PATCH 1/8] Add case insensitiviti to email search + test cases Bug: T415017 --- app/Console/Commands/User/CheckUserEmailExist.php | 2 +- app/Services/WikiUserEmailChecker.php | 2 +- app/User.php | 4 ++++ tests/Commands/User/CheckUserEmailExistTest.php | 9 +++++++++ tests/Services/WikiUserEmailCheckerTest.php | 8 ++++++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/User/CheckUserEmailExist.php b/app/Console/Commands/User/CheckUserEmailExist.php index 5b33f180..859edd77 100644 --- a/app/Console/Commands/User/CheckUserEmailExist.php +++ b/app/Console/Commands/User/CheckUserEmailExist.php @@ -16,7 +16,7 @@ public function handle(WikiUserEmailChecker $emailChecker): int { foreach ($emails as $email) { $found = false; - if (User::whereEmail($email)->exists()) { + if (User::whereEmailInsensitive($email)->exists()) { $this->line("FOUND: {$email} in apidb.users"); $found = true; } diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index fff4c9ed..b6ba660c 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -51,7 +51,7 @@ private function emailExists(PDO $pdo, string $dbName, string $table, string $em $stmt = $pdo->prepare(" SELECT 1 FROM {$dbName}.{$table} - WHERE user_email = :email + WHERE LOWER(user_email) = LOWER(:email) LIMIT 1 "); diff --git a/app/User.php b/app/User.php index 45459e71..e809eed8 100644 --- a/app/User.php +++ b/app/User.php @@ -121,4 +121,8 @@ public function sendEmailVerificationNotification() { public function getEmailForVerification() { return $this->email; } + + public function scopeWhereEmailInsensitive($query, string $email) { + return $query->whereRaw('LOWER(email) = ?', [strtolower($email)]); + } } diff --git a/tests/Commands/User/CheckUserEmailExistTest.php b/tests/Commands/User/CheckUserEmailExistTest.php index 57d74867..a0197d1b 100644 --- a/tests/Commands/User/CheckUserEmailExistTest.php +++ b/tests/Commands/User/CheckUserEmailExistTest.php @@ -51,4 +51,13 @@ public function testEmailFoundInWikiDb() { ->expectsOutput('FOUND: test@example.com in mwdb_test.mwdb_test_user') ->assertExitCode(0); } + + public function testCaseInsensitive() { + User::factory()->create([ + 'email' => 'Test@Example.com', + ]); + $exists = User::whereEmailInsensitive('test@example.com')->exists(); + + $this->assertTrue($exists); + } } diff --git a/tests/Services/WikiUserEmailCheckerTest.php b/tests/Services/WikiUserEmailCheckerTest.php index 759ca38a..d56d0401 100644 --- a/tests/Services/WikiUserEmailCheckerTest.php +++ b/tests/Services/WikiUserEmailCheckerTest.php @@ -62,4 +62,12 @@ public function testEmailFoundInMultipleDatabases(): void { $checker->findEmail('user1@email.localhost') ); } + + public function testWikiUserEmailCheckerIsCaseInsensitive(): void { + $checker = new WikiUserEmailChecker($this->db); + $this->assertEquals( + ['mwdb_1.db_1_user'], + $checker->findEmail('uSer2@eMAil.localhost') + ); + } } From 2c106257292d4fb548506f6b0b1a6815802f1833 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 04:28:52 +0100 Subject: [PATCH 2/8] Add case insensitiviti to email search + test cases Bug: T415017 --- tests/Services/WikiUserEmailCheckerTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Services/WikiUserEmailCheckerTest.php b/tests/Services/WikiUserEmailCheckerTest.php index d56d0401..4d10eb74 100644 --- a/tests/Services/WikiUserEmailCheckerTest.php +++ b/tests/Services/WikiUserEmailCheckerTest.php @@ -16,6 +16,7 @@ class WikiUserEmailCheckerTest extends TestCase { ['prefix' => 'db_1', 'name' => 'mwdb_1', 'emails' => ['user1@email.localhost', 'user2@email.localhost']], ['prefix' => 'db_2', 'name' => 'mwdb_2', 'emails' => ['user1@email.localhost']], ['prefix' => 'db_3', 'name' => 'mwdb_3', 'emails' => []], + ['prefix' => 'db_4', 'name' => 'mwdb_4', 'emails' => ['User4@Email.localhost']], ]; protected function setUp(): void { From 3cd57d9695401a9c4d4e0edcc3f20e2234ae5963 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 09:40:53 +0100 Subject: [PATCH 3/8] Improve perfomance of WikiUserEmailChecker by reducing number of queries Bug: T415017 --- app/Services/WikiUserEmailChecker.php | 35 +++++++++------------ tests/Services/WikiUserEmailCheckerTest.php | 3 +- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index b6ba660c..7c68d5b7 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -12,19 +12,11 @@ public function findEmail(string $email): array { $this->db->purge('mw'); $pdo = $this->db->connection('mw')->getPdo(); - $mwDatabases = $pdo - ->query("SHOW DATABASES LIKE 'mwdb_%'") - ->fetchAll(PDO::FETCH_COLUMN); - $foundIn = []; - foreach ($mwDatabases as $dbName) { - $userTable = $this->findUserTable($pdo, $dbName); - - if (!$userTable) { - continue; - } + $userTables = $this->loadAllUserTables($pdo); + foreach ($userTables as $dbName => $userTable) { if ($this->emailExists($pdo, $dbName, $userTable, $email)) { $foundIn[] = "{$dbName}.{$userTable}"; } @@ -33,18 +25,21 @@ public function findEmail(string $email): array { return $foundIn; } - private function findUserTable(PDO $pdo, string $dbName): ?string { - $stmt = $pdo->prepare(" - SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA = :db - AND TABLE_NAME LIKE '%\_user' - LIMIT 1 - "); + private function loadAllUserTables(PDO $pdo): array { + $stmt = $pdo->query(" + SELECT TABLE_SCHEMA, TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA LIKE 'mwdb\_%' + AND TABLE_NAME LIKE '%\_user' + "); - $stmt->execute(['db' => $dbName]); + $tablesByDb = []; + + foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { + $tablesByDb[$row['TABLE_SCHEMA']] = $row['TABLE_NAME']; + } - return $stmt->fetchColumn() ?: null; + return $tablesByDb; } private function emailExists(PDO $pdo, string $dbName, string $table, string $email): bool { diff --git a/tests/Services/WikiUserEmailCheckerTest.php b/tests/Services/WikiUserEmailCheckerTest.php index 4d10eb74..c21d5f53 100644 --- a/tests/Services/WikiUserEmailCheckerTest.php +++ b/tests/Services/WikiUserEmailCheckerTest.php @@ -16,7 +16,6 @@ class WikiUserEmailCheckerTest extends TestCase { ['prefix' => 'db_1', 'name' => 'mwdb_1', 'emails' => ['user1@email.localhost', 'user2@email.localhost']], ['prefix' => 'db_2', 'name' => 'mwdb_2', 'emails' => ['user1@email.localhost']], ['prefix' => 'db_3', 'name' => 'mwdb_3', 'emails' => []], - ['prefix' => 'db_4', 'name' => 'mwdb_4', 'emails' => ['User4@Email.localhost']], ]; protected function setUp(): void { @@ -58,7 +57,7 @@ public function testCorrectDatabaseFound(): void { public function testEmailFoundInMultipleDatabases(): void { $checker = new WikiUserEmailChecker($this->db); - $this->assertEquals( + $this->assertEqualsCanonicalizing( ['mwdb_1.db_1_user', 'mwdb_2.db_2_user'], $checker->findEmail('user1@email.localhost') ); From a4c800b38c97fb0cb4c3e3579462965b4c6cd4c7 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 17:00:28 +0100 Subject: [PATCH 4/8] Update app/Services/WikiUserEmailChecker.php Co-authored-by: Ollie <43674967+outdooracorn@users.noreply.github.com> --- app/Services/WikiUserEmailChecker.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index 7c68d5b7..71ea1758 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -30,7 +30,8 @@ private function loadAllUserTables(PDO $pdo): array { SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE 'mwdb\_%' - AND TABLE_NAME LIKE '%\_user' + WHERE TABLE_SCHEMA LIKE 'mwdb_%' + AND TABLE_NAME LIKE '%_user' "); $tablesByDb = []; From 4b8a49d03edaf04aeb014bb15d875dc8df68cf12 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 17:00:49 +0100 Subject: [PATCH 5/8] Update app/Services/WikiUserEmailChecker.php Co-authored-by: Ollie <43674967+outdooracorn@users.noreply.github.com> --- app/Services/WikiUserEmailChecker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index 71ea1758..afc35474 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -14,7 +14,7 @@ public function findEmail(string $email): array { $foundIn = []; - $userTables = $this->loadAllUserTables($pdo); + $userTables = $this->getAllMediaWikiUserTables($pdo); foreach ($userTables as $dbName => $userTable) { if ($this->emailExists($pdo, $dbName, $userTable, $email)) { From a57277f6c6fc79198605e0433d72c68dd5032099 Mon Sep 17 00:00:00 2001 From: Perside Rosalie Date: Thu, 22 Jan 2026 17:01:02 +0100 Subject: [PATCH 6/8] Update app/Services/WikiUserEmailChecker.php Co-authored-by: Ollie <43674967+outdooracorn@users.noreply.github.com> --- app/Services/WikiUserEmailChecker.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index afc35474..5dcce22e 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -25,11 +25,10 @@ public function findEmail(string $email): array { return $foundIn; } - private function loadAllUserTables(PDO $pdo): array { + private function getAllMediaWikiUserTables(PDO $pdo): array { $stmt = $pdo->query(" SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA LIKE 'mwdb\_%' WHERE TABLE_SCHEMA LIKE 'mwdb_%' AND TABLE_NAME LIKE '%_user' "); From 82dbab4af7917d5b8895391b8c63a9fefe61d121 Mon Sep 17 00:00:00 2001 From: Ollie Date: Fri, 23 Jan 2026 11:08:46 +0000 Subject: [PATCH 7/8] Fix indenting --- app/Services/WikiUserEmailChecker.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index 5dcce22e..d758759b 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -27,11 +27,11 @@ public function findEmail(string $email): array { private function getAllMediaWikiUserTables(PDO $pdo): array { $stmt = $pdo->query(" - SELECT TABLE_SCHEMA, TABLE_NAME - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA LIKE 'mwdb_%' - AND TABLE_NAME LIKE '%_user' - "); + SELECT TABLE_SCHEMA, TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA LIKE 'mwdb_%' + AND TABLE_NAME LIKE '%_user' + "); $tablesByDb = []; From 489a0ffc3c1b6986e93700fcb7b8474e86f2ae72 Mon Sep 17 00:00:00 2001 From: dena <91744937+deer-wmde@users.noreply.github.com> Date: Fri, 23 Jan 2026 14:38:14 +0100 Subject: [PATCH 8/8] Update WikiUserEmailChecker.php fix mistake from merge --- app/Services/WikiUserEmailChecker.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Services/WikiUserEmailChecker.php b/app/Services/WikiUserEmailChecker.php index 54d37889..6efa4e69 100644 --- a/app/Services/WikiUserEmailChecker.php +++ b/app/Services/WikiUserEmailChecker.php @@ -46,7 +46,6 @@ private function emailExists(PDO $pdo, string $dbName, string $table, string $em $stmt = $pdo->prepare(" SELECT 1 FROM {$dbName}.{$table} - WHERE LOWER(user_email) = LOWER(:email) WHERE LOWER(CONVERT(user_email USING utf8mb4)) = LOWER(:email) LIMIT 1 ");