summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrendan Abolivier <babolivier@matrix.org>2020-03-26 18:58:58 +0100
committerBrendan Abolivier <babolivier@matrix.org>2020-03-26 18:58:58 +0100
commitc2ab0b30664439d09436a39e5448728c67b0414c (patch)
tree044702c28f3e38bc7faa0ce679d1da154e203ed3
parentmatrix.org was fine (diff)
downloadsynapse-c2ab0b30664439d09436a39e5448728c67b0414c.tar.xz
Whitelist the login fallback by default for SSO
-rw-r--r--synapse/config/sso.py17
-rw-r--r--tests/rest/client/v1/test_login.py13
2 files changed, 28 insertions, 2 deletions
diff --git a/synapse/config/sso.py b/synapse/config/sso.py
index 95762689bc..5ae9db83d0 100644
--- a/synapse/config/sso.py
+++ b/synapse/config/sso.py
@@ -39,6 +39,17 @@ class SSOConfig(Config):
 
         self.sso_client_whitelist = sso_config.get("client_whitelist") or []
 
+        # Attempt to also whitelist the server's login fallback, since that fallback sets
+        # the redirect URL to itself (so it can process the login token then return
+        # gracefully to the client). This would make it pointless to ask the user for
+        # confirmation, since the URL the confirmation page would be showing wouldn't be
+        # the client's.
+        # public_baseurl is an optional setting, so we only add the fallback's URL to the
+        # list if it's provided (because we can't figure out what that URL is otherwise).
+        if self.public_baseurl:
+            login_fallback_url = self.public_baseurl + "_matrix/static/client/login"
+            self.sso_client_whitelist.append(login_fallback_url)
+
     def generate_config_section(self, **kwargs):
         return """\
         # Additional settings to use with single-sign on systems such as SAML2 and CAS.
@@ -54,7 +65,11 @@ class SSOConfig(Config):
             # phishing attacks from evil.site. To avoid this, include a slash after the
             # hostname: "https://my.client/".
             #
-            # By default, this list is empty.
+            # If public_baseurl is set, then the login fallback page (used by clients
+            # that don't have full support for SSO) is always included in this list.
+            #
+            # By default, this list is empty, except if public_baseurl is set (in which
+            # case the login fallback page is the only element in the list).
             #
             #client_whitelist:
             #  - https://riot.im/develop
diff --git a/tests/rest/client/v1/test_login.py b/tests/rest/client/v1/test_login.py
index da2c9bfa1e..ed02ff1dcc 100644
--- a/tests/rest/client/v1/test_login.py
+++ b/tests/rest/client/v1/test_login.py
@@ -350,7 +350,18 @@ class CASRedirectConfirmTestCase(unittest.HomeserverTestCase):
     def test_cas_redirect_whitelisted(self):
         """Tests that the SSO login flow serves a redirect to a whitelisted url
         """
-        redirect_url = "https://legit-site.com/"
+        self._test_redirect("https://legit-site.com/")
+
+    @override_config(
+        {
+            "public_baseurl": "https://example.com"
+        }
+    )
+    def test_cas_redirect_login_fallback(self):
+        self._test_redirect("https://example.com/_matrix/static/client/login")
+
+    def _test_redirect(self, redirect_url):
+        """Tests that the SSO login flow serves a redirect for the given redirect URL."""
         cas_ticket_url = (
             "/_matrix/client/r0/login/cas/ticket?redirectUrl=%s&ticket=ticket"
             % (urllib.parse.quote(redirect_url))