[*] Corrections pour les blacklistes, ajout de la méthode blacklist actif, pgsql_test

This commit is contained in:
Antoine Durand-gasselin 2011-02-26 23:21:47 +01:00
parent 1363c37f69
commit 014292eaaf
2 changed files with 33 additions and 13 deletions

View file

@ -84,6 +84,7 @@ class Attr(object):
return unicode(self).encode('utf-8')
def __unicode__(self):
# XXX - Vérifier que cette méthode produit un objet parsable
assert isinstance(self.value, unicode)
return self.value
@ -256,7 +257,11 @@ class chbre(Attr):
if val in (u"EXT", u"????"):
self.value = val
return
annuaires_pg.chbre_prises(val[0], val[1:])
try:
annuaires_pg.chbre_prises(val[0], val[1:])
except NameError:
import annuaires_pg_test
annuaires_pg_test.chbre_prises(val[0], val[1:])
self.value = val
class droits(Attr):
@ -267,7 +272,7 @@ class droits(Attr):
def parse_value(self, val, ldif):
if val.lower() not in ['apprenti', 'nounou', 'cableur', 'tresorier', 'bureau',
'webmaster', 'webradio', 'imprimeur', 'multimachines', 'victime']:
'webmaster', 'webradio', 'imprimeur', 'multimachines', 'victime', 'moderateur']:
raise ValueError("Ces droits n'existent pas ('%s')" % val)
if val.lower() == 'webmaster':
self.value = u'WebMaster'
@ -314,7 +319,7 @@ class macAddress(Attr):
self.value = format_mac(mac)
def __unicode__(self):
return unicode(self.value)
return unicode(self.value).lower()
class ipHostNumber(Attr):
@ -435,8 +440,8 @@ class blacklist(Attr):
return self.value['actif']
def terminer(self):
self.value['fin'] = max(self.value['debut'], time.time() - 60)
self.actif = False
self.value['fin'] = int(max(self.value['debut'], time.time() - 60))
self.value['actif'] = False
def __unicode__(self):
return u'%(debut)s$%(fin)s$%(type)s$%(comm)s' % self.value

View file

@ -275,8 +275,8 @@ class CransLdapObject(object):
self.dn, self.attrs = res[0]
self.attrs = ldif_to_uldif(self.attrs)
self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False)
if mode in ['w', 'rw']:
self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False)
### Vérification que `λv. str(Attr(v))` est bien une projection
oldif = res[0][1]
nldif = cldif_to_ldif(self.attrs)
@ -289,7 +289,7 @@ class CransLdapObject(object):
nvals = [nldif[attr][v.index(v)] for v in vals ]
raise EnvironmentError("λv. str(Attr(v)) n'est peut-être pas une projection:", attr, nvals, vals)
self._modifs = ldif_to_cldif(self.attrs, conn, check_ctxt = False)
self._modifs = ldif_to_cldif(ldif_to_uldif(res[0][1]), conn, check_ctxt = False)
def save(self):
"Vérifie que self._modifs contient des valeurs correctes et enregistre les modifications"
@ -302,8 +302,16 @@ class CransLdapObject(object):
# Vérification des modifications
self.attrs = ldif_to_uldif(self.conn.search_s(self.dn, 0)[0][1])
if self.attrs != self._modifs:
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\nexpected = %s, found = %s" % (self.dn, self._modifs, self.attrs))
self.attrs = ldif_to_cldif(self.attrs, self.conn, check_ctxt=False)
differences = []
# On fait les différences entre les deux dicos
for attr in set(self.attrs.keys()).union(set(self._modifs.keys())):
exp_vals = set([unicode(i) for i in self.attrs.get(attr,[])])
new_vals = set([unicode(i) for i in self._modifs.get(attr,[])])
if exp_vals != new_vals:
differences.append({"missing": exp_vals - new_vals, "having": new_vals - exp_vals})
if differences:
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))
def get_modlist(self):
"""Renvoie le dico des modifs"""
@ -371,7 +379,14 @@ class CransLdapObject(object):
out.append(u"%s : [%s] %s" % (date, author, u" ; ".join(mod_list)))
return out
def blacklist(self, sanction, commentaire, debut=time.time(), fin = '-'):
def blacklist_actif(self):
"""Renvoie la liste des blacklistes actives sur l'entité"""
# XXX - Proposer de filtrer les blacklistes avec un arg supplémentaire ?
# XXX - Vérifier les blacklistes des machines pour les adhérents ?
attrs = (self.attrs if self.mode not in ["w", "rw"] else self._modifs)
return filter((lambda bl: bl.is_actif()), attrs.get("blacklist"))
def blacklist(self, sanction, commentaire, debut="now", fin = '-'):
u"""
Blacklistage de la ou de toutes la machines du propriétaire
* debut et fin sont le nombre de secondes depuis epoch
@ -381,10 +396,10 @@ class CransLdapObject(object):
debut$fin$sanction$commentaire
"""
if debut == 'now':
debut = time.time()
debut = int(time.time())
if fin == 'now':
fin = time.time()
bl = blacklist(u'%s$%s$%s$%s' % (sanction, commentaire, debut, fin), {}, self.conn, False)
fin = int(time.time())
bl = blacklist(u'%s$%s$%s$%s' % (debut, fin, sanction, commentaire), {}, self.conn, False)
self._modifs.setdefault('blacklist', []).append(bl)