From c4a66e4d38cd7b2128077fe470e1742f09bbf46c Mon Sep 17 00:00:00 2001 From: KoS Date: Wed, 8 Apr 2020 23:53:57 +0200 Subject: [PATCH 1/2] add email query support (closes #20) add group support (closes #7) --- lib/Config.php | 10 ++++++++ lib/UserBackend.php | 60 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/Config.php b/lib/Config.php index 9bb94b7..42b334c 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'; private $logger; private $appConfiguration; @@ -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 f6323ed..83c9d78 100644 --- a/lib/UserBackend.php +++ b/lib/UserBackend.php @@ -23,6 +23,8 @@ use OCP\ILogger; 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 $logContext = ['app' => 'user_backend_sql_raw']; private $config; private $db; + private $userManager; + private $groupManager; - public function __construct(ILogger $logger, Config $config, Db $db) { + public function __construct(ILogger $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; } @@ -259,6 +267,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 \. * From 597ff6c176adc460955164c25f88a1a4b3841b6d Mon Sep 17 00:00:00 2001 From: KoS Date: Mon, 4 Oct 2021 10:29:26 +0200 Subject: [PATCH 2/2] Increase compatible version to Nextcloud 22 --- appinfo/info.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index e66aa65..c8f5df2 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -14,7 +14,7 @@ In contrast to the app *SQL user backend*, you write the SQL queries yourself. Y The app uses prepared statements and is written to be secure by default to prevent SQL injections. It understands the most popular standards for password hash formats: MD5-CRYPT, SHA256-CRYPT, SHA512-CRYPT, BCrypt and the state-of-the-art Argon2i and Argon2id. Because the various formats are recognized on-the-fly your db can can have differing hash string formats at the same time, which eases migration to newer formats. This app supports PostgreSQL and MariaDB/MySQL.]]> - 1.1.0 + 1.2.0 agpl Alexey Abel UserBackendSqlRaw @@ -31,6 +31,6 @@ This app supports PostgreSQL and MariaDB/MySQL.]]> https://github.com/PanCakeConnaisseur/user_backend_sql_raw https://raw.githubusercontent.com/PanCakeConnaisseur/user_backend_sql_raw/2eb5221f0725a9ab09fde6384dea62463c7c52e5/screenshot-dark-large.jpg - +