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

Commit 590710d4 authored by Ronak Patel's avatar Ronak Patel
Browse files

Merge branch 'dev/invalidate-session' into 'main'

invalidate all NC+Keycloak sessions on password change

See merge request !213
parents bf0e73ee 9a57c12e
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@
    <description><![CDATA[in /e/OS cloud, nextcloud accounts are linked to mail accounts. This app ensures both are coordinated: it sets the e-mail address, quota and storage of the user upon creation.
    It also completes the account deletion by cleaning other parts of the /e/OS cloud setup to ensure no more data is retained when a user requests an account deletion.
    This app uses the UserDeletedEvent to invoke scripts in the docker-welcome container of /e/OS cloud setup]]></description>
    <version>12.0.0</version>
    <version>12.0.1</version>
    <licence>agpl</licence>
    <author mail="dev@murena.com" homepage="https://murena.com/">Murena SAS</author>
    <namespace>EcloudAccounts</namespace>
+3 −1
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ class BeforeTemplateRenderedListener implements IEventListener {
		if (strpos($pathInfo, '/settings/user/migration') !== false) {
			$this->util->addScript($this->appName, $this->appName . '-settings-user-migration');
		}

		if (strpos($pathInfo, '/settings/user/security') !== false) {
			$this->util->addScript($this->appName, $this->appName . '-settings-user-security');
		}
	}
}
+18 −1
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace OCA\EcloudAccounts\Listeners;

use Exception;
use OC\Authentication\Token\IProvider as TokenProvider;
use OCA\EcloudAccounts\AppInfo\Application;
use OCA\EcloudAccounts\Service\SSOService;
use OCP\EventDispatcher\Event;
@@ -21,12 +22,14 @@ class PasswordUpdatedListener implements IEventListener {
	private ILogger $logger;
	private ISession $session;
	private IUserSession $userSession;
	private TokenProvider $tokenProvider;

	public function __construct(SSOService $ssoService, ILogger $logger, ISession $session, IUserSession $userSession) {
	public function __construct(SSOService $ssoService, ILogger $logger, ISession $session, IUserSession $userSession, TokenProvider $tokenProvider) {
		$this->ssoService = $ssoService;
		$this->logger = $logger;
		$this->session = $session;
		$this->userSession = $userSession;
		$this->tokenProvider = $tokenProvider;
	}

	public function handle(Event $event): void {
@@ -46,5 +49,19 @@ class PasswordUpdatedListener implements IEventListener {
		} catch (Exception $e) {
			$this->logger->logException($e, ['app' => Application::APP_ID]);
		}

		// Remove all Nextcloud sessions/tokens for the user (invalidate cache + storage)
		try {
			$this->tokenProvider->invalidateTokensOfUser($username, null);
		} catch (Exception $e) {
			$this->logger->logException($e, ['app' => Application::APP_ID]);
		}

		// Finally, log out the current session (also clears remember-me cookies)
		try {
			$this->userSession->logout();
		} catch (Exception $e) {
			$this->logger->logException($e, ['app' => Application::APP_ID]);
		}
	}
}
+22 −0
Original line number Diff line number Diff line
(function() {
	const OriginalXhr = window.XMLHttpRequest

	function PatchedXhr() {
		const xhr = new OriginalXhr()

		// We want to reload the page if password change request is successful
		xhr.addEventListener('load', function() {
			if (xhr.responseURL.includes('/settings/personal/changepassword') && xhr.status >= 200 && xhr.status < 300) {
				setTimeout(() => window.location.reload(), 1000)
			}
		})

		return xhr
	}

	// copy prototype to preserve methods
	PatchedXhr.prototype = OriginalXhr.prototype

	// replace global XHR
	window.XMLHttpRequest = PatchedXhr
})()
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ module.exports = {
		'delete-account-listeners': path.join(__dirname, 'src/delete-account-listeners.js'),
		'beta-user-setting': path.join(__dirname, 'src/beta-user-setting.js'),
		'settings-user-migration': path.join(__dirname, 'src/settings-user-migration.js'),
		'settings-user-security': path.join(__dirname, 'src/settings-user-security.js'),
		'signup': path.join(__dirname, 'src/signup.js')
	},
}