diff --git a/lib/Migration/Version4002Date20250501195008.php b/lib/Migration/Version4002Date20250501195008.php index fb82e9ea..95727b37 100644 --- a/lib/Migration/Version4002Date20250501195008.php +++ b/lib/Migration/Version4002Date20250501195008.php @@ -45,6 +45,7 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt 'length' => 64, 'default' => '', ]); + $table->addIndex(['email'], 'guests_users_email'); return $schema; } diff --git a/lib/UserBackend.php b/lib/UserBackend.php index 1179434a..de51da50 100644 --- a/lib/UserBackend.php +++ b/lib/UserBackend.php @@ -229,6 +229,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null): ar ) // sqlite doesn't like re-using a single named parameter here ->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) + ->orWhere($query->expr()->iLike('email', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) ->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) ->orderBy($query->func()->lower('displayname'), 'ASC') @@ -294,6 +295,11 @@ public function checkPassword(string $loginName, string $password) { $qb->expr()->eq( 'uid_lower', $qb->createNamedParameter(mb_strtolower($loginName)) ) + ) + ->orWhere( + $qb->expr()->eq( + 'email', $qb->createNamedParameter($loginName) + ) ); $result = $qb->executeQuery(); $row = $result->fetch(); @@ -339,6 +345,11 @@ private function loadUser($uid): bool { $qb->expr()->eq( 'uid_lower', $qb->createNamedParameter(mb_strtolower($uid)) ) + ) + ->orWhere( + $qb->expr()->eq( + 'email', $qb->createNamedParameter($uid) + ) ); $result = $qb->executeQuery(); $row = $result->fetch(); diff --git a/tests/unit/UserBackendTest.php b/tests/unit/UserBackendTest.php index 423921e1..2e211e5c 100644 --- a/tests/unit/UserBackendTest.php +++ b/tests/unit/UserBackendTest.php @@ -70,4 +70,21 @@ public function testNoListing(): void { $this->assertEquals([], $this->backend->getUsers()); } + + public function testHashedUid(): void { + $email = 'foo@example.tld'; + $uid = hash('sha256', $email); + $this->backend->createUser($uid, 'bar'); + $this->backend->setInitialEmail($uid, $email); + $this->backend->setDisplayName($uid, 'foo'); + $this->assertTrue($this->backend->userExists($email)); + + $this->assertEquals($uid, $this->backend->checkPassword($email, 'bar')); + + $this->assertEquals('foo', $this->backend->getDisplayName($uid)); + $this->assertEquals('foo', $this->backend->getDisplayName($email)); + $this->assertEquals(['foo'], array_values($this->backend->getDisplayNames($uid))); + $this->assertEquals(['foo'], array_values($this->backend->getDisplayNames($email))); + $this->assertEquals(['foo'], array_values($this->backend->getDisplayNames(substr($email, 0, 10)))); + } }