compat: add a set_cookie function (#52929)

This commit is contained in:
Benjamin Dauvergne 2021-04-16 10:06:46 +02:00
parent c514c67927
commit 316248cf96
2 changed files with 23 additions and 22 deletions

View File

@ -21,3 +21,16 @@ if django.VERSION < (2, 1):
from http import cookies
cookies.Morsel._reserved.setdefault('samesite', 'SameSite')
def set_cookie(response, cookie_name, *args, **kwargs):
samesite = kwargs.pop('samesite', None)
response.set_cookie(cookie_name, *args, **kwargs)
if samesite is not None:
response.cookies[cookie_name]['samesite'] = samesite
else:
def set_cookie(response, cookie_name, *args, **kwargs):
response.set_cookie(cookie_name, *args, **kwargs)

View File

@ -19,7 +19,6 @@ import json
import logging
import uuid
import django
import requests
from django.conf import settings
from django.contrib import messages
@ -31,7 +30,7 @@ from django.utils.translation import get_language
from django.utils.translation import ugettext as _
from django.views.generic.base import View
import authentic2.compat.cookies # F401
from authentic2.compat.cookies import set_cookie
from authentic2.decorators import setting_enabled
from authentic2.utils import authenticate, good_next_url, login, redirect
@ -97,26 +96,15 @@ def oidc_login(request, pk, next_url=None, *args, **kwargs):
# it to user SameSite=Lax. See
# https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Set-Cookie/SameSite
# for more explanations.
if django.VERSION < (2, 1):
response.set_cookie(
'oidc-state',
value=state_id,
path=reverse('oidc-login-callback'),
httponly=True,
secure=request.is_secure(),
)
# work around lack of samesite parameter to set_cookie() in Django 1.11
# it also needs monkeypatch from authentic2.compat.cookies.
response.cookies['oidc-state']['samesite'] = 'Lax'
else:
response.set_cookie(
'oidc-state',
value=state_id,
path=reverse('oidc-login-callback'),
httponly=True,
secure=request.is_secure(),
samesite='Lax',
)
set_cookie(
response,
'oidc-state',
value=state_id,
path=reverse('oidc-login-callback'),
httponly=True,
secure=request.is_secure(),
samesite='Lax',
)
return response