Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 1fcf9c6

Browse files
authored
Fix CAS redirect url (#6634)
Build the same service URL when requesting the CAS ticket and when calling the proxyValidate URL.
1 parent 190ab59 commit 1fcf9c6

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

changelog.d/6634.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix single-sign on with CAS systems: pass the same service URL when requesting the CAS ticket and when calling the `proxyValidate` URL. Contributed by @Naugrimm.

synapse/rest/client/v1/login.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ def login_id_thirdparty_from_phone(identifier):
7272
return {"type": "m.id.thirdparty", "medium": "msisdn", "address": msisdn}
7373

7474

75+
def build_service_param(cas_service_url, client_redirect_url):
76+
return "%s%s?redirectUrl=%s" % (
77+
cas_service_url,
78+
"/_matrix/client/r0/login/cas/ticket",
79+
urllib.parse.quote(client_redirect_url, safe=""),
80+
)
81+
82+
7583
class LoginRestServlet(RestServlet):
7684
PATTERNS = client_patterns("/login$", v1=True)
7785
CAS_TYPE = "m.login.cas"
@@ -427,18 +435,15 @@ def get_sso_url(self, client_redirect_url):
427435
class CasRedirectServlet(BaseSSORedirectServlet):
428436
def __init__(self, hs):
429437
super(CasRedirectServlet, self).__init__()
430-
self.cas_server_url = hs.config.cas_server_url.encode("ascii")
431-
self.cas_service_url = hs.config.cas_service_url.encode("ascii")
438+
self.cas_server_url = hs.config.cas_server_url
439+
self.cas_service_url = hs.config.cas_service_url
432440

433441
def get_sso_url(self, client_redirect_url):
434-
client_redirect_url_param = urllib.parse.urlencode(
435-
{b"redirectUrl": client_redirect_url}
436-
).encode("ascii")
437-
hs_redirect_url = self.cas_service_url + b"/_matrix/client/r0/login/cas/ticket"
438-
service_param = urllib.parse.urlencode(
439-
{b"service": b"%s?%s" % (hs_redirect_url, client_redirect_url_param)}
440-
).encode("ascii")
441-
return b"%s/login?%s" % (self.cas_server_url, service_param)
442+
args = urllib.parse.urlencode(
443+
{"service": build_service_param(self.cas_service_url, client_redirect_url)}
444+
)
445+
446+
return "%s/login?%s" % (self.cas_server_url, args)
442447

443448

444449
class CasTicketServlet(RestServlet):
@@ -458,7 +463,7 @@ async def on_GET(self, request):
458463
uri = self.cas_server_url + "/proxyValidate"
459464
args = {
460465
"ticket": parse_string(request, "ticket", required=True),
461-
"service": self.cas_service_url,
466+
"service": build_service_param(self.cas_service_url, client_redirect_url),
462467
}
463468
try:
464469
body = await self._http_client.get_raw(uri, args)

0 commit comments

Comments
 (0)