From 6c7a68c9cae4a815d81927c79d9e7b8d1c762c15 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Tue, 20 Aug 2024 15:23:11 +0200 Subject: [PATCH 1/3] fix: strongly type get_configure_view cf. https://github.com/getsentry/sentry/pull/75395 --- oidc/provider.py | 19 +++++++++++++++---- oidc/views.py | 35 ++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/oidc/provider.py b/oidc/provider.py index e270113..2b03060 100644 --- a/oidc/provider.py +++ b/oidc/provider.py @@ -1,8 +1,17 @@ +from __future__ import annotations + +from collections.abc import Callable + +from django.http import HttpRequest + import time import requests from sentry.auth.provider import MigratingIdentityId from sentry.auth.providers.oauth2 import OAuth2Callback, OAuth2Login, OAuth2Provider +from sentry.auth.services.auth.model import RpcAuthProvider +from sentry.organizations.services.organization.model import RpcOrganization +from sentry.plugins.base.response import DeferredResponse from .constants import ( AUTHORIZATION_ENDPOINT, @@ -14,7 +23,7 @@ TOKEN_ENDPOINT, USERINFO_ENDPOINT, ) -from .views import FetchUser, OIDCConfigureView +from .views import FetchUser, oidc_configure_view class OIDCLogin(OAuth2Login): @@ -37,7 +46,7 @@ def get_authorize_params(self, state, redirect_uri): class OIDCProvider(OAuth2Provider): - name = ISSUER + name = ISSUER if ISSUER else "oidc" def __init__(self, domain=None, domains=None, version=None, **config): if domain: @@ -63,8 +72,10 @@ def get_client_id(self): def get_client_secret(self): return CLIENT_SECRET - def get_configure_view(self): - return OIDCConfigureView.as_view() + def get_configure_view( + self, + ) -> Callable[[HttpRequest, RpcOrganization, RpcAuthProvider], DeferredResponse]: + return oidc_configure_view def get_auth_pipeline(self): return [ diff --git a/oidc/views.py b/oidc/views.py index 2c9293a..8d3c9d0 100644 --- a/oidc/views.py +++ b/oidc/views.py @@ -1,7 +1,15 @@ +from __future__ import annotations + import logging -from sentry.auth.view import AuthView, ConfigureView +from django.http import HttpRequest +from rest_framework.response import Response + +from sentry.auth.services.auth.model import RpcAuthProvider +from sentry.auth.view import AuthView from sentry.utils import json +from sentry.organizations.services.organization.model import RpcOrganization +from sentry.plugins.base.response import DeferredResponse from sentry.utils.signing import urlsafe_b64decode from .constants import ERR_INVALID_RESPONSE, ISSUER @@ -15,7 +23,7 @@ def __init__(self, domains, version, *args, **kwargs): self.version = version super().__init__(*args, **kwargs) - def dispatch(self, request, helper): + def dispatch(self, request: HttpRequest, helper) -> Response: # type: ignore data = helper.fetch_state("data") try: @@ -52,17 +60,18 @@ def dispatch(self, request, helper): return helper.next_step() -class OIDCConfigureView(ConfigureView): - def dispatch(self, request, organization, auth_provider): - config = auth_provider.config - if config.get("domain"): - domains = [config["domain"]] - else: - domains = config.get("domains") - return self.render( - "oidc/configure.html", - {"provider_name": ISSUER or "", "domains": domains or []}, - ) +def oidc_configure_view( + request: HttpRequest, organization: RpcOrganization, auth_provider: RpcAuthProvider +) -> DeferredResponse: + config = auth_provider.config + if config.get("domain"): + domains: list[str] | None + domains = [config["domain"]] + else: + domains = config.get("domains") + return DeferredResponse( + "oidc/configure.html", {"provider_name": ISSUER or "", "domains": domains or []} + ) def extract_domain(email): From fad9d6b7386f8946097c910fe06c953d0fcab0b0 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Thu, 12 Sep 2024 15:49:01 +0200 Subject: [PATCH 2/3] fix: remove guard on ISSUER --- oidc/provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oidc/provider.py b/oidc/provider.py index 2b03060..e845d95 100644 --- a/oidc/provider.py +++ b/oidc/provider.py @@ -46,7 +46,7 @@ def get_authorize_params(self, state, redirect_uri): class OIDCProvider(OAuth2Provider): - name = ISSUER if ISSUER else "oidc" + name = ISSUER def __init__(self, domain=None, domains=None, version=None, **config): if domain: From 934ec42f4260d5ec54fa33c8a0e0c7b352aea3ba Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Thu, 12 Sep 2024 15:52:59 +0200 Subject: [PATCH 3/3] chore: apply https://github.com/siemens/sentry-auth-oidc/pull/49#r1756415028 --- oidc/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/oidc/views.py b/oidc/views.py index 8d3c9d0..3f4fed6 100644 --- a/oidc/views.py +++ b/oidc/views.py @@ -70,7 +70,8 @@ def oidc_configure_view( else: domains = config.get("domains") return DeferredResponse( - "oidc/configure.html", {"provider_name": ISSUER or "", "domains": domains or []} + "oidc/configure.html", + {"provider_name": ISSUER or "", "domains": domains or []} )