scripts/radius_auth.py
chove 0b83d903ae Surveillance des bug de Fred par A. Pour une fois t'as pas deconnecte tout
le reseau... mais juste les machines du crans qui passaient par des prises
limitees par radius (genre cableur)

darcs-hash:20051124121106-4ec08-31dcd6872718067d537054f79cf54954f34c3f0f.gz
2005-11-24 13:11:06 +01:00

62 lines
1.9 KiB
Python
Executable file

#! /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(readonly=True).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 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__ == crans and m[0].prise() == u'N/A' :
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)