Loading appinfo/app.phpdeleted 100644 → 0 +0 −27 Original line number Diff line number Diff line <?php /** * @copyright Copyright (c) 2020 Florent VINCENT <e.foundation> * * @author Florent VINCENT <diroots@e.email> * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ use OCA\EcloudAccounts\AppInfo\Application; $app = \OC::$server->query(Application::class); $app->register(); No newline at end of file lib/AppInfo/Application.php +8 −10 Original line number Diff line number Diff line Loading @@ -26,26 +26,24 @@ declare(strict_types=1); namespace OCA\EcloudAccounts\AppInfo; use OCA\EcloudAccounts\Events\UserDeletedListener; use OCP\AppFramework\App; use OCP\EventDispatcher\IEventDispatcher; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\User\Events\UserDeletedEvent; use OCA\EcloudAccounts\Events\UserDeletedListener; class Application extends App { const APP_NAME = 'ecloud-accounts'; const APP_ID = 'ecloud-accounts'; public function __construct() public function __construct(array $urlParams = []) { parent::__construct(self::APP_NAME); parent::__construct(self::APP_ID, $urlParams); } public function register() public function register(IRegistrationContext $context): void { /* @var IEventDispatcher $eventDispatcher */ $eventDispatcher = $this->getContainer()->query(IEventDispatcher::class); $eventDispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedListener::class); $context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class); } } lib/Controller/UserController.php +8 −0 Original line number Diff line number Diff line Loading @@ -41,8 +41,16 @@ class UserController extends ApiController return $response; } $errors = []; $this->userService->setEmail($uid, $email); $this->userService->setQuota($uid, $quota); $createdFolder = $this->userService->createUserFolder($uid); if(!$createdFolder){ $errors[] = 'error_creating_user_folder'; } $response->setData(['errors' => $errors]); return $response; } Loading lib/Service/UserService.php +76 −8 Original line number Diff line number Diff line Loading @@ -3,32 +3,100 @@ declare(strict_types=1); namespace OCA\EcloudAccounts\Service; use OCP\IUserManager; use OCP\IConfig; use OCP\Files\Storage\IStorage; class UserService { class UserService { /** @var IUserManager */ private $userManager; public function __construct(IUserManager $userManager) /** @var IConfig */ private $config; private $appName; private $storage; public function __construct($appName, IUserManager $userManager, IConfig $config, IStorage $storage) { $this->userManager = $userManager; $this->config = $config; $this->appName = $appName; $this->storage = $storage; } private function isShardingEnabled() : bool { $shardingEnabled = $this->config->getAppValue($this->appName, 'user_folder_sharding'); return $shardingEnabled; } public function userExists(string $uid) : bool { public function userExists(string $uid): bool { return $this->userManager->userExists($uid); } public function setEmail(string $uid, string $email) : void { public function setEmail(string $uid, string $email): void { $user = $this->userManager->get($uid); if (is_null($user)) return; $user->setEMailAddress($email); } public function setQuota(string $uid, string $quota) : void { public function setQuota(string $uid, string $quota): void { $user = $this->userManager->get($uid); if (is_null($user)) return; $user->setQuota($quota); } public function createUserFolder(string $uid): bool { // return true as creation can be handled at login if sharding disabled if (!$this->isShardingEnabled()) { return true; } $realDataDir = $this->config->getAppValue($this->appName, 'realdatadirectory'); $ncDataDir = $this->config->getSystemValue('datadirectory'); $ncUserFolder = $ncDataDir . '/' . $uid; // return false if no realDataDir specified and sharding is enabled // As user data directory can't be created in correct location if (!$realDataDir) { return false; } // Randomly assign a directory for the new user $directories = glob($realDataDir . '/*', GLOB_ONLYDIR); $folderIndex = random_int(0, count($directories) - 1); $folder = $directories[$folderIndex]; $realUserFolder = $folder . '/' . $uid; // Folder already exists if ($this->storage->file_exists($realUserFolder)) { return true; } try { $created = $this->storage->mkdir($realUserFolder); if(!$created) { $this->logger->error('Error while creating user folder for user: ' . $uid); return false; } $linked = symlink($realUserFolder, $ncUserFolder); if(!$linked) { $this->logger->error('Error while linking user folder for user: '. $uid); return false; } return true; } catch (Exception $e) { $this->logger->error("Error while creating user folder and linking for user: " . $uid); return false; } } } Loading
appinfo/app.phpdeleted 100644 → 0 +0 −27 Original line number Diff line number Diff line <?php /** * @copyright Copyright (c) 2020 Florent VINCENT <e.foundation> * * @author Florent VINCENT <diroots@e.email> * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ use OCA\EcloudAccounts\AppInfo\Application; $app = \OC::$server->query(Application::class); $app->register(); No newline at end of file
lib/AppInfo/Application.php +8 −10 Original line number Diff line number Diff line Loading @@ -26,26 +26,24 @@ declare(strict_types=1); namespace OCA\EcloudAccounts\AppInfo; use OCA\EcloudAccounts\Events\UserDeletedListener; use OCP\AppFramework\App; use OCP\EventDispatcher\IEventDispatcher; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\User\Events\UserDeletedEvent; use OCA\EcloudAccounts\Events\UserDeletedListener; class Application extends App { const APP_NAME = 'ecloud-accounts'; const APP_ID = 'ecloud-accounts'; public function __construct() public function __construct(array $urlParams = []) { parent::__construct(self::APP_NAME); parent::__construct(self::APP_ID, $urlParams); } public function register() public function register(IRegistrationContext $context): void { /* @var IEventDispatcher $eventDispatcher */ $eventDispatcher = $this->getContainer()->query(IEventDispatcher::class); $eventDispatcher->addServiceListener(UserDeletedEvent::class, UserDeletedListener::class); $context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class); } }
lib/Controller/UserController.php +8 −0 Original line number Diff line number Diff line Loading @@ -41,8 +41,16 @@ class UserController extends ApiController return $response; } $errors = []; $this->userService->setEmail($uid, $email); $this->userService->setQuota($uid, $quota); $createdFolder = $this->userService->createUserFolder($uid); if(!$createdFolder){ $errors[] = 'error_creating_user_folder'; } $response->setData(['errors' => $errors]); return $response; } Loading
lib/Service/UserService.php +76 −8 Original line number Diff line number Diff line Loading @@ -3,32 +3,100 @@ declare(strict_types=1); namespace OCA\EcloudAccounts\Service; use OCP\IUserManager; use OCP\IConfig; use OCP\Files\Storage\IStorage; class UserService { class UserService { /** @var IUserManager */ private $userManager; public function __construct(IUserManager $userManager) /** @var IConfig */ private $config; private $appName; private $storage; public function __construct($appName, IUserManager $userManager, IConfig $config, IStorage $storage) { $this->userManager = $userManager; $this->config = $config; $this->appName = $appName; $this->storage = $storage; } private function isShardingEnabled() : bool { $shardingEnabled = $this->config->getAppValue($this->appName, 'user_folder_sharding'); return $shardingEnabled; } public function userExists(string $uid) : bool { public function userExists(string $uid): bool { return $this->userManager->userExists($uid); } public function setEmail(string $uid, string $email) : void { public function setEmail(string $uid, string $email): void { $user = $this->userManager->get($uid); if (is_null($user)) return; $user->setEMailAddress($email); } public function setQuota(string $uid, string $quota) : void { public function setQuota(string $uid, string $quota): void { $user = $this->userManager->get($uid); if (is_null($user)) return; $user->setQuota($quota); } public function createUserFolder(string $uid): bool { // return true as creation can be handled at login if sharding disabled if (!$this->isShardingEnabled()) { return true; } $realDataDir = $this->config->getAppValue($this->appName, 'realdatadirectory'); $ncDataDir = $this->config->getSystemValue('datadirectory'); $ncUserFolder = $ncDataDir . '/' . $uid; // return false if no realDataDir specified and sharding is enabled // As user data directory can't be created in correct location if (!$realDataDir) { return false; } // Randomly assign a directory for the new user $directories = glob($realDataDir . '/*', GLOB_ONLYDIR); $folderIndex = random_int(0, count($directories) - 1); $folder = $directories[$folderIndex]; $realUserFolder = $folder . '/' . $uid; // Folder already exists if ($this->storage->file_exists($realUserFolder)) { return true; } try { $created = $this->storage->mkdir($realUserFolder); if(!$created) { $this->logger->error('Error while creating user folder for user: ' . $uid); return false; } $linked = symlink($realUserFolder, $ncUserFolder); if(!$linked) { $this->logger->error('Error while linking user folder for user: '. $uid); return false; } return true; } catch (Exception $e) { $this->logger->error("Error while creating user folder and linking for user: " . $uid); return false; } } }