mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-05 04:04:59 -04:00
Give the user a better error when they present bad SSO creds
If a user tries to do UI Auth via SSO, but uses the wrong account on the SSO IdP, try to give them a better error. Previously, the UIA would claim to be successful, but then the operation in question would simply fail with "auth fail". Instead, serve up an error page which explains the failure.
This commit is contained in:
parent
233c8b9fce
commit
5310808d3b
5 changed files with 65 additions and 5 deletions
|
@ -23,6 +23,7 @@ from typing_extensions import NoReturn, Protocol
|
|||
from twisted.web.http import Request
|
||||
|
||||
from synapse.api.errors import Codes, RedirectException, SynapseError
|
||||
from synapse.handlers.ui_auth import UIAuthSessionDataConstants
|
||||
from synapse.http import get_request_user_agent
|
||||
from synapse.http.server import respond_with_html
|
||||
from synapse.http.site import SynapseRequest
|
||||
|
@ -147,6 +148,7 @@ class SsoHandler:
|
|||
self._server_name = hs.hostname
|
||||
self._registration_handler = hs.get_registration_handler()
|
||||
self._error_template = hs.config.sso_error_template
|
||||
self._bad_user_template = hs.config.sso_auth_bad_user_template
|
||||
self._auth_handler = hs.get_auth_handler()
|
||||
|
||||
# a lock on the mappings
|
||||
|
@ -577,20 +579,41 @@ class SsoHandler:
|
|||
auth_provider_id, remote_user_id,
|
||||
)
|
||||
|
||||
user_id_to_verify = await self._auth_handler.get_session_data(
|
||||
ui_auth_session_id, UIAuthSessionDataConstants.REQUEST_USER_ID
|
||||
) # type: str
|
||||
|
||||
if not user_id:
|
||||
logger.warning(
|
||||
"Remote user %s/%s has not previously logged in here: UIA will fail",
|
||||
auth_provider_id,
|
||||
remote_user_id,
|
||||
)
|
||||
# Let the UIA flow handle this the same as if they presented creds for a
|
||||
# different user.
|
||||
user_id = ""
|
||||
elif user_id != user_id_to_verify:
|
||||
logger.warning(
|
||||
"Remote user %s/%s mapped onto incorrect user %s: UIA will fail",
|
||||
auth_provider_id,
|
||||
remote_user_id,
|
||||
user_id,
|
||||
)
|
||||
else:
|
||||
# success!
|
||||
await self._auth_handler.complete_sso_ui_auth(
|
||||
user_id, ui_auth_session_id, request
|
||||
)
|
||||
return
|
||||
|
||||
await self._auth_handler.complete_sso_ui_auth(
|
||||
user_id, ui_auth_session_id, request
|
||||
# the user_id didn't match: mark the stage of the authentication as unsuccessful
|
||||
await self._store.mark_ui_auth_stage_complete(
|
||||
ui_auth_session_id, LoginType.SSO, ""
|
||||
)
|
||||
|
||||
# render an error page.
|
||||
html = self._bad_user_template.render(
|
||||
server_name=self._server_name, user_id_to_verify=user_id_to_verify,
|
||||
)
|
||||
respond_with_html(request, 200, html)
|
||||
|
||||
async def check_username_availability(
|
||||
self, localpart: str, session_id: str,
|
||||
) -> bool:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue