diff --git a/apps/admin_audit/lib/Actions/Auth.php b/apps/admin_audit/lib/Actions/Auth.php index 27722d4a41c1b..8bdb98161c99b 100644 --- a/apps/admin_audit/lib/Actions/Auth.php +++ b/apps/admin_audit/lib/Actions/Auth.php @@ -27,12 +27,35 @@ */ namespace OCA\AdminAudit\Actions; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\User\Events\BeforeUserLoggedInEvent; +use OCP\User\Events\UserLoggedInEvent; +use OCP\User\Events\UserLoggedOutEvent; + /** * Class Auth logs all auth related actions * * @package OCA\AdminAudit\Actions */ -class Auth extends Action { +class Auth extends Action implements IEventListener { + public function handle(Event $event): void { + if ($event instanceof BeforeUserLoggedInEvent) { + $this->loginAttempt(['uid' => $event->getUsername()]); + } + + if ($event instanceof UserLoggedInEvent) { + $this->loginAttempt(['uid' => $event->getLoginName()]); + } + + if ($event instanceof UserLoggedOutEvent) { + $user = $event->getUser(); + if ($user) { + $this->logout($user->getUID()); + } + } + } + public function loginAttempt(array $params): void { $this->log( 'Login attempt: "%s"', @@ -55,11 +78,12 @@ public function loginSuccessful(array $params): void { ); } - public function logout(array $params): void { + public function logout(string $userId): void { $this->log( - 'Logout occurred', - [], - [] + 'Logout occurred for "%s"', + ['uid' => $userId], + ['uid'], + true ); } } diff --git a/apps/admin_audit/lib/Actions/GroupManagement.php b/apps/admin_audit/lib/Actions/GroupManagement.php index e79b86bb88bcc..92a82c344104d 100644 --- a/apps/admin_audit/lib/Actions/GroupManagement.php +++ b/apps/admin_audit/lib/Actions/GroupManagement.php @@ -29,6 +29,12 @@ */ namespace OCA\AdminAudit\Actions; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\GroupCreatedEvent; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; use OCP\IGroup; use OCP\IUser; @@ -37,13 +43,21 @@ * * @package OCA\AdminAudit\Actions */ -class GroupManagement extends Action { +class GroupManagement extends Action implements IEventListener { + public function handle(Event $event): void { + if ($event instanceof UserAddedEvent) { + $this->addUser($event->getGroup(), $event->getUser()); + } elseif ($event instanceof UserRemovedEvent) { + $this->removeUser($event->getGroup(), $event->getUser()); + } elseif ($event instanceof GroupCreatedEvent) { + $this->createGroup($event->getGroup()); + } elseif ($event instanceof GroupDeletedEvent) { + $this->deleteGroup($event->getGroup()); + } + } /** - * log add user to group event - * - * @param IGroup $group - * @param IUser $user + * Log add user to group event */ public function addUser(IGroup $group, IUser $user): void { $this->log('User "%s" added to group "%s"', @@ -58,10 +72,7 @@ public function addUser(IGroup $group, IUser $user): void { } /** - * log remove user from group event - * - * @param IGroup $group - * @param IUser $user + * Log remove user from group event */ public function removeUser(IGroup $group, IUser $user): void { $this->log('User "%s" removed from group "%s"', @@ -76,9 +87,7 @@ public function removeUser(IGroup $group, IUser $user): void { } /** - * log create group to group event - * - * @param IGroup $group + * Log create group to group event */ public function createGroup(IGroup $group): void { $this->log('Group created: "%s"', @@ -92,9 +101,7 @@ public function createGroup(IGroup $group): void { } /** - * log delete group to group event - * - * @param IGroup $group + * Log delete group to group event */ public function deleteGroup(IGroup $group): void { $this->log('Group deleted: "%s"', diff --git a/apps/admin_audit/lib/Actions/UserManagement.php b/apps/admin_audit/lib/Actions/UserManagement.php index 02d5b60d2fa29..8fe4251581ef4 100644 --- a/apps/admin_audit/lib/Actions/UserManagement.php +++ b/apps/admin_audit/lib/Actions/UserManagement.php @@ -12,6 +12,7 @@ * @author John Molakvoæ * @author Lukas Reschke * @author Roeland Jago Douma + * @author Carl Schwan * * @license GNU AGPL version 3 or any later version * @@ -31,23 +32,47 @@ */ namespace OCA\AdminAudit\Actions; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; use OCP\IUser; +use OCP\User\Events\PasswordUpdatedEvent; +use OCP\User\Events\UserChangedEvent; +use OCP\User\Events\UserCreatedEvent; +use OCP\User\Events\UserDeletedEvent; +use OCP\User\Events\UserIdAssignedEvent; +use OCP\User\Events\UserIdUnassignedEvent; /** * Class UserManagement logs all user management related actions. * * @package OCA\AdminAudit\Actions */ -class UserManagement extends Action { +class UserManagement extends Action implements IEventListener { + public function handle(Event $event): void { + if ($event instanceof UserCreatedEvent) { + $this->create($event->getUser()->getUID()); + } elseif ($event instanceof UserDeletedEvent) { + $this->delete($event->getUser()->getUID()); + } elseif ($event instanceof UserChangedEvent) { + $this->change($event); + } elseif ($event instanceof UserIdAssignedEvent) { + $this->assign($event->getUserId()); + } elseif ($event instanceof UserIdUnassignedEvent) { + $this->unassign($event->getUserId()); + } elseif ($event instanceof PasswordUpdatedEvent) { + $this->setPassword($event->getUser()); + } + } + /** * Log creation of users * * @param array $params */ - public function create(array $params): void { + public function create(string $userId): void { $this->log( 'User created: "%s"', - $params, + ['uid' => $userId], [ 'uid', ] @@ -56,26 +81,22 @@ public function create(array $params): void { /** * Log assignments of users (typically user backends) - * - * @param string $uid */ - public function assign(string $uid): void { + public function assign(string $userId): void { $this->log( 'UserID assigned: "%s"', - [ 'uid' => $uid ], + [ 'uid' => $userId ], [ 'uid' ] ); } /** * Log deletion of users - * - * @param array $params */ - public function delete(array $params): void { + public function delete(string $userId): void { $this->log( 'User deleted: "%s"', - $params, + ['uid' => $userId], [ 'uid', ] @@ -100,14 +121,14 @@ public function unassign(string $uid): void { * * @param array $params */ - public function change(array $params): void { - switch ($params['feature']) { + public function change(UserChangedEvent $changedEvent): void { + switch ($changedEvent->getFeature()) { case 'enabled': $this->log( - $params['value'] === true + $changedEvent->getValue() === true ? 'User enabled: "%s"' : 'User disabled: "%s"', - ['user' => $params['user']->getUID()], + ['user' => $changedEvent->getUser()->getUID()], [ 'user', ] @@ -116,7 +137,7 @@ public function change(array $params): void { case 'eMailAddress': $this->log( 'Email address changed for user %s', - ['user' => $params['user']->getUID()], + ['user' => $changedEvent->getUser()->getUID()], [ 'user', ] diff --git a/apps/admin_audit/lib/AppInfo/Application.php b/apps/admin_audit/lib/AppInfo/Application.php index 1160d151710c0..0ec20eb16ff9f 100644 --- a/apps/admin_audit/lib/AppInfo/Application.php +++ b/apps/admin_audit/lib/AppInfo/Application.php @@ -58,6 +58,10 @@ use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\Authentication\TwoFactorAuth\IProvider; use OCP\Console\ConsoleEvent; +use OCP\Group\Events\GroupCreatedEvent; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; use OCP\IConfig; use OCP\IGroupManager; use OCP\IPreview; @@ -66,6 +70,15 @@ use OCP\Log\Audit\CriticalActionPerformedEvent; use OCP\Log\ILogFactory; use OCP\Share; +use OCP\User\Events\BeforeUserLoggedInEvent; +use OCP\User\Events\UserIdAssignedEvent; +use OCP\User\Events\PasswordUpdatedEvent; +use OCP\User\Events\UserChangedEvent; +use OCP\User\Events\UserCreatedEvent; +use OCP\User\Events\UserDeletedEvent; +use OCP\User\Events\UserIdUnassignedEvent; +use OCP\User\Events\UserLoggedInEvent; +use OCP\User\Events\UserLoggedOutEvent; use OCP\Util; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; @@ -87,6 +100,26 @@ public function register(IRegistrationContext $context): void { }); $context->registerEventListener(CriticalActionPerformedEvent::class, CriticalActionPerformedEventListener::class); + + // User management + $context->registerEventListener(UserCreatedEvent::class, UserManagement::class); + $context->registerEventListener(UserDeletedEvent::class, UserManagement::class); + $context->registerEventListener(UserChangedEvent::class, UserManagement::class); + $context->registerEventListener(PasswordUpdatedEvent::class, UserManagement::class); + $context->registerEventListener(UserIdAssignedEvent::class, UserManagement::class); + $context->registerEventListener(UserIdUnassignedEvent::class, UserManagement::class); + + // Group management + $context->registerEventListener(GroupCreatedEvent::class, GroupManagement::class); + $context->registerEventListener(GroupDeletedEvent::class, GroupManagement::class); + $context->registerEventListener(UserAddedEvent::class, GroupManagement::class); + $context->registerEventListener(UserRemovedEvent::class, GroupManagement::class); + + // Authentication management + $context->registerEventListener(UserLoggedInEvent::class, Auth::class); + $context->registerEventListener(BeforeUserLoggedInEvent::class, Auth::class); + $context->registerEventListener(UserLoggedOutEvent::class, Auth::class); + } public function boot(IBootContext $context): void { @@ -105,10 +138,6 @@ public function boot(IBootContext $context): void { */ private function registerHooks(IAuditLogger $logger, IServerContainer $serverContainer): void { - $this->userManagementHooks($logger, $serverContainer->get(IUserSession::class)); - $this->groupHooks($logger, $serverContainer->get(IGroupManager::class)); - $this->authHooks($logger); - /** @var EventDispatcherInterface $eventDispatcher */ $eventDispatcher = $serverContainer->get(EventDispatcherInterface::class); $this->consoleHooks($logger, $eventDispatcher); @@ -123,31 +152,6 @@ private function registerHooks(IAuditLogger $logger, $this->securityHooks($logger, $eventDispatcher); } - private function userManagementHooks(IAuditLogger $logger, - IUserSession $userSession): void { - $userActions = new UserManagement($logger); - - Util::connectHook('OC_User', 'post_createUser', $userActions, 'create'); - Util::connectHook('OC_User', 'post_deleteUser', $userActions, 'delete'); - Util::connectHook('OC_User', 'changeUser', $userActions, 'change'); - - assert($userSession instanceof UserSession); - $userSession->listen('\OC\User', 'postSetPassword', [$userActions, 'setPassword']); - $userSession->listen('\OC\User', 'assignedUserId', [$userActions, 'assign']); - $userSession->listen('\OC\User', 'postUnassignedUserId', [$userActions, 'unassign']); - } - - private function groupHooks(IAuditLogger $logger, - IGroupManager $groupManager): void { - $groupActions = new GroupManagement($logger); - - assert($groupManager instanceof GroupManager); - $groupManager->listen('\OC\Group', 'postRemoveUser', [$groupActions, 'removeUser']); - $groupManager->listen('\OC\Group', 'postAddUser', [$groupActions, 'addUser']); - $groupManager->listen('\OC\Group', 'postDelete', [$groupActions, 'deleteGroup']); - $groupManager->listen('\OC\Group', 'postCreate', [$groupActions, 'createGroup']); - } - private function sharingHooks(IAuditLogger $logger): void { $shareActions = new Sharing($logger); @@ -160,14 +164,6 @@ private function sharingHooks(IAuditLogger $logger): void { Util::connectHook(Share::class, 'share_link_access', $shareActions, 'shareAccessed'); } - private function authHooks(IAuditLogger $logger): void { - $authActions = new Auth($logger); - - Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt'); - Util::connectHook('OC_User', 'post_login', $authActions, 'loginSuccessful'); - Util::connectHook('OC_User', 'logout', $authActions, 'logout'); - } - private function appHooks(IAuditLogger $logger, EventDispatcherInterface $eventDispatcher): void { $eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) { diff --git a/apps/user_ldap/ajax/clearMappings.php b/apps/user_ldap/ajax/clearMappings.php index 39462f334c979..16a761071eb25 100644 --- a/apps/user_ldap/ajax/clearMappings.php +++ b/apps/user_ldap/ajax/clearMappings.php @@ -25,6 +25,9 @@ */ use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Mapping\GroupMapping; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\User\Events\BeforeUserIdUnassignedEvent; +use OCP\User\Events\UserIdUnassignedEvent; // Check user and app status \OC_JSON::checkAdminUser(); @@ -36,11 +39,15 @@ try { if ($subject === 'user') { $mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + /** @var IEventDispatcher $dispatcher */ + $dispatcher = \OC::$server->get(IEventDispatcher::class); $result = $mapping->clearCb( - function ($uid) { + function (string $uid) use ($dispatcher): void { + $dispatcher->dispatchTyped(new BeforeUserIdUnassignedEvent($uid)); \OC::$server->getUserManager()->emit('\OC\User', 'preUnassignedUserId', [$uid]); }, - function ($uid) { + function (string $uid) use ($dispatcher): void { + $dispatcher->dispatchTyped(new UserIdUnassignedEvent($uid)); \OC::$server->getUserManager()->emit('\OC\User', 'postUnassignedUserId', [$uid]); } ); diff --git a/apps/user_ldap/ajax/wizard.php b/apps/user_ldap/ajax/wizard.php index 814477d5db061..0ff6fa08e347e 100644 --- a/apps/user_ldap/ajax/wizard.php +++ b/apps/user_ldap/ajax/wizard.php @@ -27,6 +27,8 @@ * */ // Check user and app status +use OCP\EventDispatcher\IEventDispatcher; + \OC_JSON::checkAdminUser(); \OC_JSON::checkAppEnabled('user_ldap'); \OC_JSON::callCheck(); @@ -70,7 +72,8 @@ new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), \OC::$server->getConfig(), \OC::$server->getUserManager(), - \OC::$server->get(\Psr\Log\LoggerInterface::class) + \OC::$server->get(\Psr\Log\LoggerInterface::class), + \OC::$server->get(IEventDispatcher::class) ); $wizard = new \OCA\User_LDAP\Wizard($configuration, $ldapWrapper, $access); diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php index 29d60817c02eb..516c92567590b 100644 --- a/apps/user_ldap/lib/Access.php +++ b/apps/user_ldap/lib/Access.php @@ -54,9 +54,11 @@ use OCA\User_LDAP\Mapping\AbstractMapping; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\OfflineUser; +use OCP\EventDispatcher\IEventDispatcher; use OCP\HintException; use OCP\IConfig; use OCP\IUserManager; +use OCP\User\Events\UserIdAssignedEvent; use Psr\Log\LoggerInterface; use function strlen; use function substr; @@ -68,35 +70,18 @@ */ class Access extends LDAPUtility { public const UUID_ATTRIBUTES = ['entryuuid', 'nsuniqueid', 'objectguid', 'guid', 'ipauniqueid']; - - /** @var \OCA\User_LDAP\Connection */ - public $connection; - /** @var Manager */ - public $userManager; - /** - * never ever check this var directly, always use getPagedSearchResultState - * @var ?bool - */ - protected $pagedSearchedSuccessful; - - /** @var ?AbstractMapping */ - protected $userMapper; - - /** @var ?AbstractMapping */ - protected $groupMapper; - - /** - * @var \OCA\User_LDAP\Helper - */ - private $helper; - /** @var IConfig */ - private $config; - /** @var IUserManager */ - private $ncUserManager; - /** @var LoggerInterface */ - private $logger; - /** @var string */ - private $lastCookie = ''; + public Connection $connection; + public Manager $userManager; + /** Never ever check this var directly, always use getPagedSearchResultState */ + protected ?bool $pagedSearchedSuccessful = null; + protected ?AbstractMapping $userMapper = null; + protected ?AbstractMapping $groupMapper = null; + private Helper $helper; + private IConfig $config; + private IUserManager $ncUserManager; + private LoggerInterface $logger; + private string $lastCookie = ''; + private IEventDispatcher $dispatcher; public function __construct( Connection $connection, @@ -105,7 +90,8 @@ public function __construct( Helper $helper, IConfig $config, IUserManager $ncUserManager, - LoggerInterface $logger + LoggerInterface $logger, + IEventDispatcher $dispatcher ) { parent::__construct($ldap); $this->connection = $connection; @@ -115,10 +101,11 @@ public function __construct( $this->config = $config; $this->ncUserManager = $ncUserManager; $this->logger = $logger; + $this->dispatcher = $dispatcher; } /** - * sets the User Mapper + * Sets the User Mapper */ public function setUserMapper(AbstractMapping $mapper): void { $this->userMapper = $mapper; @@ -619,6 +606,9 @@ public function mapAndAnnounceIfApplicable( bool $isUser ): bool { if ($mapper->map($fdn, $name, $uuid)) { + if ($isUser) { + $this->dispatcher->dispatchTyped(new UserIdAssignedEvent($name)); + } if ($this->ncUserManager instanceof PublicEmitter && $isUser) { $this->cacheUserExists($name); $this->ncUserManager->emit('\OC\User', 'assignedUserId', [$name]); diff --git a/apps/user_ldap/lib/AccessFactory.php b/apps/user_ldap/lib/AccessFactory.php index 71867bbb9a4a5..3f31c59972478 100644 --- a/apps/user_ldap/lib/AccessFactory.php +++ b/apps/user_ldap/lib/AccessFactory.php @@ -24,23 +24,19 @@ namespace OCA\User_LDAP; use OCA\User_LDAP\User\Manager; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IConfig; use OCP\IUserManager; use Psr\Log\LoggerInterface; class AccessFactory { - /** @var ILDAPWrapper */ - protected $ldap; - /** @var Manager */ - protected $userManager; - /** @var Helper */ - protected $helper; - /** @var IConfig */ - protected $config; - /** @var IUserManager */ - private $ncUserManager; - /** @var LoggerInterface */ - private $logger; + protected ILDAPWrapper $ldap; + protected Manager $userManager; + protected Helper $helper; + protected IConfig $config; + private IUserManager $ncUserManager; + private LoggerInterface $logger; + private IEventDispatcher $dispatcher; public function __construct( ILDAPWrapper $ldap, @@ -48,16 +44,19 @@ public function __construct( Helper $helper, IConfig $config, IUserManager $ncUserManager, - LoggerInterface $logger) { + LoggerInterface $logger, + IEventDispatcher $dispatcher + ) { $this->ldap = $ldap; $this->userManager = $userManager; $this->helper = $helper; $this->config = $config; $this->ncUserManager = $ncUserManager; $this->logger = $logger; + $this->dispatcher = $dispatcher; } - public function get(Connection $connection) { + public function get(Connection $connection): Access { return new Access( $connection, $this->ldap, @@ -65,7 +64,8 @@ public function get(Connection $connection) { $this->helper, $this->config, $this->ncUserManager, - $this->logger + $this->logger, + $this->dispatcher ); } } diff --git a/apps/user_ldap/lib/Jobs/Sync.php b/apps/user_ldap/lib/Jobs/Sync.php index 3d0dd88dfd248..a8baef7f6d1be 100644 --- a/apps/user_ldap/lib/Jobs/Sync.php +++ b/apps/user_ldap/lib/Jobs/Sync.php @@ -5,6 +5,7 @@ * @author Arthur Schiwon * @author Christoph Wurst * @author Joas Schilling + * @author Carl Schwan * * @license GNU AGPL version 3 or any later version * @@ -24,7 +25,6 @@ */ namespace OCA\User_LDAP\Jobs; -use OC\BackgroundJob\TimedJob; use OC\ServerNotAvailableException; use OCA\User_LDAP\AccessFactory; use OCA\User_LDAP\Configuration; @@ -33,6 +33,10 @@ use OCA\User_LDAP\LDAP; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; +use OCA\User_LDAP\User\User; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\TimedJob; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IDBConnection; @@ -43,50 +47,77 @@ class Sync extends TimedJob { public const MAX_INTERVAL = 12 * 60 * 60; // 12h public const MIN_INTERVAL = 30 * 60; // 30min - /** @var Helper */ - protected $ldapHelper; - /** @var LDAP */ - protected $ldap; - /** @var Manager */ - protected $userManager; - /** @var UserMapping */ - protected $mapper; - /** @var IConfig */ - protected $config; - /** @var IAvatarManager */ - protected $avatarManager; - /** @var IDBConnection */ - protected $dbc; - /** @var IUserManager */ - protected $ncUserManager; - /** @var LoggerInterface */ - protected $logger; - /** @var IManager */ - protected $notificationManager; - /** @var ConnectionFactory */ - protected $connectionFactory; - /** @var AccessFactory */ - protected $accessFactory; - public function __construct(Manager $userManager) { + protected Helper $ldapHelper; + protected LDAP $ldap; + protected Manager $userManager; + protected UserMapping $mapper; + protected IConfig $config; + protected IAvatarManager $avatarManager; + protected IDBConnection $dbc; + protected IUserManager $ncUserManager; + protected LoggerInterface $logger; + protected IManager $notificationManager; + protected ConnectionFactory $connectionFactory; + protected AccessFactory $accessFactory; + protected IEventDispatcher $dispatcher; + + public function __construct( + Manager $userManager, + IEventDispatcher $dispatcher, + IConfig $config, + ITimeFactory $timeFactory, + IDBConnection $dbConnection, + IAvatarManager $avatarManager, + IUserManager $ncUserManager, + LoggerInterface $logger, + IManager $notificationManager, + UserMapping $userMapping, + Helper $ldapHelper, + ConnectionFactory $connectionFactory + ) { + parent::__construct($timeFactory); $this->userManager = $userManager; + $this->dispatcher = $dispatcher; + $this->config = $config; $this->setInterval( - \OC::$server->getConfig()->getAppValue( + (int)$config->getAppValue( 'user_ldap', 'background_sync_interval', self::MIN_INTERVAL ) ); + + $this->ldapHelper = $ldapHelper; + $this->ldap = new LDAP($this->config->getSystemValueString('ldap_log_file')); + $this->avatarManager = $avatarManager; + $this->dbc = $dbConnection; + $this->ncUserManager = $ncUserManager; + $this->logger = $logger; + $this->userManager = $userManager; + $this->notificationManager = $notificationManager; + $this->mapper = $userMapping; + $this->connectionFactory = $connectionFactory; + + $this->accessFactory = new AccessFactory( + $this->ldap, + $this->userManager, + $this->ldapHelper, + $this->config, + $this->ncUserManager, + $this->logger, + $this->dispatcher + ); } /** - * updates the interval + * Updates the interval * - * the idea is to adjust the interval depending on the amount of known users + * The idea is to adjust the interval depending on the amount of known users * and the attempt to update each user one day. At most it would run every * 30 minutes, and at least every 12 hours. */ - public function updateInterval() { + public function updateInterval(): void { $minPagingSize = $this->getMinPagingSize(); $mappedUsers = $this->mapper->count(); @@ -99,10 +130,9 @@ public function updateInterval() { } /** - * returns the smallest configured paging size - * @return int + * Returns the smallest configured paging size */ - protected function getMinPagingSize() { + protected function getMinPagingSize(): int { $configKeys = $this->config->getAppKeys('user_ldap'); $configKeys = array_filter($configKeys, function ($key) { return strpos($key, 'ldap_paging_size') !== false; @@ -119,8 +149,6 @@ protected function getMinPagingSize() { * @param array $argument */ public function run($argument) { - $this->setArgument($argument); - $isBackgroundJobModeAjax = $this->config ->getAppValue('core', 'backgroundjobs_mode', 'ajax') === 'ajax'; if ($isBackgroundJobModeAjax) { @@ -155,10 +183,10 @@ public function run($argument) { } /** - * @param array $cycleData + * @param array{offset: int, prefix: string} $cycleData * @return bool whether more results are expected from the same configuration */ - public function runCycle($cycleData) { + public function runCycle(array $cycleData): bool { $connection = $this->connectionFactory->get($cycleData['prefix']); $access = $this->accessFactory->get($connection); $access->setUserMapper($this->mapper); @@ -183,24 +211,23 @@ public function runCycle($cycleData) { } /** - * returns the info about the current cycle that should be run, if any, + * Returns the info about the current cycle that should be run, if any, * otherwise null - * - * @return array|null + * @return ?array{offset: int, prefix: string} */ - public function getCycle() { + public function getCycle(): ?array { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); if (count($prefixes) === 0) { return null; } $cycleData = [ - 'prefix' => $this->config->getAppValue('user_ldap', 'background_sync_prefix', null), - 'offset' => (int)$this->config->getAppValue('user_ldap', 'background_sync_offset', 0), + 'prefix' => $this->config->getAppValue('user_ldap', 'background_sync_prefix', 'none'), + 'offset' => (int)$this->config->getAppValue('user_ldap', 'background_sync_offset', '0'), ]; if ( - $cycleData['prefix'] !== null + $cycleData['prefix'] !== 'none' && in_array($cycleData['prefix'], $prefixes) ) { return $cycleData; @@ -212,11 +239,11 @@ public function getCycle() { /** * Save the provided cycle information in the DB * - * @param array $cycleData + * @param array{prefix: ?string, offset: int} $cycleData */ - public function setCycle(array $cycleData) { + public function setCycle(array $cycleData): void { $this->config->setAppValue('user_ldap', 'background_sync_prefix', $cycleData['prefix']); - $this->config->setAppValue('user_ldap', 'background_sync_offset', $cycleData['offset']); + $this->config->setAppValue('user_ldap', 'background_sync_offset', (string)$cycleData['offset']); } /** @@ -224,9 +251,9 @@ public function setCycle(array $cycleData) { * null. It also always goes for the next LDAP configuration! * * @param array|null $cycleData the old cycle - * @return array|null + * @return ?array{prefix: string, offset: int} */ - public function determineNextCycle(array $cycleData = null) { + public function determineNextCycle(?array $cycleData = null): ?array { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); if (count($prefixes) === 0) { return null; @@ -240,19 +267,18 @@ public function determineNextCycle(array $cycleData = null) { } $cycleData['prefix'] = $prefix; $cycleData['offset'] = 0; - $this->setCycle(['prefix' => $prefix, 'offset' => 0]); + $this->setCycle($cycleData); return $cycleData; } /** - * Checks whether the provided cycle should be run. Currently only the + * Checks whether the provided cycle should be run. Currently, only the * last configuration change goes into account (at least one hour). * - * @param $cycleData - * @return bool + * @param $cycleData{prefix: string} */ - public function qualifiesToRun($cycleData) { + public function qualifiesToRun(array $cycleData): bool { $lastChange = $this->config->getAppValue('user_ldap', $cycleData['prefix'] . '_lastChange', 0); if ((time() - $lastChange) > 60 * 30) { return true; @@ -261,23 +287,20 @@ public function qualifiesToRun($cycleData) { } /** - * increases the offset of the current cycle for the next run + * Increases the offset of the current cycle for the next run * - * @param $cycleData + * @param array{prefix: string, offset: int} $cycleData */ - protected function increaseOffset($cycleData) { + protected function increaseOffset(array $cycleData): void { $ldapConfig = new Configuration($cycleData['prefix']); - $cycleData['offset'] += (int)$ldapConfig->ldapPagingSize; + $cycleData['offset'] += $ldapConfig->ldapPagingSize; $this->setCycle($cycleData); } /** - * determines the next configuration prefix based on the last one (if any) - * - * @param string|null $lastPrefix - * @return string|null + * Determines the next configuration prefix based on the last one (if any) */ - protected function getNextPrefix($lastPrefix) { + protected function getNextPrefix(?string $lastPrefix): ?string { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); $noOfPrefixes = count($prefixes); if ($noOfPrefixes === 0) { @@ -297,86 +320,10 @@ protected function getNextPrefix($lastPrefix) { } /** - * "fixes" DI - * - * @param array $argument + * Only used in tests */ - public function setArgument($argument) { - if (isset($argument['config'])) { - $this->config = $argument['config']; - } else { - $this->config = \OC::$server->getConfig(); - } - - if (isset($argument['helper'])) { - $this->ldapHelper = $argument['helper']; - } else { - $this->ldapHelper = new Helper($this->config, \OC::$server->getDatabaseConnection()); - } - - if (isset($argument['ldapWrapper'])) { - $this->ldap = $argument['ldapWrapper']; - } else { - $this->ldap = new LDAP($this->config->getSystemValueString('ldap_log_file')); - } - - if (isset($argument['avatarManager'])) { - $this->avatarManager = $argument['avatarManager']; - } else { - $this->avatarManager = \OC::$server->getAvatarManager(); - } - - if (isset($argument['dbc'])) { - $this->dbc = $argument['dbc']; - } else { - $this->dbc = \OC::$server->getDatabaseConnection(); - } - - if (isset($argument['ncUserManager'])) { - $this->ncUserManager = $argument['ncUserManager']; - } else { - $this->ncUserManager = \OC::$server->getUserManager(); - } - - if (isset($argument['logger'])) { - $this->logger = $argument['logger']; - } else { - $this->logger = \OC::$server->get(LoggerInterface::class); - } - - if (isset($argument['notificationManager'])) { - $this->notificationManager = $argument['notificationManager']; - } else { - $this->notificationManager = \OC::$server->getNotificationManager(); - } - - if (isset($argument['userManager'])) { - $this->userManager = $argument['userManager']; - } - - if (isset($argument['mapper'])) { - $this->mapper = $argument['mapper']; - } else { - $this->mapper = new UserMapping($this->dbc); - } - - if (isset($argument['connectionFactory'])) { - $this->connectionFactory = $argument['connectionFactory']; - } else { - $this->connectionFactory = new ConnectionFactory($this->ldap); - } - - if (isset($argument['accessFactory'])) { - $this->accessFactory = $argument['accessFactory']; - } else { - $this->accessFactory = new AccessFactory( - $this->ldap, - $this->userManager, - $this->ldapHelper, - $this->config, - $this->ncUserManager, - $this->logger - ); - } + public function overwritePropertiesForTest(LDAP $ldapWrapper, AccessFactory $accessFactory): void { + $this->ldap = $ldapWrapper; + $this->accessFactory = $accessFactory; } } diff --git a/apps/user_ldap/lib/Mapping/AbstractMapping.php b/apps/user_ldap/lib/Mapping/AbstractMapping.php index 9026b8cfb78ec..e75b7c1a3f526 100644 --- a/apps/user_ldap/lib/Mapping/AbstractMapping.php +++ b/apps/user_ldap/lib/Mapping/AbstractMapping.php @@ -30,6 +30,7 @@ use OC\DB\QueryBuilder\QueryBuilder; use OCP\DB\IPreparedStatement; use OCP\DB\QueryBuilder\IQueryBuilder; +use PDO; /** * Class AbstractMapping @@ -215,17 +216,17 @@ public function getNameByDN($fdn) { /** * @param array $hashList */ - protected function prepareListOfIdsQuery(array $hashList): IQueryBuilder { + protected function prepareListOfIdsQuery(): IQueryBuilder { $qb = $this->dbc->getQueryBuilder(); $qb->select('owncloud_name', 'ldap_dn_hash', 'ldap_dn') ->from($this->getTableName(false)) - ->where($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($hashList, QueryBuilder::PARAM_STR_ARRAY))); + ->where($qb->expr()->in('ldap_dn_hash', $qb->createParameter('hashList'))); return $qb; } protected function collectResultsFromListOfIdsQuery(IQueryBuilder $qb, array &$results): void { - $stmt = $qb->execute(); - while ($entry = $stmt->fetch(\Doctrine\DBAL\FetchMode::ASSOCIATIVE)) { + $stmt = $qb->executeQuery(); + while ($entry = $stmt->fetch(PDO::FETCH_ASSOC)) { $results[$entry['ldap_dn']] = $entry['owncloud_name']; $this->cache[$entry['ldap_dn']] = $entry['owncloud_name']; } @@ -242,37 +243,20 @@ public function getListOfIdsByDn(array $fdns): array { $maxSlices = $totalDBParamLimit / $sliceSize; $results = []; - $slice = 1; + $slice = 0; $fdns = array_map([$this, 'getDNHash'], $fdns); - $fdnsSlice = count($fdns) > $sliceSize ? array_slice($fdns, 0, $sliceSize) : $fdns; - $qb = $this->prepareListOfIdsQuery($fdnsSlice); + $qb = $this->prepareListOfIdsQuery(); + $countFns = count($fdns); - while (isset($fdnsSlice[999])) { + do { // Oracle does not allow more than 1000 values in the IN list, // but allows slicing - $slice++; - $fdnsSlice = array_slice($fdns, $sliceSize * ($slice - 1), $sliceSize); - - /** @see https://github.com/vimeo/psalm/issues/4995 */ - /** @psalm-suppress TypeDoesNotContainType */ - if (!isset($qb)) { - $qb = $this->prepareListOfIdsQuery($fdnsSlice); - continue; - } - - if (!empty($fdnsSlice)) { - $qb->orWhere($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($fdnsSlice, QueryBuilder::PARAM_STR_ARRAY))); - } + $fdnsSlice = $countFns > $sliceSize ? array_slice($fdns, $sliceSize * $slice, $sliceSize) : $fdns; - if ($slice % $maxSlices === 0) { - $this->collectResultsFromListOfIdsQuery($qb, $results); - unset($qb); - } - } - - if (isset($qb)) { + $qb->setParameter('hashList', $fdnsSlice, IQueryBuilder::PARAM_STR_ARRAY); $this->collectResultsFromListOfIdsQuery($qb, $results); - } + $slice++; + } while (count($fdnsSlice) >= 1000); return $results; } diff --git a/apps/user_ldap/lib/Proxy.php b/apps/user_ldap/lib/Proxy.php index d9546a163ab89..0168e5927ac08 100644 --- a/apps/user_ldap/lib/Proxy.php +++ b/apps/user_ldap/lib/Proxy.php @@ -35,6 +35,7 @@ use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Share\IManager; use Psr\Log\LoggerInterface; @@ -83,12 +84,13 @@ private function addAccess($configPrefix) { $coreNotificationManager = \OC::$server->getNotificationManager(); $shareManager = \OC::$server->get(IManager::class); $logger = \OC::$server->get(LoggerInterface::class); + $dispatcher = \OC::$server->get(IEventDispatcher::class); } $userManager = new Manager($ocConfig, $fs, $logger, $avatarM, new \OCP\Image(), $coreUserManager, $coreNotificationManager, $shareManager); $connector = new Connection($this->ldap, $configPrefix); - $access = new Access($connector, $this->ldap, $userManager, new Helper($ocConfig, \OC::$server->getDatabaseConnection()), $ocConfig, $coreUserManager, $logger); + $access = new Access($connector, $this->ldap, $userManager, new Helper($ocConfig, \OC::$server->getDatabaseConnection()), $ocConfig, $coreUserManager, $logger, $dispatcher); $access->setUserMapper($userMap); $access->setGroupMapper($groupMap); self::$accesses[$configPrefix] = $access; diff --git a/apps/user_ldap/tests/AccessTest.php b/apps/user_ldap/tests/AccessTest.php index c2902a677669a..d84080e320c23 100644 --- a/apps/user_ldap/tests/AccessTest.php +++ b/apps/user_ldap/tests/AccessTest.php @@ -44,6 +44,7 @@ use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\OfflineUser; use OCA\User_LDAP\User\User; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IAvatarManager; use OCP\IConfig; use OCP\Image; @@ -81,8 +82,9 @@ class AccessTest extends TestCase { private $ncUserManager; /** @var LoggerInterface|MockObject */ private $logger; - /** @var Access */ - private $access; + /** @var IEventDispatcher|MockObject */ + private $dispatcher; + private Access $access; protected function setUp(): void { $this->connection = $this->createMock(Connection::class); @@ -95,6 +97,7 @@ protected function setUp(): void { $this->ncUserManager = $this->createMock(IUserManager::class); $this->shareManager = $this->createMock(IManager::class); $this->logger = $this->createMock(LoggerInterface::class); + $this->dispatcher = $this->createMock(IEventDispatcher::class); $this->access = new Access( $this->connection, @@ -103,8 +106,10 @@ protected function setUp(): void { $this->helper, $this->config, $this->ncUserManager, - $this->logger + $this->logger, + $this->dispatcher ); + $this->dispatcher->expects($this->any())->method('dispatchTyped');; $this->access->setUserMapper($this->userMapper); $this->access->setGroupMapper($this->groupMapper); } @@ -123,6 +128,8 @@ private function getConnectorAndLdapMock() { $this->createMock(Image::class), $this->createMock(IUserManager::class), $this->createMock(INotificationManager::class), + $this->createMock(IManager::class), + $this->createMock(IEventDispatcher::class), $this->shareManager]) ->getMock(); $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); @@ -243,7 +250,7 @@ public function testStringResemblesDN($case) { [$lw, $con, $um, $helper] = $this->getConnectorAndLdapMock(); /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject $config */ $config = $this->createMock(IConfig::class); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->dispatcher); $lw->expects($this->exactly(1)) ->method('explodeDN') @@ -266,7 +273,7 @@ public function testStringResemblesDNLDAPmod($case) { /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject $config */ $config = $this->createMock(IConfig::class); $lw = new LDAP(); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->dispatcher); if (!function_exists('ldap_explode_dn')) { $this->markTestSkipped('LDAP Module not available'); @@ -447,7 +454,7 @@ public function testSanitizeDN($attribute) { $attribute => ['count' => 1, $dnFromServer] ]); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->dispatcher); $values = $access->readAttribute('uid=whoever,dc=example,dc=org', $attribute); $this->assertSame($values[0], strtolower($dnFromServer)); } diff --git a/apps/user_ldap/tests/Jobs/SyncTest.php b/apps/user_ldap/tests/Jobs/SyncTest.php index 5592a2531bce1..0980d2a76e949 100644 --- a/apps/user_ldap/tests/Jobs/SyncTest.php +++ b/apps/user_ldap/tests/Jobs/SyncTest.php @@ -34,11 +34,14 @@ use OCA\User_LDAP\LDAP; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IDBConnection; use OCP\IUserManager; use OCP\Notification\IManager; +use Psr\Log\LoggerInterface; use Test\TestCase; class SyncTest extends TestCase { @@ -85,23 +88,25 @@ protected function setUp(): void { $this->connectionFactory = $this->createMock(ConnectionFactory::class); $this->accessFactory = $this->createMock(AccessFactory::class); - $this->arguments = [ - 'helper' => $this->helper, - 'ldapWrapper' => $this->ldapWrapper, - 'mapper' => $this->mapper, - 'config' => $this->config, - 'avatarManager' => $this->avatarManager, - 'dbc' => $this->dbc, - 'ncUserManager' => $this->ncUserManager, - 'notificationManager' => $this->notificationManager, - 'connectionFactory' => $this->connectionFactory, - 'accessFactory' => $this->accessFactory, - ]; - - $this->sync = new Sync($this->userManager); + $this->sync = new Sync( + $this->userManager, + \OC::$server->get(IEventDispatcher::class), + $this->config, + \OC::$server->get(ITimeFactory::class), + $this->dbc, + $this->avatarManager, + $this->ncUserManager, + \OC::$server->get(LoggerInterface::class), + $this->notificationManager, + $this->mapper, + $this->helper, + $this->connectionFactory + ); + // FIXME + $this->sync->overwritePropertiesForTest($this->ldapWrapper, $this->accessFactory); } - public function intervalDataProvider() { + public function intervalDataProvider(): array { return [ [ 0, 1000, 750 @@ -124,7 +129,7 @@ public function intervalDataProvider() { /** * @dataProvider intervalDataProvider */ - public function testUpdateInterval($userCount, $pagingSize1, $pagingSize2) { + public function testUpdateInterval(int $userCount, int $pagingSize1, int $pagingSize2): void { $this->config->expects($this->once()) ->method('setAppValue') ->with('user_ldap', 'background_sync_interval', $this->anything()) @@ -150,7 +155,6 @@ public function testUpdateInterval($userCount, $pagingSize1, $pagingSize2) { ->method('count') ->willReturn($userCount); - $this->sync->setArgument($this->arguments); $this->sync->updateInterval(); } @@ -251,7 +255,7 @@ public function testDetermineNextCycle($cycleData, $prefixes, $expectedCycle) { } } - public function testQualifiesToRun() { + public function testQualifiesToRun(): void { $cycleData = ['prefix' => 's01']; $this->config->expects($this->exactly(2)) diff --git a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php b/apps/user_ldap/tests/Mapping/AbstractMappingTest.php index 0d21172445f6c..23b95313689a3 100644 --- a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php +++ b/apps/user_ldap/tests/Mapping/AbstractMappingTest.php @@ -35,7 +35,7 @@ abstract public function getMapper(\OCP\IDBConnection $dbMock); /** * kiss test on isColNameValid */ - public function testIsColNameValid() { + public function testIsColNameValid(): void { $dbMock = $this->createMock(IDBConnection::class); $mapper = $this->getMapper($dbMock); @@ -45,9 +45,8 @@ public function testIsColNameValid() { /** * returns an array of test entries with dn, name and uuid as keys - * @return array */ - protected function getTestData() { + protected function getTestData(): array { $data = [ [ 'dn' => 'uid=foobar,dc=example,dc=org', @@ -89,7 +88,7 @@ protected function mapEntries($mapper, $data) { * users or groups */ private function initTest() { - $dbc = \OC::$server->getDatabaseConnection(); + $dbc = \OC::$server->get(IDBConnection::class); $mapper = $this->getMapper($dbc); $data = $this->getTestData(); // make sure DB is pristine, then fill it with test entries diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index d08312ad78963..2329c88dc506e 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -1951,18 +1951,12 @@ $i $lastChange - + $interval 0 0 self::MIN_INTERVAL - - $argument - - - null - @@ -1975,14 +1969,6 @@ 3600 - - - isset($qb) - - - isset($qb) - - protected function handleRequest($id, $method, $parameters, $passOnWhen = false) { diff --git a/lib/composer/autoload.php b/lib/composer/autoload.php index 6de0160c0b5b4..a3d144b1777de 100644 --- a/lib/composer/autoload.php +++ b/lib/composer/autoload.php @@ -2,6 +2,11 @@ // autoload.php @generated by Composer +if (PHP_VERSION_ID < 50600) { + echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + exit(1); +} + require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c::getLoader(); diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index a113989241ee0..c7b73a4d9ee46 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -585,6 +585,7 @@ 'OCP\\User\\Events\\BeforePasswordUpdatedEvent' => $baseDir . '/lib/public/User/Events/BeforePasswordUpdatedEvent.php', 'OCP\\User\\Events\\BeforeUserCreatedEvent' => $baseDir . '/lib/public/User/Events/BeforeUserCreatedEvent.php', 'OCP\\User\\Events\\BeforeUserDeletedEvent' => $baseDir . '/lib/public/User/Events/BeforeUserDeletedEvent.php', + 'OCP\\User\\Events\\BeforeUserIdUnassignedEvent' => $baseDir . '/lib/public/User/Events/BeforeUserIdUnassignedEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedInEvent' => $baseDir . '/lib/public/User/Events/BeforeUserLoggedInEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedInWithCookieEvent' => $baseDir . '/lib/public/User/Events/BeforeUserLoggedInWithCookieEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedOutEvent' => $baseDir . '/lib/public/User/Events/BeforeUserLoggedOutEvent.php', @@ -593,6 +594,8 @@ 'OCP\\User\\Events\\UserChangedEvent' => $baseDir . '/lib/public/User/Events/UserChangedEvent.php', 'OCP\\User\\Events\\UserCreatedEvent' => $baseDir . '/lib/public/User/Events/UserCreatedEvent.php', 'OCP\\User\\Events\\UserDeletedEvent' => $baseDir . '/lib/public/User/Events/UserDeletedEvent.php', + 'OCP\\User\\Events\\UserIdAssignedEvent' => $baseDir . '/lib/public/User/Events/UserIdAssignedEvent.php', + 'OCP\\User\\Events\\UserIdUnassignedEvent' => $baseDir . '/lib/public/User/Events/UserIdUnassignedEvent.php', 'OCP\\User\\Events\\UserLiveStatusEvent' => $baseDir . '/lib/public/User/Events/UserLiveStatusEvent.php', 'OCP\\User\\Events\\UserLoggedInEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInEvent.php', 'OCP\\User\\Events\\UserLoggedInWithCookieEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInWithCookieEvent.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 10ac5e39d0d08..94cf50be1bbb0 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -614,6 +614,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\User\\Events\\BeforePasswordUpdatedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforePasswordUpdatedEvent.php', 'OCP\\User\\Events\\BeforeUserCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserCreatedEvent.php', 'OCP\\User\\Events\\BeforeUserDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserDeletedEvent.php', + 'OCP\\User\\Events\\BeforeUserIdUnassignedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserIdUnassignedEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedInEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserLoggedInEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedInWithCookieEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserLoggedInWithCookieEvent.php', 'OCP\\User\\Events\\BeforeUserLoggedOutEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/BeforeUserLoggedOutEvent.php', @@ -622,6 +623,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\User\\Events\\UserChangedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserChangedEvent.php', 'OCP\\User\\Events\\UserCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserCreatedEvent.php', 'OCP\\User\\Events\\UserDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserDeletedEvent.php', + 'OCP\\User\\Events\\UserIdAssignedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserIdAssignedEvent.php', + 'OCP\\User\\Events\\UserIdUnassignedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserIdUnassignedEvent.php', 'OCP\\User\\Events\\UserLiveStatusEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserLiveStatusEvent.php', 'OCP\\User\\Events\\UserLoggedInEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserLoggedInEvent.php', 'OCP\\User\\Events\\UserLoggedInWithCookieEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserLoggedInWithCookieEvent.php', diff --git a/lib/public/User/Events/BeforeUserIdUnassignedEvent.php b/lib/public/User/Events/BeforeUserIdUnassignedEvent.php new file mode 100644 index 0000000000000..79011d96e53dc --- /dev/null +++ b/lib/public/User/Events/BeforeUserIdUnassignedEvent.php @@ -0,0 +1,27 @@ +userId = $userId; + } + + /** + * @since 25.0.0 + */ + public function getUserId(): string { + return $this->userId; + } +} diff --git a/lib/public/User/Events/UserIdAssignedEvent.php b/lib/public/User/Events/UserIdAssignedEvent.php new file mode 100644 index 0000000000000..781aaeb1d643e --- /dev/null +++ b/lib/public/User/Events/UserIdAssignedEvent.php @@ -0,0 +1,27 @@ +userId = $userId; + } + + /** + * @since 25.0.0 + */ + public function getUserId(): string { + return $this->userId; + } +} diff --git a/lib/public/User/Events/UserIdUnassignedEvent.php b/lib/public/User/Events/UserIdUnassignedEvent.php new file mode 100644 index 0000000000000..c6b45c2e831e9 --- /dev/null +++ b/lib/public/User/Events/UserIdUnassignedEvent.php @@ -0,0 +1,27 @@ +userId = $userId; + } + + /** + * @since 25.0.0 + */ + public function getUserId(): string { + return $this->userId; + } +}