Skip to content

Commit 0ecb9ca

Browse files
authored
Merge pull request #874 from nextcloud/fix/refactor-credential-mapper
fix: refactor credential mapper
2 parents 0e94ef4 + 53f4f83 commit 0ecb9ca

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

lib/Db/PublicKeyCredentialEntityMapper.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use OCP\DB\Exception;
1616
use OCP\DB\QueryBuilder\IQueryBuilder;
1717
use OCP\IDBConnection;
18-
use OCP\IUser;
1918

2019
/**
2120
* @template-extends QBMapper<PublicKeyCredentialEntity>
@@ -104,17 +103,21 @@ public function findById(int $id, string $userId): ?PublicKeyCredentialEntity {
104103
}
105104
}
106105

107-
/**
108-
* @param IUser $user
109-
* @param int $id
110-
*/
111-
public function findPublicKeyCredential($publicKeyCredentialId): ?PublicKeyCredentialEntity {
112-
/* @var $qb IQueryBuilder */
106+
public function findPublicKeyCredential(string $publicKeyCredentialId, string $userId): ?PublicKeyCredentialEntity {
113107
$qb = $this->db->getQueryBuilder();
114108

115109
$qb->select('id', 'name', 'public_key_credential_id', 'type', 'transports', 'attestation_type', 'trust_path', 'aaguid', 'credential_public_key', 'user_handle', 'counter', 'active', 'created_at')
116110
->from('twofactor_webauthn_regs')
117-
->where($qb->expr()->eq('public_key_credential_id', $qb->createNamedParameter($publicKeyCredentialId)));
111+
->where($qb->expr()->eq(
112+
'public_key_credential_id',
113+
$qb->createNamedParameter($publicKeyCredentialId, IQueryBuilder::PARAM_STR),
114+
IQueryBuilder::PARAM_STR,
115+
))
116+
->andWhere($qb->expr()->eq(
117+
'user_handle',
118+
$qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR),
119+
IQueryBuilder::PARAM_STR,
120+
));
118121
try {
119122
return $this->findEntity($qb);
120123
} catch (\Exception $exception) {
@@ -136,7 +139,7 @@ public function findPublicKeyCredentials(string $uid): array {
136139
}
137140

138141
public function insertOrUpdate(Entity $entity): Entity {
139-
$publicKeyCredentialEntity = $this->findPublicKeyCredential($entity->getPublicKeyCredentialId());
142+
$publicKeyCredentialEntity = $this->findPublicKeyCredential($entity->getPublicKeyCredentialId(), $entity->getUserHandle());
140143
if ($publicKeyCredentialEntity !== null) {
141144
$entity->setId($publicKeyCredentialEntity->getId());
142145
return parent::update($entity);

lib/Repository/WebauthnPublicKeyCredentialSourceRepository.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ class WebauthnPublicKeyCredentialSourceRepository implements PublicKeyCredential
2828
/** @var ITimeFactory */
2929
private $time;
3030

31+
private ?string $userId;
32+
3133
/**
3234
* @param PublicKeyCredentialEntityMapper $publicKeyCredentialEntityMapper
3335
*/
3436
public function __construct(PublicKeyCredentialEntityMapper $publicKeyCredentialEntityMapper,
35-
ITimeFactory $time) {
37+
ITimeFactory $time,
38+
?string $userId) {
3639
$this->publicKeyCredentialEntityMapper = $publicKeyCredentialEntityMapper;
3740
$this->time = $time;
41+
$this->userId = $userId;
3842
}
3943

4044
public function has(string $credentialId): bool {
@@ -58,7 +62,11 @@ public function updateCounterFor(string $credentialId, int $newCounter): void {
5862
}
5963

6064
public function findOneByCredentialId(string $publicKeyCredentialId): ?PublicKeyCredentialSource {
61-
$entity = $this->publicKeyCredentialEntityMapper->findPublicKeyCredential(base64_encode($publicKeyCredentialId));
65+
if ($this->userId === null) {
66+
return null;
67+
}
68+
69+
$entity = $this->publicKeyCredentialEntityMapper->findPublicKeyCredential(base64_encode($publicKeyCredentialId), $this->userId);
6270
return $entity === null ? null : $entity->toPublicKeyCredentialSource();
6371
}
6472

@@ -88,7 +96,7 @@ private function getName(PublicKeyCredentialSource $publicKeyCredentialSource, ?
8896
return $name;
8997
}
9098

91-
$entity = $this->publicKeyCredentialEntityMapper->findPublicKeyCredential(base64_encode($publicKeyCredentialSource->getPublicKeyCredentialId()));
99+
$entity = $this->publicKeyCredentialEntityMapper->findPublicKeyCredential(base64_encode($publicKeyCredentialSource->publicKeyCredentialId), $publicKeyCredentialSource->userHandle);
92100
return $entity === null ? 'default' : $entity->getName();
93101
}
94102
}

0 commit comments

Comments
 (0)