diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2011-05-13 07:04:13 +0000 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2011-05-13 07:04:13 +0000 |
commit | 3071301ee48117e25fd3baea683cc1e724ae6c76 (patch) | |
tree | 506ca35939abfd10fee95f1de80afa5a076e5a58 /pynslcd/common.py | |
parent | 4c19151250e318fa38dac33e5db1397b9d95a43e (diff) |
simplify request handling by passing read parameters around in a dict instead of setting object properties (this mainly simplifies search filter building)
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1455 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'pynslcd/common.py')
-rw-r--r-- | pynslcd/common.py | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/pynslcd/common.py b/pynslcd/common.py index acf0725..1f50584 100644 --- a/pynslcd/common.py +++ b/pynslcd/common.py @@ -69,18 +69,14 @@ class Request(object): self.fp = fp self.conn = conn self.calleruid = calleruid - # have default empty values for these - self.name = None - self.uid = None - self.gid = None - self.address = None + # load information from module that defines the class module = sys.modules[self.__module__] - self.attmap = module.attmap - self.filter = module.filter + self.attmap = getattr(module, 'attmap', None) + self.filter = getattr(module, 'filter', None) self.bases = getattr(module, 'bases', cfg.bases) self.scope = getattr(module, 'scope', cfg.scope) - def read_parameters(self): + def read_parameters(self, fp): """This method should read the parameters from ths stream and store them in self.""" pass @@ -89,26 +85,26 @@ class Request(object): """Return the attributes that should be used in the LDAP search.""" return self.attmap.attributes() - def mk_filter(self): + def mk_filter(self, parameters): """Return the active search filter (based on the read parameters).""" - if hasattr(self, 'filter_attrs'): + if parameters: return '(&%s(%s))' % ( self.filter, ')('.join('%s=%s' % (self.attmap[attribute], - ldap.filter.escape_filter_chars(str(getattr(self, name)))) - for attribute, name in self.filter_attrs.items()) ) + ldap.filter.escape_filter_chars(str(value))) + for attribute, value in parameters.items()) ) return self.filter - def handle_request(self): + def handle_request(self, parameters): """This method handles the request based on the parameters read with read_parameters().""" # get search results for base in self.bases: # do the LDAP search try: - res = self.conn.search_s(base, self.scope, self.mk_filter(), self.attributes()) + res = self.conn.search_s(base, self.scope, self.mk_filter(parameters), self.attributes()) for entry in res: if entry[0]: - self.write(entry[0], self.attmap.mapped(entry[1])) + self.write(entry[0], self.attmap.mapped(entry[1]), parameters) except ldap.NO_SUCH_OBJECT: # FIXME: log message pass @@ -116,11 +112,11 @@ class Request(object): self.fp.write_int32(constants.NSLCD_RESULT_END) def __call__(self): - self.read_parameters() + parameters = self.read_parameters(self.fp) or {} # TODO: log call with parameters self.fp.write_int32(constants.NSLCD_VERSION) self.fp.write_int32(self.action) - self.handle_request() + self.handle_request(parameters) def get_handlers(module): |