Skip to content

Commit 3484e00

Browse files
authored
Merge pull request #1542 from nextcloud/hash-email-login
fix: fix login with email when using hashed uids
2 parents 166c60c + e375f28 commit 3484e00

3 files changed

Lines changed: 29 additions & 0 deletions

File tree

lib/Migration/Version4002Date20250501195008.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public function changeSchema(IOutput $output, Closure $schemaClosure, array $opt
4545
'length' => 64,
4646
'default' => '',
4747
]);
48+
$table->addIndex(['email'], 'guests_users_email');
4849
return $schema;
4950
}
5051

lib/UserBackend.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null): ar
229229
)
230230
// sqlite doesn't like re-using a single named parameter here
231231
->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
232+
->orWhere($query->expr()->iLike('email', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
232233
->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
233234
->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%')))
234235
->orderBy($query->func()->lower('displayname'), 'ASC')
@@ -294,6 +295,11 @@ public function checkPassword(string $loginName, string $password) {
294295
$qb->expr()->eq(
295296
'uid_lower', $qb->createNamedParameter(mb_strtolower($loginName))
296297
)
298+
)
299+
->orWhere(
300+
$qb->expr()->eq(
301+
'email', $qb->createNamedParameter($loginName)
302+
)
297303
);
298304
$result = $qb->executeQuery();
299305
$row = $result->fetch();
@@ -339,6 +345,11 @@ private function loadUser($uid): bool {
339345
$qb->expr()->eq(
340346
'uid_lower', $qb->createNamedParameter(mb_strtolower($uid))
341347
)
348+
)
349+
->orWhere(
350+
$qb->expr()->eq(
351+
'email', $qb->createNamedParameter($uid)
352+
)
342353
);
343354
$result = $qb->executeQuery();
344355
$row = $result->fetch();

tests/unit/UserBackendTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,21 @@ public function testNoListing(): void {
7070

7171
$this->assertEquals([], $this->backend->getUsers());
7272
}
73+
74+
public function testHashedUid(): void {
75+
$email = 'foo@example.tld';
76+
$uid = hash('sha256', $email);
77+
$this->backend->createUser($uid, 'bar');
78+
$this->backend->setInitialEmail($uid, $email);
79+
$this->backend->setDisplayName($uid, 'foo');
80+
$this->assertTrue($this->backend->userExists($email));
81+
82+
$this->assertEquals($uid, $this->backend->checkPassword($email, 'bar'));
83+
84+
$this->assertEquals('foo', $this->backend->getDisplayName($uid));
85+
$this->assertEquals('foo', $this->backend->getDisplayName($email));
86+
$this->assertEquals(['foo'], array_values($this->backend->getDisplayNames($uid)));
87+
$this->assertEquals(['foo'], array_values($this->backend->getDisplayNames($email)));
88+
$this->assertEquals(['foo'], array_values($this->backend->getDisplayNames(substr($email, 0, 10))));
89+
}
7390
}

0 commit comments

Comments
 (0)