Quelques simplifications pour crans_ldap.search.

Correction de ce que je considrais comme un bug : la requte
'paiement=ok&host=tata' renvoyait tous les adhrents ok car la liste des
machines correspondant est vide. C'tait probablement d  une confusion du
type liste == None et not liste.

Cela change le comportement de la mthode search, mais j'estime que le
prcdent comportement est incorrect et que les autres scripts ne devraient
pas compter dessus.

darcs-hash:20060310011421-68412-77cccb3532321ea3ebf5b73e113e5675b87d16ba.gz
This commit is contained in:
glondu 2006-03-10 02:14:21 +01:00
parent 97c42d7459
commit c59d1dc290

View file

@ -541,14 +541,16 @@ class crans_ldap:
if champ in ['host', 'hostAlias']:
if expr[-1] == '*':
el = '(%s=%s)' % (champ, expr)
elif expr.find('.') == -1:
elif '.' not in expr:
el = '(%s=%s.*)' % (champ, expr)
else:
el = '(%s=%s*)' % (champ, expr)
elif champ == 'macAddress':
# Formatage adresse mac
try: el = '(macAddress=%s)' % format_mac(expr)
except: pass
try:
el = '(macAddress=%s)' % format_mac(expr)
except:
pass
elif champ == 'paiement' and expr == 'ok':
# Paiement donnant droit à une connexion maintenant ?
# (il doit avoir payé pour l'année en cours ou pour
@ -560,14 +562,14 @@ class crans_ldap:
# définifif (cf config.py).
if localtime()[1] == 9:
# Pour septembre paiement année précédente ok
el = "(|(paiement=%s)(paiement=%s))" % (int(ann_scol), int(ann_scol)-1)
el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1)
else:
el = "(paiement=%s)" % (int(ann_scol),)
el = "(paiement=%s)" % ann_scol
# Doit-on bloquer en cas de manque de la carte d'etudiant ?
if config.bl_carte_et_definitif:
el = "(&(|(carteEtudiant=%s)(objectClass=club))%s)" % (int(ann_scol), el)
el = "(&(|(carteEtudiant=%d)(objectClass=club))%s)" % (ann_scol, el)
elif champ[1:] == 'blacklist':
el = '(blacklist=%s)' % (expr)
el = '(blacklist=%s)' % expr
else:
# Cas général
el = '(%s=%s)' % (champ, expr)
@ -580,12 +582,9 @@ class crans_ldap:
# initialisation
filtre = {}
filtre_cond = {} # Stockage si filtre avec condition (ne comporte pas que des *)
filtre_tout = True # Passse à False si au moins une condition
for i in filtres:
filtre[i] = '(&'
filtre_cond[i] = False
filtre[i] = ''
conds = expression.split('&')
# Test de l'expression de recherche et classement par filtres
@ -598,9 +597,9 @@ class crans_ldap:
champ = champ[:-1]
neg = True
except:
raise ValueError(u'Syntaxe de recherche invalide.')
raise ValueError(u'Syntaxe de recherche invalide (%s)' % cond)
# transformation de certains champs
# Transformation de certains champs
champ = self.trans.get(champ, champ)
if expr == '': expr = '*'
@ -612,19 +611,15 @@ class crans_ldap:
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]:
filtre[i] += build_filtre(champ, expr, neg)
ok = True
if expr != '*' or neg:
filtre_cond[i] = True
filtre_tout = False
if not ok:
raise ValueError(u'Champ de recherche inconnu (%s)' % champ)
## Recherche avec chacun des filtres
r = {} # contiendra les réponses par filtre
for i in filtres:
if (filtre_tout and filtre[i] != '(&' ) or filtre_cond[i]:
if filtre[i] != '':
# Filtre valide
#filtre[i] += ')'
filtre[i] += '(objectClass=%s))' % i
filtre[i] = '(&(objectClass=%s)%s)' % (i, filtre[i])
r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i])
else:
r[i] = None
@ -633,41 +628,9 @@ class crans_ldap:
## r = {categorie1: [(result1), (result2), ...], ...}
# Traitement
if not r['machine'] and not r['adherent'] and not r['club']:
# Pas de réponses
return result
elif len(conds) == 1:
# Filtre sur un seul champ
# => on retourne tout
for i in filtres:
if not r[i]:
continue
for res in r[i]:
if i == "machine":
if res[1].has_key('puissance'):
result['machine'].append(BorneWifi(res, mode, self.conn))
else:
result['machine'].append(Machine(res, mode, self.conn))
else:
result[i].append(globals()[i](res, mode, self.conn))
elif not r['adherent'] and not r['club']:
# Il n'y avait seulement un filtre machine
# => on retourne uniquement les machines trouvées
for m in r['machine']:
if m[1].has_key('puissance'):
result['machine'].append(BorneWifi(m, mode, self.conn))
else:
result['machine'].append(Machine(m, mode, self.conn))
elif not r['machine']:
# Il n'y avait pas de filtre machine
# => on retourne uniquement les adhérents
if r['adherent']:
for a in r['adherent']:
result['adherent'].append(adherent(a, mode, self.conn))
if r['club']:
for a in r['club']:
result['club'].append(club(a, mode, self.conn))
else:
if r['machine'] != None \
and (r['adherent'] != None or r['club'] != None) \
and len(conds) > 1:
# Il faut croiser les résultats machine et propriétaire
# Traitement des machines
mach_adh = [] # liste de dn d'adhérents et de clubs
@ -700,6 +663,20 @@ class crans_ldap:
else:
result['machine'].append(Machine(a, mode, self.conn))
else:
# On retourne tout
for i in filtres:
if r[i] == None:
continue
for res in r[i]:
if i == "machine":
if res[1].has_key('puissance'):
result['machine'].append(BorneWifi(res, mode, self.conn))
else:
result['machine'].append(Machine(res, mode, self.conn))
else:
result[i].append(globals()[i](res, mode, self.conn))
else:
### Recherche d'une chaine sur tous les champs
conv = { 'club': club, 'adherent': adherent }