Branch 'pykolab-0.6' - 2 commits - pykolab/auth
Jeroen van Meeuwen
vanmeeuwen at kolabsys.com
Mon Feb 10 12:54:06 CET 2014
pykolab/auth/ldap/__init__.py | 15 ++++++++++++++-
pykolab/auth/ldap/auth_cache.py | 11 +++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
New commits:
commit 3f9fd0a68a7a66c0fbb14f0f72ecd1d03d4f2b4f
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date: Mon Feb 10 12:50:32 2014 +0100
If authentication fails specifically with a NO_SUCH_OBJECT error, re-attempt authentication after deleting the related entry from cache
diff --git a/pykolab/auth/ldap/__init__.py b/pykolab/auth/ldap/__init__.py
index 8572fec..1ba0f3d 100644
--- a/pykolab/auth/ldap/__init__.py
+++ b/pykolab/auth/ldap/__init__.py
@@ -243,8 +243,21 @@ class LDAP(pykolab.base.Base):
# Needs to be synchronous or succeeds and continues setting retval
# to True!!
self.ldap.simple_bind_s(entry_dn, login[1])
+ auth_cache.set_entry(_filter, entry_dn)
retval = True
- except:
+ except ldap.NO_SUCH_OBJECT, errmsg:
+ log.debug(_("Error occured, there is no such object: %r") % (errmsg), level=8)
+ self.bind = False
+ try:
+ auth_cache.del_entry(_filter)
+ except:
+ log.error(_("Authentication cache failed to clear entry"))
+ pass
+
+ return self.authenticate(login, realm)
+
+ except Exception, errmsg:
+ log.debug(_("Exception occured: %r") %(errmsg))
try:
log.debug(
_("Failed to authenticate as user %s") % (login[0]),
commit 982b7f3783203f0e3769d444e56f169fea54426d
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date: Mon Feb 10 12:50:07 2014 +0100
Allow entries to be deleted, to address stale cache entries
diff --git a/pykolab/auth/ldap/auth_cache.py b/pykolab/auth/ldap/auth_cache.py
index 35fbebb..488deac 100644
--- a/pykolab/auth/ldap/auth_cache.py
+++ b/pykolab/auth/ldap/auth_cache.py
@@ -86,6 +86,11 @@ mapper(Entry, entry_table)
## Functions
##
+def del_entry(key):
+ db = init_db()
+ _entries = db.query(Entry).filter_by(key=key).delete()
+ db.commit()
+
def get_entry(key):
db = init_db()
_entries = db.query(Entry).filter_by(key=key).all()
@@ -113,6 +118,12 @@ def set_entry(key, value):
)
db.commit()
+ elif len(_entries) == 1:
+ if not _entries[0].value == value:
+ _entries[0].value = value
+
+ _entries[0].last_change = datetime.datetime.now()
+ db.commit()
def purge_entries(db):
db.query(Entry).filter(Entry.last_change <= (datetime.datetime.now() - datetime.timedelta(1))).delete()
More information about the commits
mailing list