diff --git a/radius_auth.py b/radius_auth.py new file mode 100755 index 00000000..d1d4bdbd --- /dev/null +++ b/radius_auth.py @@ -0,0 +1,60 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- + +import os, md5, sys, binascii +from commands import getoutput + +sys.path.append('/usr/scripts/gestion') +from ldap_crans import crans_ldap, crans +from config import ann_scol, dat + +def chap_ok(password, challenge, clear_pass) : + """ Test l'authentification chap fournie + 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 + """ + try : + challenge = binascii.a2b_hex(challenge.replace('0x','')) + password = binascii.a2b_hex(password.replace('0x','')) + if md5.new(password[0] + clear_pass + challenge).digest() == password[1:] : + return True + except : + pass + + return False + +if __name__ == '__main__' : + # Test chap (comme cela on est sur que c'est bien un switch qui demande) + mac=os.getenv('USER_NAME','').replace('"','') + + if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac) : + sys.stdout.write("Echec test CHAP") + sys.exit(-1) + + # Mac dans la base LDAP + m=crans_ldap().search('mac=%s'%mac)['machine'] + if len(m)!=1 : + sys.stdout.write("Pb recherche mac (nb résultat !=1)") + sys.exit(-1) + + # N'appartient pas au Crans (évite les spoof) + proprio=m[0].proprietaire() + if proprio.__class__ == crans : + sys.stdout.write("Machine du crans") + sys.exit(-1) + + # Paiment ok ? + paid=max(proprio.paiement()+[0]) + if dat[1]==9 : + # En septembre les anciennes adhésion sont OK + ann_scol -= 1 + if ann_scol > paid : + sys.stdout.write("Echec test LDAP") + sys.exit(-1) + + # C'est bon + sys.stdout.write("Acces OK") + sys.exit(0)