Merge branch 'Aufinal/hcaptcha' into 'master'

Remplace recaptcha par hcaptcha

Closes #262

See merge request klub-dev-ens/gestioCOF!497
This commit is contained in:
Tom Hubrecht 2021-03-16 22:00:48 +01:00
commit c71e6d22bf
6 changed files with 33 additions and 21 deletions

View file

@ -23,6 +23,10 @@ adhérents ni des cotisations.
## Version ??? - dans un futur proche ## Version ??? - dans un futur proche
### TODO Prod
- Créer un compte hCaptcha (https://www.hcaptcha.com/), au COF, et remplacer les secrets associés
### K-Fêt ### K-Fêt
- L'accès à l'historique est maintenant limité à 7 jours pour raison de confidentialité. Les chefs/trez peuvent disposer d'une permission supplémentaire pour accèder à jusqu'à 30 jours en cas de problème de compta. L'accès à son historique personnel n'est pas limité. Les durées sont configurables dans `settings/cof_prod.py`. - L'accès à l'historique est maintenant limité à 7 jours pour raison de confidentialité. Les chefs/trez peuvent disposer d'une permission supplémentaire pour accèder à jusqu'à 30 jours en cas de problème de compta. L'accès à son historique personnel n'est pas limité. Les durées sont configurables dans `settings/cof_prod.py`.

View file

@ -26,8 +26,8 @@ REDIS_DB = import_secret("REDIS_DB")
REDIS_HOST = import_secret("REDIS_HOST") REDIS_HOST = import_secret("REDIS_HOST")
REDIS_PORT = import_secret("REDIS_PORT") REDIS_PORT = import_secret("REDIS_PORT")
RECAPTCHA_PUBLIC_KEY = import_secret("RECAPTCHA_PUBLIC_KEY") HCAPTCHA_SITEKEY = import_secret("HCAPTCHA_SITEKEY")
RECAPTCHA_PRIVATE_KEY = import_secret("RECAPTCHA_PRIVATE_KEY") HCAPTCHA_SECRET = import_secret("HCAPTCHA_SECRET")
KFETOPEN_TOKEN = import_secret("KFETOPEN_TOKEN") KFETOPEN_TOKEN = import_secret("KFETOPEN_TOKEN")
# --- # ---
@ -50,7 +50,7 @@ INSTALLED_APPS = (
+ [ + [
"bda", "bda",
"petitscours", "petitscours",
"captcha", "hcaptcha",
"kfet", "kfet",
"kfet.open", "kfet.open",
"channels", "channels",

View file

@ -16,8 +16,8 @@ REDIS_PORT = 6379
REDIS_DB = 0 REDIS_DB = 0
REDIS_HOST = "127.0.0.1" REDIS_HOST = "127.0.0.1"
RECAPTCHA_PUBLIC_KEY = "DUMMY" HCAPTCHA_SITEKEY = "10000000-ffff-ffff-ffff-000000000001"
RECAPTCHA_PRIVATE_KEY = "DUMMY" HCAPTCHA_SECRET = "0x0000000000000000000000000000000000000000"
EMAIL_HOST = None EMAIL_HOST = None

View file

@ -1,14 +1,28 @@
from captcha.fields import ReCaptchaField
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.forms import ModelForm from django.forms import ModelForm
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from django.utils.translation import gettext_lazy as _
from hcaptcha.fields import hCaptchaField
from petitscours.models import PetitCoursAbility, PetitCoursDemande from petitscours.models import PetitCoursAbility, PetitCoursDemande
class hCaptchaFieldWithErrors(hCaptchaField):
"""
Pour l'instant, hCaptchaField ne supporte pas le paramètre `error_messages` lors de
l'initialisation. Du coup, on les redéfinit à la main.
"""
default_error_messages = {
"required": _("Veuillez vérifier que vous êtes bien humain·e."),
"error_hcaptcha": _("Erreur lors de la vérification."),
"invalid_hcaptcha": _("Échec de la vérification !"),
}
class DemandeForm(ModelForm): class DemandeForm(ModelForm):
captcha = ReCaptchaField(attrs={"theme": "clean", "lang": "fr"}) captcha = hCaptchaFieldWithErrors()
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

View file

@ -1,5 +1,5 @@
import json import json
import os from unittest import mock
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import TestCase from django.test import TestCase
@ -257,18 +257,15 @@ class PetitCoursDemandeViewTestCase(ViewTestCaseMixin, TestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
os.environ["RECAPTCHA_TESTING"] = "True"
self.subject1 = create_petitcours_subject() self.subject1 = create_petitcours_subject()
self.subject2 = create_petitcours_subject() self.subject2 = create_petitcours_subject()
def tearDown(self):
os.environ["RECAPTCHA_TESTING"] = "False"
def test_get(self): def test_get(self):
resp = self.client.get(self.url) resp = self.client.get(self.url)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
def test_post(self): @mock.patch("hcaptcha.fields.hCaptchaField.clean")
def test_post(self, mock_clean):
data = { data = {
"name": "Le nom", "name": "Le nom",
"email": "lemail@mail.net", "email": "lemail@mail.net",
@ -280,7 +277,7 @@ class PetitCoursDemandeViewTestCase(ViewTestCaseMixin, TestCase):
"agrege_requis": "1", "agrege_requis": "1",
"niveau": "lycee", "niveau": "lycee",
"remarques": "no comment", "remarques": "no comment",
"g-recaptcha-response": "PASSED", "h-captcha-response": 1,
} }
resp = self.client.post(self.url, data) resp = self.client.post(self.url, data)
@ -299,18 +296,15 @@ class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
os.environ["RECAPTCHA_TESTING"] = "True"
self.subject1 = create_petitcours_subject() self.subject1 = create_petitcours_subject()
self.subject2 = create_petitcours_subject() self.subject2 = create_petitcours_subject()
def tearDown(self):
os.environ["RECAPTCHA_TESTING"] = "False"
def test_get(self): def test_get(self):
resp = self.client.get(self.url) resp = self.client.get(self.url)
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
def test_post(self): @mock.patch("hcaptcha.fields.hCaptchaField.clean")
def test_post(self, mock_clean):
data = { data = {
"name": "Le nom", "name": "Le nom",
"email": "lemail@mail.net", "email": "lemail@mail.net",
@ -322,7 +316,7 @@ class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase):
"agrege_requis": "1", "agrege_requis": "1",
"niveau": "lycee", "niveau": "lycee",
"remarques": "no comment", "remarques": "no comment",
"g-recaptcha-response": "PASSED", "h-captcha-response": 1,
} }
resp = self.client.post(self.url, data) resp = self.client.post(self.url, data)

View file

@ -3,7 +3,7 @@ Django==2.2.*
django-autocomplete-light==3.3.* django-autocomplete-light==3.3.*
django-cas-ng==3.6.* django-cas-ng==3.6.*
django-djconfig==0.8.0 django-djconfig==0.8.0
django-recaptcha==1.4.0 django-hCaptcha==0.1.0
icalendar icalendar
Pillow Pillow
django-bootstrap-form==3.3 django-bootstrap-form==3.3