diff --git a/lib/Config.php b/lib/Config.php index 98ef4c6..1cb3792 100644 --- a/lib/Config.php +++ b/lib/Config.php @@ -56,6 +56,8 @@ class Config { const CONFIG_KEY_COUNT_USERS = 'count_users'; const CONFIG_KEY_GET_HOME = 'get_home'; const CONFIG_KEY_CREATE_USER = 'create_user'; + const CONFIG_KEY_GET_EMAIL_ADDRESS = 'get_email_address'; + const CONFIG_KEY_GET_GROUPS = 'get_groups'; /* @var LoggerInterface */ private $logger; @@ -218,6 +220,14 @@ public function getQueryCreateUser() { return $this->getQueryStringOrFalse(self::CONFIG_KEY_CREATE_USER); } + public function getQueryGetEmailAddress() { + return $this->getQueryStringOrFalse(self::CONFIG_KEY_GET_EMAIL_ADDRESS); + } + + public function getQueryGetGroups() { + return $this->getQueryStringOrFalse(self::CONFIG_KEY_GET_GROUPS); + } + /** * Tries to read a config value and throws an exception if it is not set. * This is used for config keys that are mandatory. diff --git a/lib/UserBackend.php b/lib/UserBackend.php index 47a1bbb..c0cf3d6 100644 --- a/lib/UserBackend.php +++ b/lib/UserBackend.php @@ -23,6 +23,8 @@ use Psr\Log\LoggerInterface; use OC\User\Backend; +use OCP\IUserManager; +use OCP\IGroupManager; class UserBackend implements \OCP\IUserBackend, \OCP\UserInterface { @@ -30,13 +32,17 @@ class UserBackend implements \OCP\IUserBackend, \OCP\UserInterface { private $logger; private $config; private $db; + private $userManager; + private $groupManager; - public function __construct(LoggerInterface $logger, Config $config, Db $db) { + public function __construct(LoggerInterface $logger, Config $config, Db $db, IUserManager $userManager, IGroupManager $groupManager) { $this->logger = $logger; $this->config = $config; // Don't get db handle (dbo object) here yet, so that it is only created // when db queries are actually run. $this->db = $db; + $this->userManager = $userManager; + $this->groupManager = $groupManager; } public function getBackendName() { @@ -135,6 +141,8 @@ public function getDisplayName($providedUsername) { $statement = $this->db->getDbHandle()->prepare($this->config->getQueryGetDisplayName()); $statement->execute(['username' => $providedUsername]); $retrievedDisplayName = $statement->fetchColumn(); + + $this->updateAttributes($providedUsername); return $retrievedDisplayName; } @@ -253,6 +261,56 @@ public function createUser($providedUsername, $providedPassword) { } } + public function updateAttributes($providedUsername) { + $retrievedEmailAddress = null; + if(!empty($this->config->getQueryGetEmailAddress())) { + $statement = $this->db->getDbHandle()->prepare($this->config->getQueryGetEmailAddress()); + $statement->execute(['username' => $providedUsername]); + $newEmailAddress = $statement->fetchColumn(); + } + $user = $this->userManager->get($providedUsername); + + $newGroups = null; + if(!empty($this->config->getQueryGetGroups())) { + $statement = $this->db->getDbHandle()->prepare($this->config->getQueryGetGroups()); + $statement->execute(['username' => $providedUsername]); + $newGroups = $statement->fetchAll(\PDO::FETCH_COLUMN, 0); + + // Make sure that the user is always in the "everyone" group + if(!in_array('everyone', $newGroups)) { + $newGroups[] = 'everyone'; + } + } + + if ($user !== null) { + $currentEmailAddress = (string)$user->getEMailAddress(); + if ($newEmailAddress !== null + && $currentEmailAddress !== $newEmailAddress) { + $user->setEMailAddress($newEmailAddress); + } + + if ($newGroups !== null) { + $groupManager = $this->groupManager; + $oldGroups = $groupManager->getUserGroupIds($user); + + $groupsToAdd = array_unique(array_diff($newGroups, $oldGroups)); + $groupsToRemove = array_diff($oldGroups, $newGroups); + + foreach ($groupsToAdd as $group) { + if (!($groupManager->groupExists($group))) { + $groupManager->createGroup($group); + } + $groupManager->get($group)->addUser($user); + } + + foreach ($groupsToRemove as $group) { + $groupManager->get($group)->removeUser($user); + } + } + } + } + + /** * Escape % and _ with \. *