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.urls import path
from django.views.generic import TemplateView from django.views.generic import TemplateView
from jabberfr.views import get_root_index, hebergement from jabberfr.views import get_root_index, hebergement, inscription
PAGES = [ PAGES = [
@ -28,6 +28,7 @@ PAGES = [
urlpatterns = [ urlpatterns = [
path('', get_root_index), path('', get_root_index),
path('hébergement', hebergement), path('hébergement', hebergement),
path('inscription', inscription),
] ]
urlpatterns += [ 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 aiodns import DNSResolver
from django.shortcuts import render from django.shortcuts import render
from django import forms from django import forms
from django.utils.safestring import mark_safe
from django.core.validators import RegexValidator, URLValidator from django.core.validators import RegexValidator, URLValidator
from jabberfr.validators import validate_jid_userpart
BASE_MUC_URL = 'http://[::1]:5280/muc_list/?' BASE_MUC_URL = 'http://[::1]:5280/muc_list/?'
@ -14,6 +16,34 @@ TABLE_END = """
</table> </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: async def get_chatrooms(*, limit: int = 25, order: str = 'users') -> str:
params = { params = {
@ -176,3 +206,56 @@ async def hebergement(request):
form = HebergForm() form = HebergForm()
context['form'] = form context['form'] = form
return render(request, 'hebergement.html', context=context) 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)