Skip to content

Commit 4bac4f9

Browse files
committed
Update CORS middleware and tests
1 parent e8e0148 commit 4bac4f9

File tree

7 files changed

+35
-32
lines changed

7 files changed

+35
-32
lines changed

oauth2_provider/middleware.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.contrib.auth import authenticate
33
from django.utils.cache import patch_vary_headers
44

5-
from .models import Application
5+
from .models import AbstractApplication, Application
66

77

88
class OAuth2TokenMiddleware:
@@ -45,18 +45,21 @@ def __call__(self, request):
4545
METHODS = ("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")
4646

4747

48-
class CorsMiddleware(object):
49-
def process_request(self, request):
48+
class CorsMiddleware:
49+
def __init__(self, get_response):
50+
self.get_response = get_response
51+
52+
def __call__(self, request):
5053
"""If this is a preflight-request, we must always return 200"""
5154
if request.method == "OPTIONS" and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META:
52-
return http.HttpResponse()
53-
return None
55+
response = http.HttpResponse()
56+
else:
57+
response = self.get_response(request)
5458

55-
def process_response(self, request, response):
5659
"""Add cors-headers to request if they can be derived correctly"""
5760
try:
5861
cors_allow_origin = _get_cors_allow_origin_header(request)
59-
except Application.NoSuitableOriginFoundError:
62+
except AbstractApplication.NoSuitableOriginFoundError:
6063
pass
6164
else:
6265
response["Access-Control-Allow-Origin"] = cors_allow_origin

oauth2_provider/models.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,16 @@ def clean(self):
193193
):
194194
raise ValidationError(_("You cannot use HS256 with public grants or clients"))
195195

196+
def get_absolute_url(self):
197+
return reverse("oauth2_provider:detail", args=[str(self.id)])
198+
199+
def get_allowed_schemes(self):
200+
"""
201+
Returns the list of redirect schemes allowed by the Application.
202+
By default, returns `ALLOWED_REDIRECT_URI_SCHEMES`.
203+
"""
204+
return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES
205+
196206
def get_cors_header(self, origin):
197207
"""Return a proper cors-header for this origin, in the context of this
198208
application.
@@ -211,16 +221,6 @@ def get_cors_header(self, origin):
211221
return origin
212222
raise Application.NoSuitableOriginFoundError
213223

214-
def get_absolute_url(self):
215-
return reverse("oauth2_provider:detail", args=[str(self.id)])
216-
217-
def get_allowed_schemes(self):
218-
"""
219-
Returns the list of redirect schemes allowed by the Application.
220-
By default, returns `ALLOWED_REDIRECT_URI_SCHEMES`.
221-
"""
222-
return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES
223-
224224
def allows_grant_type(self, *grant_types):
225225
return self.authorization_grant_type in grant_types
226226

@@ -242,6 +242,9 @@ def jwk_key(self):
242242
return jwk.JWK(kty="oct", k=base64url_encode(self.client_secret))
243243
raise ImproperlyConfigured("This application does not support signed tokens")
244244

245+
class NoSuitableOriginFoundError(Exception):
246+
pass
247+
245248

246249
class ApplicationManager(models.Manager):
247250
def get_by_natural_key(self, client_id):

tests/mig_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
]
4343

4444
MIDDLEWARE = [
45+
"oauth2_provider.middleware.CorsMiddleware",
4546
"django.middleware.security.SecurityMiddleware",
4647
"django.contrib.sessions.middleware.SessionMiddleware",
4748
"django.middleware.common.CommonMiddleware",

tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
]
6464

6565
MIDDLEWARE = (
66+
"oauth2_provider.middleware.CorsMiddleware",
6667
"django.middleware.common.CommonMiddleware",
6768
"django.contrib.sessions.middleware.SessionMiddleware",
6869
"django.middleware.csrf.CsrfViewMiddleware",

tests/test_cors_middleware.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
from datetime import timedelta
22

3-
from django.conf.urls import patterns, url
43
from django.contrib.auth import get_user_model
5-
from django.http import HttpResponse
64
from django.test import Client, TestCase, override_settings
75
from django.utils import timezone
8-
from django.views.generic import View
96

107
from oauth2_provider.models import AccessToken, get_application_model
118

@@ -14,19 +11,7 @@
1411
UserModel = get_user_model()
1512

1613

17-
class MockView(View):
18-
def post(self, request):
19-
return HttpResponse()
20-
21-
22-
urlpatterns = patterns(
23-
"",
24-
url(r"^cors-test/$", MockView.as_view()),
25-
)
26-
27-
2814
@override_settings(
29-
ROOT_URLCONF="oauth2_provider.tests.test_cors_middleware",
3015
AUTHENTICATION_BACKENDS=("oauth2_provider.backends.OAuth2Backend",),
3116
MIDDLEWARE_CLASSES=(
3217
"oauth2_provider.middleware.OAuth2TokenMiddleware",

tests/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from django.contrib import admin
22
from django.urls import include, path
33

4+
from .views import MockView
5+
46

57
admin.autodiscover()
68

79

810
urlpatterns = [
911
path("o/", include("oauth2_provider.urls", namespace="oauth2_provider")),
1012
path("admin/", admin.site.urls),
13+
path("cors-test/", MockView.as_view()),
1114
]

tests/views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.http import HttpResponse
2+
from django.views.generic import View
3+
4+
5+
class MockView(View):
6+
def post(self, request):
7+
return HttpResponse()

0 commit comments

Comments
 (0)