diff --git a/apps/files_external/lib/AppInfo/Application.php b/apps/files_external/lib/AppInfo/Application.php index 3189c73500ecc..027c8f0b232c2 100644 --- a/apps/files_external/lib/AppInfo/Application.php +++ b/apps/files_external/lib/AppInfo/Application.php @@ -59,7 +59,6 @@ use OCP\Group\Events\UserAddedEvent; use OCP\Group\Events\UserRemovedEvent; use OCP\User\Events\PasswordUpdatedEvent; -use OCP\User\Events\PostLoginEvent; use OCP\User\Events\UserCreatedEvent; use OCP\User\Events\UserDeletedEvent; use OCP\User\Events\UserLoggedInEvent; @@ -92,7 +91,7 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(UserCreatedEvent::class, MountCacheService::class); $context->registerEventListener(UserAddedEvent::class, MountCacheService::class); $context->registerEventListener(UserRemovedEvent::class, MountCacheService::class); - $context->registerEventListener(PostLoginEvent::class, MountCacheService::class); + $context->registerEventListener(UserLoggedInEvent::class, MountCacheService::class); $context->registerEventListener(UserLoggedInEvent::class, StorePasswordListener::class); $context->registerEventListener(PasswordUpdatedEvent::class, StorePasswordListener::class); diff --git a/apps/files_external/lib/Service/MountCacheService.php b/apps/files_external/lib/Service/MountCacheService.php index 12885694d7ac7..beab68026df45 100644 --- a/apps/files_external/lib/Service/MountCacheService.php +++ b/apps/files_external/lib/Service/MountCacheService.php @@ -26,13 +26,13 @@ use OCP\Group\Events\UserRemovedEvent; use OCP\IGroup; use OCP\IUser; -use OCP\User\Events\PostLoginEvent; use OCP\User\Events\UserCreatedEvent; +use OCP\User\Events\UserLoggedInEvent; /** * Listens to config events and update the mounts for the applicable users * - * @template-implements IEventListener + * @template-implements IEventListener */ class MountCacheService implements IEventListener { private CappedMemoryCache $storageRootCache; @@ -69,7 +69,7 @@ public function handle(Event $event): void { if ($event instanceof UserCreatedEvent) { $this->handleUserCreated($event->getUser()); } - if ($event instanceof PostLoginEvent) { + if ($event instanceof UserLoggedInEvent) { $this->onLogin($event->getUser()); } } diff --git a/apps/user_ldap/lib/AppInfo/Application.php b/apps/user_ldap/lib/AppInfo/Application.php index aba99a2940408..ade7635e00196 100644 --- a/apps/user_ldap/lib/AppInfo/Application.php +++ b/apps/user_ldap/lib/AppInfo/Application.php @@ -40,7 +40,7 @@ use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; use OCP\Share\IManager as IShareManager; -use OCP\User\Events\PostLoginEvent; +use OCP\User\Events\UserLoggedInEvent; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; @@ -75,7 +75,7 @@ function (ContainerInterface $c) { // the instance is specific to a lazy bound Access instance, thus cannot be shared. false ); - $context->registerEventListener(PostLoginEvent::class, LoginListener::class); + $context->registerEventListener(UserLoggedInEvent::class, LoginListener::class); $context->registerEventListener(LoadAdditionalBackendEvent::class, LoadAdditionalBackendListener::class); $context->registerSetupCheck(LdapInvalidUuids::class); $context->registerSetupCheck(LdapConnection::class); diff --git a/apps/user_ldap/lib/LoginListener.php b/apps/user_ldap/lib/LoginListener.php index 76b65fe1e4786..1f19566b7208c 100644 --- a/apps/user_ldap/lib/LoginListener.php +++ b/apps/user_ldap/lib/LoginListener.php @@ -23,11 +23,11 @@ use OCP\IUser; use OCP\Notification\IManager as INotificationManager; use OCP\Server; -use OCP\User\Events\PostLoginEvent; +use OCP\User\Events\UserLoggedInEvent; use Psr\Log\LoggerInterface; /** - * @template-implements IEventListener + * @template-implements IEventListener */ class LoginListener implements IEventListener { public function __construct( @@ -44,7 +44,7 @@ public function __construct( #[\Override] public function handle(Event $event): void { - if ($event instanceof PostLoginEvent) { + if ($event instanceof UserLoggedInEvent) { $this->onPostLogin($event->getUser()); } } diff --git a/lib/private/Authentication/Listeners/UserLoggedInListener.php b/lib/private/Authentication/Listeners/UserLoggedInListener.php index ff66433b95caa..c00626c6f9a85 100644 --- a/lib/private/Authentication/Listeners/UserLoggedInListener.php +++ b/lib/private/Authentication/Listeners/UserLoggedInListener.php @@ -12,10 +12,10 @@ use OC\Authentication\Token\Manager; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; -use OCP\User\Events\PostLoginEvent; +use OCP\User\Events\UserLoggedInEvent; /** - * @template-implements IEventListener + * @template-implements IEventListener */ class UserLoggedInListener implements IEventListener { public function __construct( @@ -25,7 +25,7 @@ public function __construct( #[\Override] public function handle(Event $event): void { - if (!($event instanceof PostLoginEvent)) { + if (!($event instanceof UserLoggedInEvent)) { return; } diff --git a/lib/private/Server.php b/lib/private/Server.php index 9e9e1ea0b5114..5b692c1a6c9f5 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -289,7 +289,6 @@ use OCP\Teams\ITeamManager; use OCP\Translation\ITranslationManager; use OCP\User\Events\BeforeUserDeletedEvent; -use OCP\User\Events\PostLoginEvent; use OCP\User\Events\UserChangedEvent; use OCP\User\Events\UserDeletedEvent; use OCP\User\Events\UserLoggedInEvent; @@ -1121,7 +1120,7 @@ private function connectDispatcher(): void { /** @var IEventDispatcher $eventDispatcher */ $eventDispatcher = $this->get(IEventDispatcher::class); $eventDispatcher->addServiceListener(LoginFailed::class, LoginFailedListener::class); - $eventDispatcher->addServiceListener(PostLoginEvent::class, UserLoggedInListener::class); + $eventDispatcher->addServiceListener(UserLoggedInEvent::class, UserLoggedInListener::class); $eventDispatcher->addServiceListener(UserLoggedInEvent::class, Store::class); $eventDispatcher->addServiceListener(UserLoggedInWithCookieEvent::class, Store::class); $eventDispatcher->addServiceListener(UserChangedEvent::class, UserChangedListener::class); diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index e154dad813879..e07ddec38df61 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -44,6 +44,7 @@ use OCP\User\Events\BeforeUserLoggedOutEvent; use OCP\User\Events\PostLoginEvent; use OCP\User\Events\UserFirstTimeLoggedInEvent; +use OCP\User\Events\UserLoggedInEvent; use OCP\User\Events\UserLoggedInWithCookieEvent; use OCP\User\Events\UserLoggedOutEvent; use OCP\Util; @@ -360,6 +361,12 @@ public function completeLogin(IUser $user, array $loginDetails, $regenerateSessi $loginDetails['password'], $isToken )); + $this->dispatcher->dispatchTyped(new UserLoggedInEvent( + $user, + $loginDetails['loginName'], + $loginDetails['password'], + $isToken + )); $this->manager->emit('\OC\User', 'postLogin', [ $user, $loginDetails['loginName'], diff --git a/lib/private/legacy/OC_User.php b/lib/private/legacy/OC_User.php index 3dff9c857a8f1..63217b1b930b7 100644 --- a/lib/private/legacy/OC_User.php +++ b/lib/private/legacy/OC_User.php @@ -27,7 +27,6 @@ use OCP\Server; use OCP\Session\Exceptions\SessionNotAvailableException; use OCP\User\Events\BeforeUserLoggedInEvent; -use OCP\User\Events\UserLoggedInEvent; use OCP\UserInterface; use Psr\Log\LoggerInterface; @@ -147,13 +146,18 @@ public static function loginWithApache(IApacheBackend $backend): bool { /** @var Session $userSession */ $userSession = Server::get(IUserSession::class); $dispatcher = Server::get(IEventDispatcher::class); + $request = Server::get(IRequest::class); + $user = $userSession->getUser(); - if ($userSession->getUser() && !$userSession->getUser()->isEnabled()) { + if (!$user) { + // Should not happen except from bad code or configuration + throw new \OCP\User\Exceptions\UserNotFoundException('User ' . $uid . ' not found'); + } + if (!$user->isEnabled()) { $message = Server::get(IFactory::class)->get('lib')->t('Account disabled'); throw new DisabledUserException($message); } - $userSession->setLoginName($uid); - $request = Server::get(IRequest::class); + $password = null; if ($backend instanceof IProvideUserSecretBackend) { $password = $backend->getCurrentUserSecret(); @@ -161,9 +165,12 @@ public static function loginWithApache(IApacheBackend $backend): bool { $dispatcher->dispatchTyped(new BeforeUserLoggedInEvent($uid, $password, $backend)); - $user = $userSession->getUser(); - $userSession->completeLogin($user, ['loginName' => $uid, 'password' => $password ?? '']); $userSession->createSessionToken($request, $uid, $uid, $password); + $userSession->completeLogin( + $user, + ['loginName' => $uid, 'password' => $password ?? ''], + regenerateSessionId:false, + ); $userSession->createRememberMeToken($user); if (empty($password)) { @@ -180,17 +187,6 @@ public static function loginWithApache(IApacheBackend $backend): bool { // simply skip updating the token when is it missing } } - - // first call the UserLoggedIn event, the login-process needs to be - // completed before we can safely create the user's folder. - // For example encryption needs to initialize the users keys first - // before we can create the user folder with the skeleton files - $dispatcher->dispatchTyped(new UserLoggedInEvent( - $user, - $uid, - null, - false) - ); } return true; } diff --git a/lib/public/User/Events/PostLoginEvent.php b/lib/public/User/Events/PostLoginEvent.php index af12ee0a0403f..b6069fa2e67f7 100644 --- a/lib/public/User/Events/PostLoginEvent.php +++ b/lib/public/User/Events/PostLoginEvent.php @@ -14,6 +14,7 @@ /** * @since 18.0.0 + * @deprecated 36.0.0 Use UserLoggedInEvent instead */ class PostLoginEvent extends Event { /** @var IUser */ diff --git a/lib/public/User/Events/UserLoggedInEvent.php b/lib/public/User/Events/UserLoggedInEvent.php index aa3da7a18b647..2ad1568617a18 100644 --- a/lib/public/User/Events/UserLoggedInEvent.php +++ b/lib/public/User/Events/UserLoggedInEvent.php @@ -16,27 +16,16 @@ * @since 18.0.0 */ class UserLoggedInEvent extends Event { - /** @var IUser */ - private $user; - - /** @var string|null */ - private $password; - - /** @var bool */ - private $isTokenLogin; - - /** @var string */ - private $loginName; - /** * @since 18.0.0 */ - public function __construct(IUser $user, string $loginName, ?string $password, bool $isTokenLogin) { + public function __construct( + private IUser $user, + private string $loginName, + private ?string $password, + private bool $isTokenLogin, + ) { parent::__construct(); - $this->user = $user; - $this->password = $password; - $this->isTokenLogin = $isTokenLogin; - $this->loginName = $loginName; } /** diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 00f57c06809cc..00342ad751534 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -37,6 +37,7 @@ use OCP\Security\ISecureRandom; use OCP\User\Events\BeforeUserLoggedInEvent; use OCP\User\Events\PostLoginEvent; +use OCP\User\Events\UserLoggedInEvent; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\ExpectationFailedException; @@ -194,10 +195,10 @@ public function testLoginValidPasswordEnabled(): void { $userSession->expects($this->once()) ->method('prepareUserLogin'); - $this->dispatcher->expects($this->once()) + $this->dispatcher->expects($this->exactly(2)) ->method('dispatchTyped') ->with( - $this->callback(function (PostLoginEvent $e): bool { + $this->callback(function (PostLoginEvent|UserLoggedInEvent $e): bool { return $e->getUser()->getUID() === 'foo' && $e->getPassword() === 'bar' && $e->isTokenLogin() === false;