Source code for ldaptor.config

import os.path

import configparser
from zope.interface import implementer

from ldaptor import interfaces
from ldaptor.protocols.ldap import distinguishedname


[docs]class MissingBaseDNError(Exception): """Configuration must specify a base DN""" def __str__(self): return self.__doc__
[docs]@implementer(interfaces.ILDAPConfig) class LDAPConfig: baseDN = None identityBaseDN = None identitySearch = None def __init__( self, baseDN=None, serviceLocationOverrides=None, identityBaseDN=None, identitySearch=None, ): if baseDN is not None: baseDN = distinguishedname.DistinguishedName(baseDN) self.baseDN = baseDN self.serviceLocationOverrides = {} if serviceLocationOverrides is not None: for k, v in serviceLocationOverrides.items(): dn = distinguishedname.DistinguishedName(k) self.serviceLocationOverrides[dn] = v if identityBaseDN is not None: identityBaseDN = distinguishedname.DistinguishedName(identityBaseDN) self.identityBaseDN = identityBaseDN if identitySearch is not None: self.identitySearch = identitySearch
[docs] def getBaseDN(self): if self.baseDN is not None: return self.baseDN cfg = loadConfig() try: return cfg.get("ldap", "base") except (configparser.NoOptionError, configparser.NoSectionError): raise MissingBaseDNError()
[docs] def getServiceLocationOverrides(self): r = self._loadServiceLocationOverrides() r.update(self.serviceLocationOverrides) return r
def _loadServiceLocationOverrides(self): serviceLocationOverride = {} cfg = loadConfig() for section in cfg.sections(): if section.lower().startswith("service-location "): base = section[len("service-location ") :].strip() host = None if cfg.has_option(section, "host"): host = cfg.get(section, "host") if not host: host = None port = None if cfg.has_option(section, "port"): port = cfg.get(section, "port") if not port: port = None dn = distinguishedname.DistinguishedName(stringValue=base) serviceLocationOverride[dn] = (host, port) return serviceLocationOverride
[docs] def copy(self, **kw): if "baseDN" not in kw: kw["baseDN"] = self.baseDN if "serviceLocationOverrides" not in kw: kw["serviceLocationOverrides"] = self.serviceLocationOverrides if "identityBaseDN" not in kw: kw["identityBaseDN"] = self.identityBaseDN if "identitySearch" not in kw: kw["identitySearch"] = self.identitySearch r = self.__class__(**kw) return r
[docs] def getIdentityBaseDN(self): if self.identityBaseDN is not None: return self.identityBaseDN cfg = loadConfig() try: return cfg.get("authentication", "identity-base") except (configparser.NoOptionError, configparser.NoSectionError): return self.getBaseDN()
[docs] def getIdentitySearch(self, name): data = { "name": name, } if self.identitySearch is not None: f = self.identitySearch % data else: cfg = loadConfig() try: f = cfg.get("authentication", "identity-search", vars=data) except (configparser.NoOptionError, configparser.NoSectionError): f = "(|(cn=%(name)s)(uid=%(name)s))" % data return f
DEFAULTS = { "samba": {"use-lmhash": "no"}, } CONFIG_FILES = [ "/etc/ldaptor/global.cfg", os.path.expanduser("~/.ldaptor/global.cfg"), ] __config = None
[docs]def loadConfig(configFiles=None, reload=False): """ Load configuration file. """ global __config if __config is None or reload: x = configparser.SafeConfigParser() for section, options in DEFAULTS.items(): x.add_section(section) for option, value in options.items(): x.set(section, option, value) if configFiles is None: configFiles = CONFIG_FILES x.read(configFiles) __config = x return __config
[docs]def useLMhash(): """ Read configuration file if necessary and return whether to use LanMan hashes or not. """ cfg = loadConfig() return cfg.getboolean("samba", "use-lmhash")