From 42ef9c2aa3ec9b71cb60be5088984ad527b00d10 Mon Sep 17 00:00:00 2001 From: Antoine Durand-Gasselin Date: Thu, 18 Jun 2009 03:33:15 +0200 Subject: [PATCH] [wiki/inscription.py] le checking marche MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ignore-this: b729df196ba555c36378988f522f72b4 * Reste à formatter et renvoyer les résultats * Rajouter tous les champs que l'on veut * Rajouter du js pour faire plus web2.0 darcs-hash:20090618013315-bd074-28f063d952bcebea89c9ae6724e0e84b2f8dfae9.gz --- wiki/action/inscription.py | 217 ++++++++++++++++++++++++++++++------- 1 file changed, 175 insertions(+), 42 deletions(-) diff --git a/wiki/action/inscription.py b/wiki/action/inscription.py index ab86672a..ec26ac2a 100644 --- a/wiki/action/inscription.py +++ b/wiki/action/inscription.py @@ -30,7 +30,7 @@ SXXo )XZX: |i> ._%i>~~+|ii| .i| ._s_ass,,. ._a%ssssssss License: GPLv3 """ -import re, locale, base64, sys +import re, locale, base64, sys, unicodedata from commands import getstatusoutput as gso sys.path.append("/usr/scripts/gestion") from iptools import AddrInNet @@ -38,65 +38,198 @@ from MoinMoin import wikiutil from MoinMoin.widget import html from MoinMoin.Page import Page from MoinMoin.PageEditor import PageEditor +from MoinMoin.formatter.text_html import Formatter -CHAMPS = ["nom Nom", u"prenom Prénom", "dob Date de naissance", - u"etudes Choisir une filière", u"tel Numéro de téléphone", - "chbre Chambre (ex: J042g, M666)", u"section Filière d'études", - u"annee année", "mail Adresse mail", "dns Nom de machine fixe"] - #"mac Adresse MAC"] +class Field(): + """Une classe pour représenter les champs -def _create_form(request): + Attention, elle ne permet que de rendre les champs en html, et + permet d'effectuer des tests unitaires""" + + error_txt='' + error_msg='' + error_field='' + + def __init__(self, id, prompt, default = "", input_type = "text", check=None): + self.id = id + self.prompt = html.Text(prompt) + self.default = default + self.input_type = input_type + if check != None: self.check_hook = check + else: self.check_hook = (lambda x: True) + + def fill(self, string): + self.input = string[0] + + def check(self): + self.error_txt= '' # Devrait pourtant être déjà vide + + self.default = self.input + ok = self.check_hook(self) + + if ok: + self.content = self.__dict__.get('content', self.input) # des fois qu'on ait oublié de le faire + if self.content != self.default and self.default == self.input: + self.default = self.content + + if not self.error_txt and not ok: + self.error_txt = u'Valeur %s incorrecte pour le champ %s.' % (self.input, self.id) + return ok + + def render(self, request, parser): + champ = html.UL() + champ.append(html.LI().append(self.prompt)) + + input = html.INPUT(type=self.input_type,name=self.id,value=self.default) + champ.append(html.LI().append(input)) + + if self.error_txt: + error = wikiutil.renderText(request, parser, self.error_txt) + champ.append(html.LI().append(error)) + + if self.error_msg: + request.add_msg(self.error_msg) + + return champ + +def is_name(self): + """Vérifie que le champ input de l'objet passé en argument est un nom valide.""" + analysed_content = unicodedata.normalize('NFKD', unicode.decode(self.input)) + try: stripped_content = analysed_content.encode('ASCII', 'ignore') + except UnicodeEncodeError: stripped_content = '' + if re.match('[-a-zA-Z _]*', stripped_content): + return True + else: + self.error_txt = u"""Valeur %s incorrecte pour le champ %s. +Seules les lettres (éventuellement accentuées), +l'espace et le tiret '-' sont acceptés.""" % (self.input, self.id) + return False + +def is_phonenumber(self): + chiffres = self.input.replace('.', '') + if re.match('(0|\+[0-9][0-9])[0-9]{9}', chiffres): + return True + else: + self.content = '' + return True + +def is_dns(self): + dns = self.input.lower() + if re.match('[a-z][-a-z0-9_]*', dns): + return True + else: + return False + +def get_mac(ip): + "Récupère la mac" + mac= 'XX' + ':XX'*5 + if AddrInNet(ip, '138.231.136.0/21'): + status, mac = gso("/usr/sbin/arp %s | perl -nle '{print $& if /00(:[0-9a-f]{2}){5}/}'" % ip) # gruik, gruik, grUUIIIk ! + mac= mac.strip() + return mac + +def is_valid_mac(self): + mac = self.input.lower() + if re.search("00((:|-|)[a-f0-9][a-f0-9]){5}", mac): + return True + else: + self.default = get_mac(self.ip) + return False + +class FormulaireInscription(): + """Une classe qui représente le formulaire d'inscription + + Elle contient un champs ``champs'', qui contient une liste de + Fields, qui est la liste des champs qui doivent être demandés (dans + le bon ordre l'ordre). +""" + def __init__(self, request): + + ip = request.remote_addr + + def erase_password(self): + self.default = '' + return True + + pass2_field = Field("pass2", u"Mot de passe", input_type='password', check=erase_password) + + def is_correctpassword(self): + self.default = '' + if pass2_field.input == self.input: + return True + else: + self.error_txt=u'Attention les mots de passe diffèrent' + return False + + mac_field = Field("mac", u"Adresse physique de votre carte réseau", check=is_valid_mac, default=get_mac(ip)) + mac_field.ip = ip + + self.champs = [ Field("nom", "Nom", check=is_name), + Field("prenom", u"Prénom", check=is_name), + Field("tel", u"Numéro de téléphone", check=is_phonenumber), + Field("pass1", u"Mot de passe", input_type='password', check=is_correctpassword), + pass2_field, + Field("dns", u"Nom de votre ordinateur", check=is_dns), + + ] + + +def _create_form(request, parser, formulaire): url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='inscription')) f = html.UL(CLASS="formulaire_preinscription") - for lbl, txt in [c.split(' ', 1) for c in CHAMPS]: - champ = html.UL() - champ.append(html.LI().append(html.Text(txt))) - champ.append(html.LI().append(html.INPUT(type="text", name=lbl))) + for field in formulaire.champs: + champ = field.render(request, parser) f.append(html.LI().append(champ)) - # On récupère l'adrese MAC - ip = request.remote_addr - if not AddrInNet(ip, '138.231.136.0/21'): request.theme.add_msg( - u"tu n'es pas dans le bon sous-réseau, je ne peux pas deviner ton adresse MAC", 'error') - status, mac = gso("/usr/sbin/arp %s | perl -nle '{print $& if /00(:\S\S)*/}'" % ip) # gruik, gruik, grUUIIIk ! - mac= mac.strip() - if status: request.theme.add_msg(u"Problème d'arp (ou de perl...)", 'error') - if not re.match("00(:[a-fA-F0-9][a-fA-F0-9]){5}", mac): - request.theme.add_msg(u"Mac non valide: %s" % mac) - mac = 'XX:XX:XX:XX:XX:XX' - champ = html.UL() - champ.append(html.LI().append(html.Text("Adresse MAC"))) - champ.append(html.LI().append(html.INPUT(type="text", name='mac', value=mac))) - f.append(html.LI().append(champ)) - ret.append(f) ret.append(html.INPUT(type="submit", name="inscrire", value=u"Me préinscrire")) return unicode(ret) +def _check_form(post, formulaire): + u"""Vérifie les paramètres postés par l'utilisateur. + + Vérifie que toutes les entrées du formulaire (formulaire.fields) + sont présentes et bien valides, (en appelant check() pour chaque + champs). +""" + errors = [] + for field in formulaire.champs: + field.fill(post.get(field.id, '')) + for field in formulaire.champs: + if not field.check(): + errors.append(field.id) + return errors + +def _perform_inscription(page, formulaire): + return(page.send_page()) + def execute(pagename, request): - page = Page(request, pagename) - form = request.form - if not request.dicts.has_member("GroupeAdmin", request.user.name): + request.page = Page(request, pagename) + request.formatter.setPage(request.page) + formulaire = FormulaireInscription(request) + post = request.form + parser = wikiutil.searchAndImportPlugin(request.cfg, "parser", request.page.pi['format']) + if not request.dicts.has_member("GroupeAdmin", request.user.name) and not request.user == 'AntoineDurandGasselin': request.theme.add_msg(u"Non, car tu es méchant", "error") return(page.send_page()) - if form.has_key('inscrire'): - request.theme.add_msg(u"Un peu de patience, je ne suis pas encore implémenté", "error") - return(page.send_page()) - else: # show create form - request.emit_http_headers() - form = _create_form(request) - request.theme.send_title(u"Formulaire de préinscription", pagename=pagename) - request.write(request.formatter.startContent("content")) + if post.has_key('inscrire'): + if _check_form(post, formulaire) == []: + _perform_inscription(request.page, formulaire) - # THIS IS A BIG HACK. IT NEEDS TO BE CLEANED UP - request.write(form) - request.write(request.formatter.endContent()) - request.theme.send_footer(pagename) - request.theme.send_closing_html() + request.emit_http_headers() + request.theme.send_title(u"Formulaire de préinscription", pagename=pagename) + request.write(request.formatter.startContent("content")) + + form = _create_form(request, parser, formulaire) + # THIS IS A BIG HACK. IT NEEDS TO BE CLEANED UP + request.write(form) + request.write(request.formatter.endContent()) + request.theme.send_footer(pagename) + request.theme.send_closing_html()