Browse Source

feat(ecosystem): Return connection errors from oauth issues (#40743)

Scott Cooper 2 years ago
parent
commit
cba4467cad
2 changed files with 23 additions and 0 deletions
  1. 7 0
      src/sentry/identity/oauth2.py
  2. 16 0
      tests/sentry/identity/test_oauth2.py

+ 7 - 0
src/sentry/identity/oauth2.py

@@ -296,6 +296,13 @@ class OAuth2CallbackView(PipelineView):
                 "error": "Could not verify SSL certificate",
                 "error_description": f"Ensure that {url} has a valid SSL certificate",
             }
+        except ConnectionError:
+            url = self.access_token_url
+            logger.info("identity.oauth2.connection-error", extra={"url": url})
+            return {
+                "error": "Could not connect to host or service",
+                "error_description": f"Ensure that {url} is open to connections",
+            }
         except json.JSONDecodeError:
             logger.info("identity.oauth2.json-error", extra={"url": self.access_token_url})
             return {

+ 16 - 0
tests/sentry/identity/test_oauth2.py

@@ -98,6 +98,22 @@ class OAuth2CallbackViewTest(TestCase):
         assert "error_description" in result
         assert "SSL" in result["error_description"]
 
+    @responses.activate
+    def test_connection_error(self):
+        def connection_error(request):
+            raise ConnectionError("Name or service not known")
+
+        responses.add_callback(
+            responses.POST, "https://example.org/oauth/token", callback=connection_error
+        )
+        pipeline = IdentityProviderPipeline(request=self.request, provider_key="dummy")
+        code = "auth-code"
+        result = self.view.exchange_token(self.request, pipeline, code)
+        assert "token" not in result
+        assert "error" in result
+        assert "connect" in result["error"]
+        assert "error_description" in result
+
     @responses.activate
     def test_exchange_token_no_json(self):
         responses.add(responses.POST, "https://example.org/oauth/token", body="")