Changeset View
Changeset View
Standalone View
Standalone View
pykolab/auth/ldap/cache.py
Show All 25 Lines | |||||
from sqlalchemy import MetaData | from sqlalchemy import MetaData | ||||
from sqlalchemy import String | from sqlalchemy import String | ||||
from sqlalchemy import Table | from sqlalchemy import Table | ||||
from sqlalchemy import desc | from sqlalchemy import desc | ||||
from sqlalchemy import create_engine | from sqlalchemy import create_engine | ||||
from sqlalchemy.orm import mapper | from sqlalchemy.orm import mapper | ||||
from uuid import UUID | |||||
try: | try: | ||||
from sqlalchemy.orm import relationship | from sqlalchemy.orm import relationship | ||||
except: | except: | ||||
from sqlalchemy.orm import relation as relationship | from sqlalchemy.orm import relation as relationship | ||||
try: | try: | ||||
from sqlalchemy.orm import sessionmaker | from sqlalchemy.orm import sessionmaker | ||||
except: | except: | ||||
Show All 16 Lines | |||||
## Classes | ## Classes | ||||
## | ## | ||||
class Entry(object): | class Entry(object): | ||||
def __init__(self, uniqueid, result_attr, last_change): | def __init__(self, uniqueid, result_attr, last_change): | ||||
self.uniqueid = uniqueid | self.uniqueid = uniqueid | ||||
self.result_attribute = result_attr | self.result_attribute = result_attr | ||||
modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format') | modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format').replace('%%', '%') | ||||
if modifytimestamp_format == None: | if modifytimestamp_format == None: | ||||
modifytimestamp_format = "%Y%m%d%H%M%SZ" | modifytimestamp_format = "%Y%m%d%H%M%SZ" | ||||
self.last_change = datetime.datetime.strptime( | self.last_change = datetime.datetime.strptime( | ||||
last_change, | last_change, | ||||
modifytimestamp_format | modifytimestamp_format | ||||
) | ) | ||||
Show All 30 Lines | if not _entry == None: | ||||
db.commit() | db.commit() | ||||
def get_entry(domain, entry, update=True): | def get_entry(domain, entry, update=True): | ||||
result_attribute = conf.get_raw('cyrus-sasl', 'result_attribute') | result_attribute = conf.get_raw('cyrus-sasl', 'result_attribute') | ||||
_entry = None | _entry = None | ||||
db = init_db(domain) | db = init_db(domain) | ||||
try: | try: | ||||
_entry = db.query(Entry).filter_by(uniqueid=entry['id']).first() | _uniqueid = str(UUID(bytes_le=entry['id'])) | ||||
log.debug(_("Entry uniqueid was converted from binary form to string: %s") % _uniqueid, level=8) | |||||
except ValueError: | |||||
_uniqueid = entry['id'] | |||||
try: | |||||
_entry = db.query(Entry).filter_by(uniqueid=_uniqueid).first() | |||||
except sqlalchemy.exc.OperationalError, errmsg: | except sqlalchemy.exc.OperationalError, errmsg: | ||||
db = init_db(domain,reinit=True) | db = init_db(domain,reinit=True) | ||||
except sqlalchemy.exc.InvalidRequestError, errmsg: | except sqlalchemy.exc.InvalidRequestError, errmsg: | ||||
db = init_db(domain,reinit=True) | db = init_db(domain,reinit=True) | ||||
finally: | finally: | ||||
_entry = db.query(Entry).filter_by(uniqueid=entry['id']).first() | _entry = db.query(Entry).filter_by(uniqueid=_uniqueid).first() | ||||
if not update: | if not update: | ||||
return _entry | return _entry | ||||
if _entry == None: | if _entry == None: | ||||
log.debug(_("Inserting cache entry %r") % (entry['id']), level=8) | log.debug(_("Inserting cache entry %r") % (_uniqueid), level=8) | ||||
if not entry.has_key(result_attribute): | if not entry.has_key(result_attribute): | ||||
entry[result_attribute] = '' | entry[result_attribute] = '' | ||||
db.add( | db.add( | ||||
Entry( | Entry( | ||||
entry['id'], | _uniqueid, | ||||
entry[result_attribute], | entry[result_attribute], | ||||
entry['modifytimestamp'] | entry['modifytimestamp'] | ||||
) | ) | ||||
) | ) | ||||
db.commit() | db.commit() | ||||
_entry = db.query(Entry).filter_by(uniqueid=entry['id']).first() | _entry = db.query(Entry).filter_by(uniqueid=_uniqueid).first() | ||||
else: | else: | ||||
modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format') | modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format').replace('%%', '%') | ||||
if modifytimestamp_format == None: | if modifytimestamp_format == None: | ||||
modifytimestamp_format = "%Y%m%d%H%M%SZ" | modifytimestamp_format = "%Y%m%d%H%M%SZ" | ||||
if not _entry.last_change.strftime(modifytimestamp_format) == entry['modifytimestamp']: | if not _entry.last_change.strftime(modifytimestamp_format) == entry['modifytimestamp']: | ||||
log.debug(_("Updating timestamp for cache entry %r") % (entry['id']), level=8) | log.debug(_("Updating timestamp for cache entry %r") % (_uniqueid), level=8) | ||||
last_change = datetime.datetime.strptime(entry['modifytimestamp'], modifytimestamp_format) | last_change = datetime.datetime.strptime(entry['modifytimestamp'], modifytimestamp_format) | ||||
_entry.last_change = last_change | _entry.last_change = last_change | ||||
db.commit() | db.commit() | ||||
_entry = db.query(Entry).filter_by(uniqueid=entry['id']).first() | _entry = db.query(Entry).filter_by(uniqueid=_uniqueid).first() | ||||
if entry.has_key(result_attribute): | if entry.has_key(result_attribute): | ||||
if not _entry.result_attribute == entry[result_attribute]: | if not _entry.result_attribute == entry[result_attribute]: | ||||
log.debug(_("Updating result_attribute for cache entry %r") % (entry['id']), level=8) | log.debug(_("Updating result_attribute for cache entry %r") % (_uniqueid), level=8) | ||||
_entry.result_attribute = entry[result_attribute] | _entry.result_attribute = entry[result_attribute] | ||||
db.commit() | db.commit() | ||||
_entry = db.query(Entry).filter_by(uniqueid=entry['id']).first() | _entry = db.query(Entry).filter_by(uniqueid=_uniqueid).first() | ||||
return _entry | return _entry | ||||
def init_db(domain,reinit=False): | def init_db(domain,reinit=False): | ||||
""" | """ | ||||
Returns a SQLAlchemy Session() instance. | Returns a SQLAlchemy Session() instance. | ||||
""" | """ | ||||
global db | global db | ||||
Show All 17 Lines | except: | ||||
metadata.create_all(engine) | metadata.create_all(engine) | ||||
Session = sessionmaker(bind=engine) | Session = sessionmaker(bind=engine) | ||||
db[domain] = Session() | db[domain] = Session() | ||||
return db[domain] | return db[domain] | ||||
def last_modify_timestamp(domain): | def last_modify_timestamp(domain): | ||||
modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format') | modifytimestamp_format = conf.get_raw('ldap', 'modifytimestamp_format').replace('%%', '%') | ||||
if modifytimestamp_format == None: | if modifytimestamp_format == None: | ||||
modifytimestamp_format = "%Y%m%d%H%M%SZ" | modifytimestamp_format = "%Y%m%d%H%M%SZ" | ||||
try: | try: | ||||
db = init_db(domain) | db = init_db(domain) | ||||
last_change = db.query(Entry).order_by(desc(Entry.last_change)).first() | last_change = db.query(Entry).order_by(desc(Entry.last_change)).first() | ||||
if not last_change == None: | if not last_change == None: | ||||
return last_change.last_change.strftime(modifytimestamp_format) | return last_change.last_change.strftime(modifytimestamp_format) | ||||
else: | else: | ||||
return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format) | return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format) | ||||
except: | except: | ||||
return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format) | return datetime.datetime(1900, 01, 01, 00, 00, 00).strftime(modifytimestamp_format) |