Source code for ldaptor.config

import os.path
import ConfigParser
from zope.interface import implements
from ldaptor import interfaces
from ldaptor.insensitive import InsensitiveString
from ldaptor.protocols.ldap import distinguishedname

[docs]class MissingBaseDNError(Exception): """Configuration must specify a base DN""" def __str__(self): return self.__doc__
[docs]class LDAPConfig(object): implements(interfaces.ILDAPConfig) 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() x.optionxform = InsensitiveString 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')