WIP inscription

This commit is contained in:
Mathieu Pasquet 2021-04-17 23:44:11 +02:00
parent 19b524964b
commit 1cbcaa7945
4 changed files with 128 additions and 1 deletions

View File

@ -0,0 +1,28 @@
{% extends "page_model.html" %}
{% block content %}
<main>
<h2 class="center">Inscription à un serveur Jabber par JabberFR</h2>
<p>Cet outil va vous permettre de vous créer un compte <a href="https://wiki.jabberfr.org/Jabber">Jabber</a>.</p>
<hr />
<blockquote>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<p style="padding-top:30px">
En cliquant sur "Créer le compte" vous reconnaissez avoir pris connaissance et
être en accord avec les <a href="https://wiki.jabberfr.org/CGU" alt="CGU">
Conditions Générales d'Utilisation</a> du service.
</p>
<p style="padding-top:20px;">
<label for="register">Créer le compte: </label>
<input type="submit" value="Créer le compte" name="register" id="register"/>
</p>
</form>
</blockquote>
</main>
{% endblock %}

View File

@ -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 += [

15
jabberfr/validators.py Normal file
View File

@ -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 dutilisateur valide.'
)
try:
JID(f'{value}@example.com')
except InvalidJID:
raise ValidationError(
f'"{value}" nest pas un nom dutilisateur valide.'
)

View File

@ -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 = """
</table>
"""
USERNAME_HELP = """
<ul>
<li>Ceci est le <em>nom d'utilisateur</em> que vous utiliserez pour vous identifier sur votre compte.</li>
<li>Le nom d'utilisateur est insensible à la casse, <em>votrenom</em> est idententique à <em>VotreNom</em>.</li>
<li>Un nom d'utilisateur ne peut contenir <span style="text-decoration: underline;">aucun</span> de ces caractères: @ : ' " &lt; &gt; &amp;</li>
<li>Certains serveurs limitent la taille du nom d'utilisateur à 16 caractères.</li>
</ul>
"""
SERVER_HELP = """
<ul>
<li>Vous pouvez utiliser certains services de serveurs autres que celui sur lequel vous êtes inscrit, comme par exemple les salons de discussions.</li>
<li>Les serveurs proposés ici sont des serveurs faisant partis de la <a href="https://jabberfr.org/federation">fédération JabberFR</a>, JabberFR n'étant pas un serveur Jabber, mais un regroupement de serveurs autour des services comme le <a href="https://forum.jabberfr.org">forum</a> et le <a href="https://wiki.jabberfr.org">wiki</a>.</li>
</ul>
"""
PASSWORD_HELP = """
<ul>
<li>Ce mot de passe protège votre compte. Ne le divulguez à personne.
Personne d'autre que vous n'a besoin de votre mot de passe.</li>
<li>Vous pouvez toujours utiliser votre client Jabber pour changer votre mot de passe.</li>
<li>Vous pouvez prendre soin d'indiquer votre adresse e-mail dans les informations personnelles de votre compte afin de pouvoir vous faire envoyer votre mot de passe à l'aide du <a href="https://im.apinc.org/outils/password.php">formulaire</a>, autrement il vous sera impossible de récupérer le mot de passe en cas d'oubli.</li>
</ul>
"""
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 dutilisateur',
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 nest 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)