diff --git a/attributs.py b/attributs.py index 3dd03eb..36a7665 100644 --- a/attributs.py +++ b/attributs.py @@ -69,6 +69,7 @@ class Attr(object): ldif: objet contenant l'attribut (permet de faire les validations sur l'environnement) ctxt_check: effectue les validations """ + self.ctxt_check=ctxt_check self.value = None self.conn = conn assert isinstance(val, unicode) @@ -133,12 +134,14 @@ class objectClass(Attr): singlevalue = False optional = False legend = "entité" + def parse_value(self, val, ldif): if val not in [ 'top', 'posixAccount', 'shadowAccount', 'proprio', 'adherent', 'club', 'machine', 'machineCrans', 'borneWifi', 'machineWifi', 'machineFixe', 'cransAccount', 'service', 'facture', 'freeMid' ]: + print(val) raise ValueError("Pourquoi insérer un objectClass=%s ?" % val) else: self.value = unicode(val) @@ -254,22 +257,23 @@ class chbre(Attr): can_modify = ["self", "Cableur", "Nounou"] def parse_value(self, val, ldif): - if u'club' in ldif['objectClass']: - if val in annuaires_pg.locaux_clubs(): + if self.ctxt_check: # Si ce n'est pas la peine de vérifier, on ne vérifie pas + if u'club' in ldif['objectClass']: + if val in annuaires_pg.locaux_clubs(): + self.value = val + return + else: + raise ValueError("Club devrait etre en XclN, pas en %s" % val) + + if val in (u"EXT", u"????"): self.value = val return - else: - raise ValueError("Club devrait etre en XclN, pas en %s" % val) - if val in (u"EXT", u"????"): - self.value = val - return - - try: - annuaires_pg.chbre_prises(val[0], val[1:]) - except NameError: - import annuaires_pg_test - annuaires_pg_test.chbre_prises(val[0], val[1:]) + try: + annuaires_pg.chbre_prises(val[0], val[1:]) + except NameError: + import annuaires_pg_test + annuaires_pg_test.chbre_prises(val[0], val[1:]) self.value = val @@ -295,8 +299,8 @@ class solde(Attr): can_modify = ["imprimeur", "Nounou", "Tresorier"] def parse_value(self, solde, ldif): - # on évite les dépassements - if not (float(solde) >= config.impression.decouvert and float(solde) <= 1024.): + # on évite les dépassements, sauf si on nous dit de ne pas vérifier + if self.ctxt_check and not (float(solde) >= config.impression.decouvert and float(solde) <= 1024.): raise ValueError("Solde invalide: %s" % solde) self.value = solde @@ -304,7 +308,7 @@ class dnsAttr(Attr): def parse_value(self, dns, ldif): dns = dns.lower() name, net = dns.split('.', 1) - if (net not in ['crans.org', 'wifi.crans.org'] or + if self.ctxt_check and (net not in ['crans.org', 'wifi.crans.org'] or not re.match('[a-z][-_a-z0-9]+', name)): raise ValueError("Nom d'hote invalide '%s'" % dns) self.value = dns @@ -544,8 +548,12 @@ class loginShell(Attr): '/usr/bin/rssh', '/usr/local/bin/disconnect_shell', '/usr/scripts/surveillance/disconnect_shell', + '/usr/local/bin/badPassSh', + '/usr/bin/passwd', + '/bin/false', + '/bin//zsh' ''] - if (shell not in shells): + if self.ctxt_check and (shell not in shells): raise ValueError("Shell %s invalide" % shell) self.value = shell