Skip to content

Commit 7d505a9

Browse files
committed
Make LoginView allow cross-origin requests in local dev environment
This makes the Git manager link in A+ work in local development environment.
1 parent 4b07e78 commit 7d505a9

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

access/views.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import os.path
55
from pathlib import Path
6+
import re
67
from typing import Any, Dict, List, Optional, Tuple
78

89
from aplus_auth.auth.django import Request
@@ -28,6 +29,7 @@
2829

2930

3031
logger = logging.getLogger("access.views")
32+
LOCAL_DEV_ORIGIN_RE = re.compile(r"^https?://(localhost|127\.0\.0\.1)(:\d+)?$")
3133

3234

3335
@login_required
@@ -346,19 +348,33 @@ def publish(
346348

347349

348350
class LoginView(View):
351+
@staticmethod
352+
def _add_cors_headers(request: HttpRequest, response: HttpResponse) -> HttpResponse:
353+
origin = request.headers.get("Origin")
354+
if origin and settings.DEBUG and LOCAL_DEV_ORIGIN_RE.match(origin):
355+
response["Access-Control-Allow-Origin"] = origin
356+
response["Access-Control-Allow-Credentials"] = "true"
357+
response["Access-Control-Allow-Headers"] = "Authorization, Content-Type"
358+
response["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS"
359+
response.setdefault("Vary", "Origin")
360+
return response
361+
362+
def options(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
363+
return self._add_cors_headers(request, HttpResponse(status=204))
364+
349365
def get(self, request):
350366
response = render(request, 'access/login.html')
351367
response.delete_cookie("AuthToken")
352-
return response
368+
return self._add_cors_headers(request, response)
353369

354370
def post(self, request):
355371
if not hasattr(request, "user") or not request.user.is_authenticated:
356-
return HttpResponse("Invalid token", status=401)
372+
return self._add_cors_headers(request, HttpResponse("Invalid token", status=401))
357373
else:
358374
response = HttpResponse()
359375
# secure=not settings.DEBUG so that we do not need https when developing
360376
response.set_cookie("AuthToken", str(request.auth), secure=not settings.DEBUG, httponly=True)
361-
return response
377+
return self._add_cors_headers(request, response)
362378

363379

364380
def _get_course_exercise_lang(

0 commit comments

Comments
 (0)