Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f84d8063 authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Invalidate sso sessions on password update

parent 8a96caa6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ namespace OCA\EcloudAccounts\AppInfo;

use OCA\EcloudAccounts\Listeners\BeforeTemplateRenderedListener;
use OCA\EcloudAccounts\Listeners\BeforeUserDeletedListener;
use OCA\EcloudAccounts\Listeners\PasswordUpdatedListener;
use OCA\EcloudAccounts\Listeners\TwoFactorStateChangedListener;
use OCA\EcloudAccounts\Listeners\UserChangedListener;
use OCA\EcloudAccounts\Service\LDAPConnectionService;
@@ -39,6 +40,7 @@ use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\IUserManager;
use OCP\User\Events\BeforeUserDeletedEvent;
use OCP\User\Events\PasswordUpdatedEvent;
use OCP\User\Events\UserChangedEvent;

class Application extends App implements IBootstrap {
@@ -53,6 +55,7 @@ class Application extends App implements IBootstrap {
		$context->registerEventListener(BeforeUserDeletedEvent::class, BeforeUserDeletedListener::class);
		$context->registerEventListener(UserChangedEvent::class, UserChangedListener::class);
		$context->registerEventListener(StateChanged::class, TwoFactorStateChangedListener::class);
		$context->registerEventListener(PasswordUpdatedEvent::class, PasswordUpdatedListener::class);
	}

	public function boot(IBootContext $context): void {
+39 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace OCA\EcloudAccounts\Listeners;

use Exception;
use OCA\EcloudAccounts\Service\SSOService;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\ILogger;
use OCP\User\Events\PasswordUpdatedEvent;

class PasswordUpdatedListener implements IEventListener {
	
	private SSOService $ssoService;

	private $logger;

	public function __construct(SSOService $ssoService, ILogger $logger) {
		$this->ssoService = $ssoService;
		$this->logger = $logger;
	}

	public function handle(Event $event): void {
		if (!($event instanceof PasswordUpdatedEvent)) {
			return;
		}

		$user = $event->getUser();
		$username = $user->getUID();

		try {
			$this->ssoService->logout($username);
		} catch (Exception $e) {
			$this->logger->logException('Failed to logout from ssoService for user: ' . $username, ['exception' => $e]);
		}
	}
}
+11 −0
Original line number Diff line number Diff line
@@ -85,6 +85,17 @@ class SSOService {
		}
	}

	public function logout(string $username) : void {
		if(empty($this->currentUserId)) {
			$this->getUserId($username);
		}

		$url = $this->ssoConfig['admin_rest_api_url'] . self::USERS_ENDPOINT . '/' . $this->currentUserId . '/logout';

		$this->logger->debug('logout calling SSO API with url: '. $url);
		$this->callSSOAPI($url, 'POST', [], 204);
	}

	private function getCredentialIds() : array {
		$url = $this->ssoConfig['admin_rest_api_url'] . self::CREDENTIALS_ENDPOINT;
		$url = str_replace('{USER_ID}', $this->currentUserId, $url);