diff --git a/jabberfr/templates/inscription.html b/jabberfr/templates/inscription.html new file mode 100644 index 0000000..6fa9399 --- /dev/null +++ b/jabberfr/templates/inscription.html @@ -0,0 +1,28 @@ +{% extends "page_model.html" %} + +{% block content %} +
+

Inscription à un serveur Jabber par JabberFR

+

Cet outil va vous permettre de vous créer un compte Jabber.

+
+
+ +
+{% csrf_token %} + +{{ form.as_p }} + +

+En cliquant sur "Créer le compte" vous reconnaissez avoir pris connaissance et +être en accord avec les +Conditions Générales d'Utilisation du service. +

+

+ + +

+ +
+
+
+{% endblock %} diff --git a/jabberfr/urls.py b/jabberfr/urls.py index b6bbc56..ceb2745 100644 --- a/jabberfr/urls.py +++ b/jabberfr/urls.py @@ -16,7 +16,7 @@ Including another URLconf from django.urls import path from django.views.generic import TemplateView -from jabberfr.views import get_root_index, hebergement +from jabberfr.views import get_root_index, hebergement, inscription PAGES = [ @@ -28,6 +28,7 @@ PAGES = [ urlpatterns = [ path('', get_root_index), path('hébergement', hebergement), + path('inscription', inscription), ] urlpatterns += [ diff --git a/jabberfr/validators.py b/jabberfr/validators.py new file mode 100644 index 0000000..e295752 --- /dev/null +++ b/jabberfr/validators.py @@ -0,0 +1,15 @@ +from django.core.exceptions import ValidationError +from slixmpp import JID, InvalidJID + + +def validate_jid_userpart(value): + if len(value.encode('utf-8')) > 1023: + raise ValidationError( + f'"{value[:50]}…" est trop long pour être un nom d’utilisateur valide.' + ) + try: + JID(f'{value}@example.com') + except InvalidJID: + raise ValidationError( + f'"{value}" n’est pas un nom d’utilisateur valide.' + ) diff --git a/jabberfr/views.py b/jabberfr/views.py index 9605b6e..de6dfe2 100644 --- a/jabberfr/views.py +++ b/jabberfr/views.py @@ -3,7 +3,9 @@ from aiohttp import ClientSession, ClientError, ClientTimeout from aiodns import DNSResolver from django.shortcuts import render from django import forms +from django.utils.safestring import mark_safe from django.core.validators import RegexValidator, URLValidator +from jabberfr.validators import validate_jid_userpart BASE_MUC_URL = 'http://[::1]:5280/muc_list/?' @@ -14,6 +16,34 @@ TABLE_END = """ """ +USERNAME_HELP = """ + +""" + +SERVER_HELP = """ + +""" + + +PASSWORD_HELP = """ + +""" + + + async def get_chatrooms(*, limit: int = 25, order: str = 'users') -> str: params = { @@ -176,3 +206,56 @@ async def hebergement(request): form = HebergForm() context['form'] = form return render(request, 'hebergement.html', context=context) + + +class InscriptionForm(forms.Form): + username = forms.CharField( + help_text=mark_safe(USERNAME_HELP), + label='Nom d’utilisateur', + validators=[validate_jid_userpart], + required=True, + ) + server = forms.CharField( + label='Serveur Jabber', + required=True, + help_text=mark_safe(SERVER_HELP), + validators=[ + RegexValidator( + regex=URLValidator.host_re, + message='Ce nom de domaine n’est pas valide' + ) + ], + ) + password = forms.CharField( + widget=forms.PasswordInput, + label='Mot de passe', + required=True, + ) + confirm_password = forms.CharField( + widget=forms.PasswordInput, + label='Vérification du mot de passe', + required=True, + help_text=mark_safe(PASSWORD_HELP), + ) + + +def check_passwords(form): + if form.cleaned_data['password'] != form.cleaned_data['confirm_password']: + form.add_error( + 'confirm_password', 'Les mots de passe ne correspondent pas' + ) + return False + return True + + +async def inscription(request): + context = {} + if request.method == 'POST': + form = InscriptionForm(request.POST) + context['form'] = form + if form.is_valid() and check_passwords(form): + pass + else: + form = InscriptionForm() + context['form'] = form + return render(request, 'inscription.html', context=context)