[radius_auth.py] Appartements de l'ENS

Ignore-this: b874519e007921c54c55e2b354d2a2cc

darcs-hash:20090302140219-bd074-e3ea8cc4f3b6080e4b7bddb0af18d95cb374ce9e.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-03-02 15:02:19 +01:00
parent a8446f5f27
commit 091981f029

View file

@ -11,11 +11,11 @@ from config import ann_scol, dat, vlans
def chap_ok(password, challenge, clear_pass) :
""" Test l'authentification chap fournie
password et chalenge doivent être données
password et chalenge doivent être données
en hexa (avec ou sans le 0x devant)
retourne True si l'authentification est OK
retourne False sinon
retourne False sinon
"""
try :
challenge = binascii.a2b_hex(challenge.replace('0x',''))
@ -24,7 +24,7 @@ def chap_ok(password, challenge, clear_pass) :
return True
except :
pass
return False
def do_auth(mac):
@ -34,7 +34,7 @@ def do_auth(mac):
prise."""
global ann_scol
if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac):
return (-1, "Échec test CHAP", "")
@ -45,32 +45,36 @@ def do_auth(mac):
elif len(m) > 1:
return (-1, "Pb recherche mac (nb résultat %d!=1)" % len(m), "")
# N'appartient pas au Crans et n'a pas de prise attribuée
# donc sur uplink ou switch non filtré
# N'appartient pas au Crans et n'a pas de prise attribuée
# donc sur uplink ou switch non filtré
# But : éviter le spoof d'une mac d'une machine clef
proprio = m[0].proprietaire()
if proprio.__class__ == AssociationCrans and m[0].prise() == u'N/A':
return (-1, "Machine du crans", "")
# blockliste bloq
if 'bloq' in m[0].blacklist_actif():
return (-1, "Bloquage total des services pour cette machine", "")
# L'adherent ne paie pas, on le met sur le vlan radin
if not isinstance(proprio, Club) and not proprio.adherentPayant():
return (0, "Ne paie pas", "radin")
return (0, "Ne paie pas", "gratuit")
# Paiment ok ?
paid = max(proprio.paiement() + [0])
if dat[1] in (8, 9):
# En septembre les anciennes adhésions sont OK
ann_scol -= 1
elif dat[1] == 10 and dat[2] in (1,2,3):
ann_scol -= 1
elif dat[1] == 10 and dat[2] in (1,2,3):
# On laisse 3 jours ou les gens ont une page sur squid
ann_scol -= 1
ann_scol -= 1
if ann_scol > paid:
return (0, "N'a pas payé", "accueil")
# Cas des personnels logés dans les appartements de l'ENS
if proprio.etudes(0) == 'Personnel ENS':
return (0, "Personnel ENS", "appts")
# C'est bon
return (0, "Accès adhérent OK", "adherent")
@ -80,7 +84,7 @@ if __name__ == '__main__' :
# On vérifie si la mac est autorisée
(r, msg, vlan) = do_auth(mac)
# On logue la prise sur laquelle a lieu la tentative
openlog("radius_auth.py")
switch = os.getenv("NAS_IDENTIFIER", "").replace('"', '')