Skip to content

Commit 90d2e96

Browse files
authored
Merge pull request #219 from nextcloud/carl/modernize-userbackend
refactor: Modernize user backend
2 parents b414d6e + 25a5a17 commit 90d2e96

1 file changed

Lines changed: 33 additions & 164 deletions

File tree

lib/UserBackend.php

Lines changed: 33 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
namespace OCA\GlobalSiteSelector;
99

10-
use OC\User\Backend;
1110
use OCP\DB\QueryBuilder\IQueryBuilder;
1211
use OCP\EventDispatcher\GenericEvent;
1312
use OCP\EventDispatcher\IEventDispatcher;
@@ -19,14 +18,19 @@
1918
use OCP\IUser;
2019
use OCP\IUserBackend;
2120
use OCP\IUserManager;
22-
use OCP\User\Backend\ICountUsersBackend;
21+
use OCP\User\Backend\ABackend;
22+
use OCP\User\Backend\ICheckPasswordBackend;
23+
use OCP\User\Backend\IGetDisplayNameBackend;
24+
use OCP\User\Backend\ILimitAwareCountUsersBackend;
25+
use OCP\User\Backend\ISetDisplayNameBackend;
2326
use OCP\User\Events\UserFirstTimeLoggedInEvent;
2427
use OCP\UserInterface;
28+
use Override;
2529

26-
class UserBackend implements IUserBackend, UserInterface, ICountUsersBackend {
30+
class UserBackend extends ABackend implements IUserBackend, UserInterface, ICheckPasswordBackend, IGetDisplayNameBackend, ISetDisplayNameBackend, ILimitAwareCountUsersBackend {
2731
private string $dbName = 'global_scale_users';
2832

29-
/** @var UserInterface[] */
33+
/** @var list<UserInterface> */
3034
private static array $backends = [];
3135

3236
public function __construct(
@@ -39,36 +43,11 @@ public function __construct(
3943
) {
4044
}
4145

42-
/**
43-
* Backend name to be shown in user management
44-
*
45-
* @return string the name of the backend to be shown
46-
* @since 0.11.0
47-
*/
48-
#[\Override]
46+
#[Override]
4947
public function getBackendName(): string {
5048
return 'user_globalsiteselector';
5149
}
5250

53-
/**
54-
* Check if backend implements actions
55-
*
56-
* @param int $actions bitwise-or'ed actions
57-
*
58-
* Returns the supported actions as int to be
59-
* compared with \OC\User\Backend::CREATE_USER etc.
60-
*
61-
* @since 4.5.0
62-
*/
63-
#[\Override]
64-
public function implementsActions($actions): bool {
65-
$availableActions = Backend::CHECK_PASSWORD;
66-
$availableActions |= Backend::GET_DISPLAYNAME;
67-
$availableActions |= Backend::COUNT_USERS;
68-
69-
return (bool)($availableActions & $actions);
70-
}
71-
7251
/**
7352
* Creates a user if it does not exist.
7453
*
@@ -103,15 +82,7 @@ public function createUserIfNotExists(string $uid): void {
10382
}
10483
}
10584

106-
/**
107-
* delete a user
108-
*
109-
* @param string $uid The username of the user to delete
110-
*
111-
* @return bool
112-
* @since 4.5.0
113-
*/
114-
#[\Override]
85+
#[Override]
11586
public function deleteUser($uid): bool {
11687
if ($this->userExistsInDatabase($uid)) {
11788
/* @var $qb IQueryBuilder */
@@ -126,17 +97,7 @@ public function deleteUser($uid): bool {
12697
return false;
12798
}
12899

129-
/**
130-
* Get a list of all users
131-
*
132-
* @param string $search
133-
* @param null|int $limit
134-
* @param null|int $offset
135-
*
136-
* @return string[] an array of all uids
137-
* @since 4.5.0
138-
*/
139-
#[\Override]
100+
#[Override]
140101
public function getUsers($search = '', $limit = null, $offset = null): array {
141102
/* @var $qb IQueryBuilder */
142103
$qb = $this->db->getQueryBuilder();
@@ -165,13 +126,8 @@ public function getUsers($search = '', $limit = null, $offset = null): array {
165126
return $uids;
166127
}
167128

168-
/**
169-
* counts the users in the database
170-
*
171-
* @return int|bool
172-
*/
173-
#[\Override]
174-
public function countUsers(): int {
129+
#[Override]
130+
public function countUsers(int $limit = 0): int|false {
175131
$query = $this->db->getQueryBuilder();
176132
$query->select($query->func()->count('uid'))
177133
->from($this->dbName);
@@ -180,28 +136,13 @@ public function countUsers(): int {
180136
return $result->fetchColumn();
181137
}
182138

183-
/**
184-
* check if a user exists
185-
*
186-
* @param string $uid the username
187-
*
188-
* @return boolean
189-
* @since 4.5.0
190-
*/
191-
#[\Override]
139+
#[Override]
192140
public function userExists($uid): bool {
193-
if ($backend = $this->getActualUserBackend($uid)) {
194-
return $backend->userExists($uid);
195-
} else {
196-
return $this->userExistsInDatabase($uid);
197-
}
141+
return $this->userExistsInDatabase($uid);
198142
}
199143

144+
#[Override]
200145
public function setDisplayName(string $uid, string $displayName): bool {
201-
if ($backend = $this->getActualUserBackend($uid)) {
202-
return $backend->setDisplayName($uid, $displayName);
203-
}
204-
205146
if ($this->userExistsInDatabase($uid)) {
206147
$qb = $this->db->getQueryBuilder();
207148
$qb->update($this->dbName)
@@ -215,47 +156,25 @@ public function setDisplayName(string $uid, string $displayName): bool {
215156
return false;
216157
}
217158

218-
/**
219-
* Get display name of the user
220-
*
221-
* @param string $uid user ID of the user
222-
*
223-
* @return string display name
224-
* @since 4.5.0
225-
*/
226-
#[\Override]
159+
#[Override]
227160
public function getDisplayName($uid): string {
228-
if ($backend = $this->getActualUserBackend($uid)) {
229-
return $backend->getDisplayName($uid);
230-
} else {
231-
if ($this->userExistsInDatabase($uid)) {
232-
$qb = $this->db->getQueryBuilder();
233-
$qb->select('displayname')
234-
->from($this->dbName)
235-
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
236-
->setMaxResults(1);
237-
$result = $qb->executeQuery();
238-
$users = $result->fetchAll();
239-
if (isset($users[0]['displayname'])) {
240-
return $users[0]['displayname'];
241-
}
161+
if ($this->userExistsInDatabase($uid)) {
162+
$qb = $this->db->getQueryBuilder();
163+
$qb->select('displayname')
164+
->from($this->dbName)
165+
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
166+
->setMaxResults(1);
167+
$result = $qb->executeQuery();
168+
$users = $result->fetchAll();
169+
if (isset($users[0]['displayname'])) {
170+
return $users[0]['displayname'];
242171
}
243172
}
244173

245174
return false;
246175
}
247176

248-
/**
249-
* Get a list of all display names and user ids.
250-
*
251-
* @param string $search
252-
* @param string|null $limit
253-
* @param string|null $offset
254-
*
255-
* @return array an array of all displayNames (value) and the corresponding uids (key)
256-
* @since 4.5.0
257-
*/
258-
#[\Override]
177+
#[Override]
259178
public function getDisplayNames($search = '', $limit = null, $offset = null): array {
260179
$qb = $this->db->getQueryBuilder();
261180
$qb->select('uid', 'displayname')
@@ -290,13 +209,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null): ar
290209
return $uids;
291210
}
292211

293-
/**
294-
* Check if a user list is available or not
295-
*
296-
* @return boolean if users can be listed or not
297-
* @since 4.5.0
298-
*/
299-
#[\Override]
212+
#[Override]
300213
public function hasUserListings(): bool {
301214
return true;
302215
}
@@ -329,60 +242,20 @@ public function getCurrentUserId(): string {
329242
return '';
330243
}
331244

332-
/**
333-
* Check if the provided token is correct
334-
*
335-
* @param string $uid The username
336-
* @param string $password The password
337-
*
338-
* @return string
339-
*
340-
* There is no password, authentication happens on the global site selector master
341-
*/
342-
public function checkPassword(string $uid, string $password) {
245+
#[Override]
246+
public function checkPassword(string $loginName, string $password) {
343247
// if the user was successfully authenticated by the global site selector
344248
// master and forwarded to the client the uid is stored in the session.
345249
// In this case we can trust the global site selector that the password was
346250
// checked.
347251
$currentUid = $this->session->get('globalScale.uid');
348-
if ($currentUid === $uid) {
349-
return $uid;
252+
if ($currentUid === $loginName) {
253+
return $loginName;
350254
}
351255

352256
return false;
353257
}
354258

355-
/**
356-
* Gets the actual user backend of the user
357-
*
358-
* @param string $uid
359-
*
360-
* @return null|UserInterface
361-
*/
362-
public function getActualUserBackend(string $uid): ?UserInterface {
363-
foreach (self::$backends as $backend) {
364-
if ($backend->userExists($uid)) {
365-
return $backend;
366-
}
367-
}
368-
369-
return null;
370-
}
371-
372-
/**
373-
* Registers the used backends, used later to get the actual user backend
374-
* of the user.
375-
*
376-
* @param UserInterface[] $backends
377-
*/
378-
public function registerBackends(array $backends): void {
379-
foreach ($backends as $backend) {
380-
if (!($backend instanceof UserBackend)) {
381-
self::$backends[] = $backend;
382-
}
383-
}
384-
}
385-
386259
public function updateAttributes(string $uid, array $attributes): void {
387260
$user = $this->userManager->get($uid);
388261

@@ -444,10 +317,6 @@ public function updateAttributes(string $uid, array $attributes): void {
444317

445318
/**
446319
* Whether $uid exists in the database
447-
*
448-
* @param string $uid
449-
*
450-
* @return bool
451320
*/
452321
protected function userExistsInDatabase(string $uid): bool {
453322
/* @var $qb IQueryBuilder */

0 commit comments

Comments
 (0)