diff -r 672acc730ce5 -r d628defebc17 server/sources/ldapuser.py --- a/server/sources/ldapuser.py Thu May 14 10:24:56 2009 +0200 +++ b/server/sources/ldapuser.py Thu May 14 11:38:40 2009 +0200 @@ -52,14 +52,14 @@ class LDAPUserSource(AbstractSource): """LDAP read-only CWUser source""" - support_entities = {'CWUser': False} + support_entities = {'CWUser': False} port = None - + cnx_mode = 0 cnx_dn = '' cnx_pwd = '' - + options = ( ('host', {'type' : 'string', @@ -119,9 +119,9 @@ 'help': 'life time of query cache in minutes (default to two hours).', 'group': 'ldap-source', 'inputlevel': 2, }), - + ) - + def __init__(self, repo, appschema, source_config, *args, **kwargs): AbstractSource.__init__(self, repo, appschema, source_config, *args, **kwargs) @@ -150,8 +150,8 @@ def init(self): """method called by the repository once ready to handle request""" - self.repo.looping_task(self._interval, self.synchronize) - self.repo.looping_task(self._query_cache.ttl.seconds/10, self._query_cache.clear_expired) + self.repo.looping_task(self._interval, self.synchronize) + self.repo.looping_task(self._query_cache.ttl.seconds/10, self._query_cache.clear_expired) def synchronize(self): """synchronize content known by this repository with content in the @@ -169,7 +169,7 @@ for eid, extid in cursor.fetchall(): # if no result found, _search automatically delete entity information res = self._search(session, extid, BASE) - if res: + if res: ldapemailaddr = res[0].get(ldap_emailattr) if ldapemailaddr: rset = session.execute('EmailAddress X,A WHERE ' @@ -192,13 +192,13 @@ finally: session.commit() session.close() - + def get_connection(self): """open and return a connection to the source""" if self._conn is None: self._connect() return ConnectionWrapper(self._conn) - + def authenticate(self, session, login, password): """return CWUser eid for the given login/password if this account is defined in this source, else raise `AuthenticationError` @@ -231,7 +231,7 @@ relname = iter(var.stinfo['relations']).next().r_type return self.user_rev_attrs.get(relname) return None - + def prepare_columns(self, mainvars, rqlst): """return two list describin how to build the final results from the result of an ldap search (ie a list of dictionnary) @@ -270,11 +270,11 @@ # # probably a bug in rql splitting if we arrive here # raise NotImplementedError return columns, global_transforms - + def syntax_tree_search(self, session, union, args=None, cachekey=None, varmap=None, debug=0): - """return result from this source for a rql query (actually from a rql - syntax tree and a solution dictionary mapping each used variable to a + """return result from this source for a rql query (actually from a rql + syntax tree and a solution dictionary mapping each used variable to a possible type). If cachekey is given, the query necessary to fetch the results (but not the results themselves) may be cached using this key. """ @@ -361,8 +361,8 @@ result = trfunc.apply(result) #print '--> ldap result', result return result - - + + def _connect(self, userdn=None, userpwd=None): port, protocol = MODES[self.cnx_mode] if protocol == 'ldapi': @@ -444,12 +444,12 @@ result.append(rec_dict) #print '--->', result return result - + def before_entity_insertion(self, session, lid, etype, eid): """called by the repository when an eid has been attributed for an entity stored here but the entity has not been inserted in the system table yet. - + This method must return the an Entity instance representation of this entity. """ @@ -458,7 +458,7 @@ for attr in entity.e_schema.indexable_attributes(): entity[attr] = res[self.user_rev_attrs[attr]] return entity - + def after_entity_insertion(self, session, dn, entity): """called by the repository after an entity stored here has been inserted in the system table. @@ -492,13 +492,13 @@ def _insert_email(session, emailaddr, ueid): session.execute('INSERT EmailAddress X: X address %(addr)s, U primary_email X ' 'WHERE U eid %(x)s', {'addr': emailaddr, 'x': ueid}, 'x') - + class GotDN(Exception): """exception used when a dn localizing the searched user has been found""" def __init__(self, dn): self.dn = dn - + class RQL2LDAPFilter(object): """generate an LDAP filter for a rql query""" def __init__(self, source, session, args=None, mainvars=()): @@ -510,7 +510,7 @@ args = {} self._args = args self.mainvars = mainvars - + def generate(self, selection, mainvarname): self._filters = res = self._base_filters[:] self._mainvarname = mainvarname @@ -527,7 +527,7 @@ if len(res) > 1: return self._eidfilters, '(&%s)' % ''.join(res) return self._eidfilters, res[0] - + def visit_and(self, et): """generate filter for a AND subtree""" for c in et.children: @@ -587,7 +587,7 @@ else: raise NotImplementedError(relation) return res - + def _visit_attribute_relation(self, relation): """generate filter for an attribute relation""" lhs, rhs = relation.get_parts() @@ -623,18 +623,18 @@ def visit_comparison(self, cmp): """generate filter for a comparaison""" - return '%s%s'% (cmp.operator, cmp.children[0].accept(self)) + return '%s%s'% (cmp.operator, cmp.children[0].accept(self)) def visit_mathexpression(self, mexpr): """generate filter for a mathematic expression""" raise NotImplementedError - + def visit_function(self, function): """generate filter name for a function""" if function.name == 'IN': return self.visit_in(function) raise NotImplementedError - + def visit_in(self, function): grandpapa = function.parent.parent ldapattr = self._ldap_attrs[grandpapa.r_type] @@ -649,7 +649,7 @@ else: part = '(%s=%s)' % (ldapattr, res[0]) return part - + def visit_constant(self, constant): """generate filter name for a constant""" value = constant.value @@ -667,7 +667,7 @@ else: value = str(value) return escape_filter_chars(value) - + def visit_variableref(self, variableref): """get the sql name for a variable reference""" pass