Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
197 changes: 33 additions & 164 deletions lib/UserBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

namespace OCA\GlobalSiteSelector;

use OC\User\Backend;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\GenericEvent;
use OCP\EventDispatcher\IEventDispatcher;
Expand All @@ -19,14 +18,19 @@
use OCP\IUser;
use OCP\IUserBackend;
use OCP\IUserManager;
use OCP\User\Backend\ICountUsersBackend;
use OCP\User\Backend\ABackend;
use OCP\User\Backend\ICheckPasswordBackend;
use OCP\User\Backend\IGetDisplayNameBackend;
use OCP\User\Backend\ILimitAwareCountUsersBackend;
use OCP\User\Backend\ISetDisplayNameBackend;
use OCP\User\Events\UserFirstTimeLoggedInEvent;
use OCP\UserInterface;
use Override;

class UserBackend implements IUserBackend, UserInterface, ICountUsersBackend {
class UserBackend extends ABackend implements IUserBackend, UserInterface, ICheckPasswordBackend, IGetDisplayNameBackend, ISetDisplayNameBackend, ILimitAwareCountUsersBackend {
private string $dbName = 'global_scale_users';

/** @var UserInterface[] */
/** @var list<UserInterface> */
private static array $backends = [];

public function __construct(
Expand All @@ -39,36 +43,11 @@ public function __construct(
) {
}

/**
* Backend name to be shown in user management
*
* @return string the name of the backend to be shown
* @since 0.11.0
*/
#[\Override]
#[Override]
public function getBackendName(): string {
return 'user_globalsiteselector';
}

/**
* Check if backend implements actions
*
* @param int $actions bitwise-or'ed actions
*
* Returns the supported actions as int to be
* compared with \OC\User\Backend::CREATE_USER etc.
*
* @since 4.5.0
*/
#[\Override]
public function implementsActions($actions): bool {
$availableActions = Backend::CHECK_PASSWORD;
$availableActions |= Backend::GET_DISPLAYNAME;
$availableActions |= Backend::COUNT_USERS;

return (bool)($availableActions & $actions);
}

/**
* Creates a user if it does not exist.
*
Expand Down Expand Up @@ -103,15 +82,7 @@ public function createUserIfNotExists(string $uid): void {
}
}

/**
* delete a user
*
* @param string $uid The username of the user to delete
*
* @return bool
* @since 4.5.0
*/
#[\Override]
#[Override]
public function deleteUser($uid): bool {
if ($this->userExistsInDatabase($uid)) {
/* @var $qb IQueryBuilder */
Expand All @@ -126,17 +97,7 @@ public function deleteUser($uid): bool {
return false;
}

/**
* Get a list of all users
*
* @param string $search
* @param null|int $limit
* @param null|int $offset
*
* @return string[] an array of all uids
* @since 4.5.0
*/
#[\Override]
#[Override]
public function getUsers($search = '', $limit = null, $offset = null): array {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
Expand Down Expand Up @@ -165,13 +126,8 @@ public function getUsers($search = '', $limit = null, $offset = null): array {
return $uids;
}

/**
* counts the users in the database
*
* @return int|bool
*/
#[\Override]
public function countUsers(): int {
#[Override]
public function countUsers(int $limit = 0): int|false {
$query = $this->db->getQueryBuilder();
$query->select($query->func()->count('uid'))
->from($this->dbName);
Expand All @@ -180,28 +136,13 @@ public function countUsers(): int {
return $result->fetchColumn();
}

/**
* check if a user exists
*
* @param string $uid the username
*
* @return boolean
* @since 4.5.0
*/
#[\Override]
#[Override]
public function userExists($uid): bool {
if ($backend = $this->getActualUserBackend($uid)) {
return $backend->userExists($uid);
} else {
return $this->userExistsInDatabase($uid);
}
return $this->userExistsInDatabase($uid);
}

#[Override]
public function setDisplayName(string $uid, string $displayName): bool {
if ($backend = $this->getActualUserBackend($uid)) {
return $backend->setDisplayName($uid, $displayName);
}

if ($this->userExistsInDatabase($uid)) {
$qb = $this->db->getQueryBuilder();
$qb->update($this->dbName)
Expand All @@ -215,47 +156,25 @@ public function setDisplayName(string $uid, string $displayName): bool {
return false;
}

/**
* Get display name of the user
*
* @param string $uid user ID of the user
*
* @return string display name
* @since 4.5.0
*/
#[\Override]
#[Override]
public function getDisplayName($uid): string {
if ($backend = $this->getActualUserBackend($uid)) {
return $backend->getDisplayName($uid);
} else {
if ($this->userExistsInDatabase($uid)) {
$qb = $this->db->getQueryBuilder();
$qb->select('displayname')
->from($this->dbName)
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
->setMaxResults(1);
$result = $qb->executeQuery();
$users = $result->fetchAll();
if (isset($users[0]['displayname'])) {
return $users[0]['displayname'];
}
if ($this->userExistsInDatabase($uid)) {
$qb = $this->db->getQueryBuilder();
$qb->select('displayname')
->from($this->dbName)
->where($qb->expr()->eq('uid', $qb->createNamedParameter($uid)))
->setMaxResults(1);
$result = $qb->executeQuery();
$users = $result->fetchAll();
if (isset($users[0]['displayname'])) {
return $users[0]['displayname'];
}
}

return false;
}

/**
* Get a list of all display names and user ids.
*
* @param string $search
* @param string|null $limit
* @param string|null $offset
*
* @return array an array of all displayNames (value) and the corresponding uids (key)
* @since 4.5.0
*/
#[\Override]
#[Override]
public function getDisplayNames($search = '', $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('uid', 'displayname')
Expand Down Expand Up @@ -290,13 +209,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null): ar
return $uids;
}

/**
* Check if a user list is available or not
*
* @return boolean if users can be listed or not
* @since 4.5.0
*/
#[\Override]
#[Override]
public function hasUserListings(): bool {
return true;
}
Expand Down Expand Up @@ -329,60 +242,20 @@ public function getCurrentUserId(): string {
return '';
}

/**
* Check if the provided token is correct
*
* @param string $uid The username
* @param string $password The password
*
* @return string
*
* There is no password, authentication happens on the global site selector master
*/
public function checkPassword(string $uid, string $password) {
#[Override]
public function checkPassword(string $loginName, string $password) {
// if the user was successfully authenticated by the global site selector
// master and forwarded to the client the uid is stored in the session.
// In this case we can trust the global site selector that the password was
// checked.
$currentUid = $this->session->get('globalScale.uid');
if ($currentUid === $uid) {
return $uid;
if ($currentUid === $loginName) {
return $loginName;
}

return false;
}

/**
* Gets the actual user backend of the user
*
* @param string $uid
*
* @return null|UserInterface
*/
public function getActualUserBackend(string $uid): ?UserInterface {
foreach (self::$backends as $backend) {
if ($backend->userExists($uid)) {
return $backend;
}
}

return null;
}

/**
* Registers the used backends, used later to get the actual user backend
* of the user.
*
* @param UserInterface[] $backends
*/
public function registerBackends(array $backends): void {
foreach ($backends as $backend) {
if (!($backend instanceof UserBackend)) {
self::$backends[] = $backend;
}
}
}

public function updateAttributes(string $uid, array $attributes): void {
$user = $this->userManager->get($uid);

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

/**
* Whether $uid exists in the database
*
* @param string $uid
*
* @return bool
*/
protected function userExistsInDatabase(string $uid): bool {
/* @var $qb IQueryBuilder */
Expand Down
Loading