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 champ in ['host', 'hostAlias']:
if expr[-1] == '*': if expr[-1] == '*':
el = '(%s=%s)' % (champ, expr) el = '(%s=%s)' % (champ, expr)
elif expr.find('.') == -1: elif '.' not in expr:
el = '(%s=%s.*)' % (champ, expr) el = '(%s=%s.*)' % (champ, expr)
else: else:
el = '(%s=%s*)' % (champ, expr) el = '(%s=%s*)' % (champ, expr)
elif champ == 'macAddress': elif champ == 'macAddress':
# Formatage adresse mac # Formatage adresse mac
try: el = '(macAddress=%s)' % format_mac(expr) try:
except: pass el = '(macAddress=%s)' % format_mac(expr)
except:
pass
elif champ == 'paiement' and expr == 'ok': elif champ == 'paiement' and expr == 'ok':
# Paiement donnant droit à une connexion maintenant ? # Paiement donnant droit à une connexion maintenant ?
# (il doit avoir payé pour l'année en cours ou pour # (il doit avoir payé pour l'année en cours ou pour
@ -560,14 +562,14 @@ class crans_ldap:
# définifif (cf config.py). # définifif (cf config.py).
if localtime()[1] == 9: if localtime()[1] == 9:
# Pour septembre paiement année précédente ok # 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: else:
el = "(paiement=%s)" % (int(ann_scol),) el = "(paiement=%s)" % ann_scol
# Doit-on bloquer en cas de manque de la carte d'etudiant ? # Doit-on bloquer en cas de manque de la carte d'etudiant ?
if config.bl_carte_et_definitif: 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': elif champ[1:] == 'blacklist':
el = '(blacklist=%s)' % (expr) el = '(blacklist=%s)' % expr
else: else:
# Cas général # Cas général
el = '(%s=%s)' % (champ, expr) el = '(%s=%s)' % (champ, expr)
@ -577,15 +579,12 @@ class crans_ldap:
if '=' in expression: if '=' in expression:
#### Recherche avec conditions explicites #### Recherche avec conditions explicites
## Construction des filtres ## Construction des filtres
# initialisation # initialisation
filtre = {} 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: for i in filtres:
filtre[i] = '(&' filtre[i] = ''
filtre_cond[i] = False
conds = expression.split('&') conds = expression.split('&')
# Test de l'expression de recherche et classement par filtres # Test de l'expression de recherche et classement par filtres
@ -598,9 +597,9 @@ class crans_ldap:
champ = champ[:-1] champ = champ[:-1]
neg = True neg = True
except: 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) champ = self.trans.get(champ, champ)
if expr == '': expr = '*' if expr == '': expr = '*'
@ -612,62 +611,26 @@ class crans_ldap:
if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]: if champ in self.auto_search_champs[i] + self.non_auto_search_champs[i]:
filtre[i] += build_filtre(champ, expr, neg) filtre[i] += build_filtre(champ, expr, neg)
ok = True ok = True
if expr != '*' or neg:
filtre_cond[i] = True
filtre_tout = False
if not ok: if not ok:
raise ValueError(u'Champ de recherche inconnu (%s)'% champ ) raise ValueError(u'Champ de recherche inconnu (%s)' % champ)
## Recherche avec chacun des filtres ## Recherche avec chacun des filtres
r = {} # contiendra les réponses par filtre r = {} # contiendra les réponses par filtre
for i in filtres: for i in filtres:
if (filtre_tout and filtre[i] != '(&' ) or filtre_cond[i]: if filtre[i] != '':
# Filtre valide # Filtre valide
#filtre[i] += ')' filtre[i] = '(&(objectClass=%s)%s)' % (i, filtre[i])
filtre[i] += '(objectClass=%s))' % i
r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i]) r[i] = self.conn.search_s(self.base_dn, self.scope[i], filtre[i])
else: else:
r[i] = None r[i] = None
## On a alors une liste de résultats ## On a alors une liste de résultats
## r = { categorie1: [ (result1), (result2), ...] , ... } ## r = {categorie1: [(result1), (result2), ...], ...}
# Traitement # Traitement
if not r['machine'] and not r['adherent'] and not r['club']: if r['machine'] != None \
# Pas de réponses and (r['adherent'] != None or r['club'] != None) \
return result and len(conds) > 1:
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:
# Il faut croiser les résultats machine et propriétaire # Il faut croiser les résultats machine et propriétaire
# Traitement des machines # Traitement des machines
mach_adh = [] # liste de dn d'adhérents et de clubs mach_adh = [] # liste de dn d'adhérents et de clubs
@ -699,6 +662,20 @@ class crans_ldap:
result['machine'].append(BorneWifi(a, mode, self.conn)) result['machine'].append(BorneWifi(a, mode, self.conn))
else: else:
result['machine'].append(Machine(a, mode, self.conn)) 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: else:
### Recherche d'une chaine sur tous les champs ### Recherche d'une chaine sur tous les champs