/
opt
/
imh-python
/
lib
/
python3.9
/
site-packages
/
/opt/imh-python/lib/python3.9/site-packages
mkdir
upload
Name
Size
Mode
Actions
amqp/
-
0755
rm
amqp-5.3.1.dist-info/
-
0755
rm
apache_libcloud-3.1.0.dist-info/
-
0755
rm
appdirs-1.4.4.dist-info/
-
0755
rm
apscheduler/
-
0755
rm
APScheduler-3.11.0.dist-info/
-
0755
rm
arrow/
-
0755
rm
arrow-1.2.3.dist-info/
-
0755
rm
astroid/
-
0755
rm
astroid-3.3.9.dist-info/
-
0755
rm
asttokens/
-
0755
rm
asttokens-3.0.0.dist-info/
-
0755
rm
attr/
-
0755
rm
attrs/
-
0755
rm
attrs-25.3.0.dist-info/
-
0755
rm
autocommand/
-
0755
rm
autocommand-2.2.2.dist-info/
-
0755
rm
automat/
-
0755
rm
automat-25.4.16.dist-info/
-
0755
rm
backports/
-
0755
rm
backports.tarfile-1.2.0.dist-info/
-
0755
rm
bakauth/
-
0755
rm
bakauth-1.6.2.dist-info/
-
0755
rm
bcrypt/
-
0755
rm
bcrypt-3.2.2.dist-info/
-
0755
rm
billiard/
-
0755
rm
billiard-4.2.1.dist-info/
-
0755
rm
blessings/
-
0755
rm
blessings-1.7.dist-info/
-
0755
rm
boto3/
-
0755
rm
boto3-1.16.63.dist-info/
-
0755
rm
botocore/
-
0755
rm
botocore-1.19.63.dist-info/
-
0755
rm
celery/
-
0755
rm
celery-5.4.0.dist-info/
-
0755
rm
certifi/
-
0755
rm
certifi-2025.4.26.dist-info/
-
0755
rm
cffi/
-
0755
rm
cffi-1.17.1.dist-info/
-
0755
rm
chardet/
-
0755
rm
chardet-3.0.4.dist-info/
-
0755
rm
cheroot/
-
0755
rm
cheroot-10.0.1.dist-info/
-
0755
rm
cherrypy/
-
0755
rm
CherryPy-18.6.1.dist-info/
-
0755
rm
cinderclient/
-
0755
rm
click/
-
0755
rm
click-8.1.8.dist-info/
-
0755
rm
click_didyoumean/
-
0755
rm
click_didyoumean-0.3.1.dist-info/
-
0755
rm
click_plugins/
-
0755
rm
click_plugins-1.1.1.dist-info/
-
0755
rm
click_repl/
-
0755
rm
click_repl-0.3.0.dist-info/
-
0755
rm
constantly/
-
0755
rm
constantly-23.10.4.dist-info/
-
0755
rm
construct/
-
0755
rm
construct-2.10.70.dist-info/
-
0755
rm
cpapis/
-
0755
rm
cpapis-1.0.dist-info/
-
0755
rm
cproc/
-
0755
rm
cproc-1.0.dist-info/
-
0755
rm
croniter/
-
0755
rm
croniter-2.0.1.dist-info/
-
0755
rm
crossplane/
-
0755
rm
crossplane-0.5.8.dist-info/
-
0755
rm
Crypto/
-
0755
rm
Cryptodome/
-
0755
rm
cryptography/
-
0755
rm
cryptography-36.0.2.dist-info/
-
0755
rm
cwp/
-
0755
rm
cwp-0.1.2.dist-info/
-
0755
rm
dateutil/
-
0755
rm
debtcollector/
-
0755
rm
debtcollector-3.0.0.dist-info/
-
0755
rm
decorator-5.2.1.dist-info/
-
0755
rm
dill/
-
0755
rm
dill-0.4.0.dist-info/
-
0755
rm
distro/
-
0755
rm
distro-1.9.0.dist-info/
-
0755
rm
dns/
-
0755
rm
dnspython-2.7.0.dist-info/
-
0755
rm
dogpile/
-
0755
rm
dogpile_cache-1.4.0.dist-info/
-
0755
rm
exceptiongroup/
-
0755
rm
exceptiongroup-1.2.2.dist-info/
-
0755
rm
executing/
-
0755
rm
executing-2.2.0.dist-info/
-
0755
rm
fabric/
-
0755
rm
fab_classic-1.19.1.dist-info/
-
0755
rm
flask/
-
0755
rm
Flask-1.1.2.dist-info/
-
0755
rm
flask_apscheduler/
-
0755
rm
Flask_APScheduler-1.11.0.dist-info/
-
0755
rm
flask_redis/
-
0755
rm
flask_redis-0.4.0.dist-info/
-
0755
rm
flask_sqlalchemy/
-
0755
rm
Flask_SQLAlchemy-2.4.4.dist-info/
-
0755
rm
future/
-
0755
rm
future-1.0.0.dist-info/
-
0755
rm
gunicorn/
-
0755
rm
gunicorn-20.0.4.dist-info/
-
0755
rm
hyperlink/
-
0755
rm
hyperlink-21.0.0.dist-info/
-
0755
rm
idna/
-
0755
rm
idna-2.10.dist-info/
-
0755
rm
importlib_metadata/
-
0755
rm
importlib_metadata-4.13.0.dist-info/
-
0755
rm
incremental/
-
0755
rm
incremental-22.10.0.dist-info/
-
0755
rm
influxdb/
-
0755
rm
influxdb-5.3.2.dist-info/
-
0755
rm
IPython/
-
0755
rm
ipython-8.18.1.dist-info/
-
0755
rm
iso8601/
-
0755
rm
iso8601-2.1.0.dist-info/
-
0755
rm
isort/
-
0755
rm
isort-6.0.1.dist-info/
-
0755
rm
itsdangerous/
-
0755
rm
itsdangerous-1.1.0.dist-info/
-
0755
rm
jaraco/
-
0755
rm
jaraco.collections-5.1.0.dist-info/
-
0755
rm
jaraco.context-6.0.1.dist-info/
-
0755
rm
jaraco.functools-4.1.0.dist-info/
-
0755
rm
jaraco.text-4.0.0.dist-info/
-
0755
rm
jedi/
-
0755
rm
jedi-0.19.2.dist-info/
-
0755
rm
jinja2/
-
0755
rm
Jinja2-2.11.3.dist-info/
-
0755
rm
jmespath/
-
0755
rm
jmespath-0.10.0.dist-info/
-
0755
rm
jsonpatch-1.33.dist-info/
-
0755
rm
jsonpointer-3.0.0.dist-info/
-
0755
rm
keystoneauth1/
-
0755
rm
keystoneauth1-5.10.0.dist-info/
-
0755
rm
kombu/
-
0755
rm
kombu-5.5.3.dist-info/
-
0755
rm
ldap/
-
0755
rm
libcloud/
-
0755
rm
libfuturize/
-
0755
rm
libpasteurize/
-
0755
rm
markupsafe/
-
0755
rm
MarkupSafe-1.1.1.dist-info/
-
0755
rm
matplotlib_inline/
-
0755
rm
matplotlib_inline-0.1.7.dist-info/
-
0755
rm
mccabe-0.7.0.dist-info/
-
0755
rm
mdstat/
-
0755
rm
mdstat-1.0.4.dist-info/
-
0755
rm
meld3/
-
0755
rm
meld3-2.0.1.dist-info/
-
0755
rm
more_itertools/
-
0755
rm
more_itertools-10.7.0.dist-info/
-
0755
rm
msgpack/
-
0755
rm
msgpack-0.6.1.dist-info/
-
0755
rm
mtrlib/
-
0755
rm
mtrlib-1.2.0.dist-info/
-
0755
rm
munch/
-
0755
rm
munch-4.0.0.dist-info/
-
0755
rm
nacl/
-
0755
rm
netaddr/
-
0755
rm
netaddr-0.8.0.dist-info/
-
0755
rm
netifaces-0.10.9.dist-info/
-
0755
rm
netmiko/
-
0755
rm
netmiko-3.4.0.dist-info/
-
0755
rm
ntc_templates/
-
0755
rm
ntc_templates-7.8.0.dist-info/
-
0755
rm
numpy/
-
0755
rm
numpy-1.26.0.dist-info/
-
0755
rm
numpy.libs/
-
0755
rm
OpenSSL/
-
0755
rm
openstack/
-
0755
rm
openstacksdk-0.49.0.dist-info/
-
0755
rm
oslo.i18n-6.5.1.dist-info/
-
0755
rm
oslo.utils-7.1.0.dist-info/
-
0755
rm
oslo_i18n/
-
0755
rm
oslo_utils/
-
0755
rm
os_client_config/
-
0755
rm
os_client_config-2.1.0.dist-info/
-
0755
rm
os_service_types/
-
0755
rm
os_service_types-1.7.0.dist-info/
-
0755
rm
packaging/
-
0755
rm
packaging-25.0.dist-info/
-
0755
rm
paramiko/
-
0755
rm
paramiko-3.5.1.dist-info/
-
0755
rm
parso/
-
0755
rm
parso-0.8.4.dist-info/
-
0755
rm
past/
-
0755
rm
pbr/
-
0755
rm
pbr-6.1.1.dist-info/
-
0755
rm
pem/
-
0755
rm
pem-20.1.0.dist-info/
-
0755
rm
pexpect/
-
0755
rm
pexpect-4.9.0.dist-info/
-
0755
rm
picotui/
-
0755
rm
picotui-1.2.dist-info/
-
0755
rm
pip/
-
0755
rm
pip-25.1.1.dist-info/
-
0755
rm
pkg_resources/
-
0755
rm
platformdirs/
-
0755
rm
platformdirs-4.3.7.dist-info/
-
0755
rm
portend-3.2.0.dist-info/
-
0755
rm
pp_api/
-
0755
rm
pp_api-1.3.1.dist-info/
-
0755
rm
pr2modules/
-
0755
rm
prettytable-0.7.2.dist-info/
-
0755
rm
prometheus_client/
-
0755
rm
prometheus_client-0.14.1.dist-info/
-
0755
rm
prompt_toolkit/
-
0755
rm
prompt_toolkit-3.0.51.dist-info/
-
0755
rm
psutil/
-
0755
rm
psutil-5.7.3.dist-info/
-
0755
rm
psycopg2/
-
0755
rm
psycopg2-2.8.6.dist-info/
-
0755
rm
ptyprocess/
-
0755
rm
ptyprocess-0.7.0.dist-info/
-
0755
rm
pure_eval/
-
0755
rm
pure_eval-0.2.3.dist-info/
-
0755
rm
pyasn1/
-
0755
rm
pyasn1-0.6.1.dist-info/
-
0755
rm
pyasn1_modules/
-
0755
rm
pyasn1_modules-0.4.2.dist-info/
-
0755
rm
pycparser/
-
0755
rm
pycparser-2.22.dist-info/
-
0755
rm
pycryptodome-3.9.9.dist-info/
-
0755
rm
pycryptodomex-3.9.9.dist-info/
-
0755
rm
pyeapi/
-
0755
rm
pyeapi-0.8.4.dist-info/
-
0755
rm
pygit2/
-
0755
rm
pygit2-1.6.1.dist-info/
-
0755
rm
pygit2.libs/
-
0755
rm
pygments/
-
0755
rm
pygments-2.19.1.dist-info/
-
0755
rm
pygraph/
-
0755
rm
PyGraph-0.3.0.dist-info/
-
0755
rm
pyipmi/
-
0755
rm
pylint/
-
0755
rm
pylint-3.3.7.dist-info/
-
0755
rm
pymysql/
-
0755
rm
PyMySQL-1.0.3.dist-info/
-
0755
rm
PyNaCl-1.5.0.dist-info/
-
0755
rm
pynetbox/
-
0755
rm
pynetbox-6.5.0.dist-info/
-
0755
rm
pyOpenSSL-19.1.0.dist-info/
-
0755
rm
pyparsing/
-
0755
rm
pyparsing-3.2.3.dist-info/
-
0755
rm
pyroute2/
-
0755
rm
pyroute2-0.7.12.dist-info/
-
0755
rm
pyserial-3.5.dist-info/
-
0755
rm
pysparklines-1.4.dist-info/
-
0755
rm
python_cinderclient-7.1.0.dist-info/
-
0755
rm
python_crontab-2.7.1.dist-info/
-
0755
rm
python_dateutil-2.9.0.post0.dist-info/
-
0755
rm
python_ipmi-0.5.7.dist-info/
-
0755
rm
python_ldap-3.3.1.dist-info/
-
0755
rm
python_whois-0.7.3.dist-info/
-
0755
rm
pytz/
-
0755
rm
pytz-2025.2.dist-info/
-
0755
rm
pyudev/
-
0755
rm
pyudev-0.23.2.dist-info/
-
0755
rm
PyYAML-5.4.1.dist-info/
-
0755
rm
pyzmq-19.0.2.dist-info/
-
0755
rm
pyzmq.libs/
-
0755
rm
rads/
-
0755
rm
rads-4.1.0.dist-info/
-
0755
rm
redis/
-
0755
rm
redis-3.5.3.dist-info/
-
0755
rm
requests/
-
0755
rm
requests-2.24.0.dist-info/
-
0755
rm
requestsexceptions/
-
0755
rm
requestsexceptions-1.4.0.dist-info/
-
0755
rm
restic/
-
0755
rm
restic-1.3.5.dist-info/
-
0755
rm
s3transfer/
-
0755
rm
s3transfer-0.3.7.dist-info/
-
0755
rm
scp-0.15.0.dist-info/
-
0755
rm
serial/
-
0755
rm
service_identity/
-
0755
rm
service_identity-23.1.0.dist-info/
-
0755
rm
setproctitle-1.1.10.dist-info/
-
0755
rm
setuptools/
-
0755
rm
setuptools-57.0.0.dist-info/
-
0755
rm
simplejson/
-
0755
rm
simplejson-3.20.1.dist-info/
-
0755
rm
six-1.17.0.dist-info/
-
0755
rm
slapdtest/
-
0755
rm
sparkline/
-
0755
rm
sqlalchemy/
-
0755
rm
SQLAlchemy-1.3.24.dist-info/
-
0755
rm
stack_data/
-
0755
rm
stack_data-0.6.3.dist-info/
-
0755
rm
stevedore/
-
0755
rm
stevedore-5.4.1.dist-info/
-
0755
rm
tabulate-0.8.10.dist-info/
-
0755
rm
tailer/
-
0755
rm
tailer-0.4.1.dist-info/
-
0755
rm
tempora/
-
0755
rm
tempora-5.8.0.dist-info/
-
0755
rm
tenacity/
-
0755
rm
tenacity-9.1.2.dist-info/
-
0755
rm
test/
-
0755
rm
testdata/
-
0755
rm
tests/
-
0755
rm
textfsm/
-
0755
rm
textfsm-1.1.3.dist-info/
-
0755
rm
toml/
-
0755
rm
toml-0.10.2.dist-info/
-
0755
rm
tomli/
-
0755
rm
tomli-2.2.1.dist-info/
-
0755
rm
tomlkit/
-
0755
rm
tomlkit-0.13.2.dist-info/
-
0755
rm
tornado/
-
0755
rm
tornado-6.0.4.dist-info/
-
0755
rm
traitlets/
-
0755
rm
traitlets-5.14.3.dist-info/
-
0755
rm
twisted/
-
0755
rm
Twisted-22.4.0.dist-info/
-
0755
rm
typing_extensions-4.13.2.dist-info/
-
0755
rm
tzdata/
-
0755
rm
tzdata-2025.2.dist-info/
-
0755
rm
tzlocal/
-
0755
rm
tzlocal-5.3.1.dist-info/
-
0755
rm
untangle-1.1.1.dist-info/
-
0755
rm
urllib3/
-
0755
rm
urllib3-1.25.11.dist-info/
-
0755
rm
uWSGI-2.0.19.1.dist-info/
-
0755
rm
version_utils/
-
0755
rm
version_utils-0.3.2.dist-info/
-
0755
rm
vine/
-
0755
rm
vine-5.1.0.dist-info/
-
0755
rm
wcwidth/
-
0755
rm
wcwidth-0.2.13.dist-info/
-
0755
rm
werkzeug/
-
0755
rm
Werkzeug-2.0.3.dist-info/
-
0755
rm
wheel/
-
0755
rm
wheel-0.45.1.dist-info/
-
0755
rm
whois/
-
0755
rm
wrapt/
-
0755
rm
wrapt-1.17.2.dist-info/
-
0755
rm
yaml/
-
0755
rm
zc/
-
0755
rm
zc.lockfile-3.0.post1.dist-info/
-
0755
rm
zipp/
-
0755
rm
zipp-3.21.0.dist-info/
-
0755
rm
zmq/
-
0755
rm
zope/
-
0755
rm
zope.interface-7.2.dist-info/
-
0755
rm
_distutils_hack/
-
0755
rm
_yaml/
-
0755
rm
__pycache__/
-
0755
rm
appdirs.py
24720
0644
edit
dl
rm
cronlog.py
3773
0644
edit
dl
rm
crontab.py
46862
0644
edit
dl
rm
crontabs.py
4438
0644
edit
dl
rm
decorator.py
17067
0644
edit
dl
rm
distutils-precedence.pth
152
0644
edit
dl
rm
jsonpatch.py
29778
0644
edit
dl
rm
jsonpointer.py
10601
0644
edit
dl
rm
ldapurl.py
12525
0644
edit
dl
rm
ldif.py
20278
0644
edit
dl
rm
LICENSE
601
0644
edit
dl
rm
mccabe.py
10654
0644
edit
dl
rm
netifaces.cpython-39-x86_64-linux-gnu.so
24584
0755
edit
dl
rm
portend.py
6488
0644
edit
dl
rm
prettytable.py
54204
0644
edit
dl
rm
README.md
3180
0644
edit
dl
rm
README.txt
119
0644
edit
dl
rm
scp.py
22393
0644
edit
dl
rm
setproctitle.cpython-39-x86_64-linux-gnu.so
23952
0755
edit
dl
rm
six.py
34703
0644
edit
dl
rm
tabulate.py
73889
0644
edit
dl
rm
typing_extensions.py
172654
0644
edit
dl
rm
untangle.py
5535
0644
edit
dl
rm
uwsgidecorators.py
10392
0644
edit
dl
rm
zc.lockfile-3.0.post1-py3.9-nspkg.pth
519
0644
edit
dl
rm
zope.interface-7.2-py3.9-nspkg.pth
457
0644
edit
dl
rm
_cffi_backend.cpython-39-x86_64-linux-gnu.so
274096
0755
edit
dl
rm
_ldap.cpython-39-x86_64-linux-gnu.so
95632
0755
edit
dl
rm
Edit:
/opt/imh-python/lib/python3.9/site-packages/ldapurl.py
(12525B)
""" ldapurl - handling of LDAP URLs as described in RFC 4516 See https://www.python-ldap.org/ for details. """ __version__ = '3.3.1' __all__ = [ # constants 'SEARCH_SCOPE','SEARCH_SCOPE_STR', 'LDAP_SCOPE_BASE','LDAP_SCOPE_ONELEVEL','LDAP_SCOPE_SUBTREE', # functions 'isLDAPUrl', # classes 'LDAPUrlExtension','LDAPUrlExtensions','LDAPUrl' ] from ldap.compat import quote, unquote, MutableMapping LDAP_SCOPE_BASE = 0 LDAP_SCOPE_ONELEVEL = 1 LDAP_SCOPE_SUBTREE = 2 LDAP_SCOPE_SUBORDINATES = 3 SEARCH_SCOPE_STR = { None:'', LDAP_SCOPE_BASE:'base', LDAP_SCOPE_ONELEVEL:'one', LDAP_SCOPE_SUBTREE:'sub', LDAP_SCOPE_SUBORDINATES:'subordinates', } SEARCH_SCOPE = { '':None, # the search scope strings defined in RFC 4516 'base':LDAP_SCOPE_BASE, 'one':LDAP_SCOPE_ONELEVEL, 'sub':LDAP_SCOPE_SUBTREE, # from draft-sermersheim-ldap-subordinate-scope 'subordinates':LDAP_SCOPE_SUBORDINATES, } # Some widely used types StringType = type('') TupleType=type(()) def isLDAPUrl(s): """ Returns 1 if s is a LDAP URL, 0 else """ s_lower = s.lower() return \ s_lower.startswith('ldap://') or \ s_lower.startswith('ldaps://') or \ s_lower.startswith('ldapi://') def ldapUrlEscape(s): """Returns URL encoding of string s""" return quote(s).replace(',','%2C').replace('/','%2F') class LDAPUrlExtension(object): """ Class for parsing and unparsing LDAP URL extensions as described in RFC 4516. Usable class attributes: critical Boolean integer marking the extension as critical extype Type of extension exvalue Value of extension """ def __init__(self,extensionStr=None,critical=0,extype=None,exvalue=None): self.critical = critical self.extype = extype self.exvalue = exvalue if extensionStr: self._parse(extensionStr) def _parse(self,extension): extension = extension.strip() if not extension: # Don't parse empty strings self.extype,self.exvalue = None,None return self.critical = extension[0]=='!' if extension[0]=='!': extension = extension[1:].strip() try: self.extype,self.exvalue = extension.split('=',1) except ValueError: # No value, just the extype self.extype,self.exvalue = extension,None else: self.exvalue = unquote(self.exvalue.strip()) self.extype = self.extype.strip() def unparse(self): if self.exvalue is None: return '%s%s' % ('!'*(self.critical>0),self.extype) else: return '%s%s=%s' % ( '!'*(self.critical>0), self.extype,quote(self.exvalue or '') ) def __str__(self): return self.unparse() def __repr__(self): return '<%s.%s instance at %s: %s>' % ( self.__class__.__module__, self.__class__.__name__, hex(id(self)), self.__dict__ ) def __eq__(self,other): return \ (self.critical==other.critical) and \ (self.extype==other.extype) and \ (self.exvalue==other.exvalue) def __ne__(self,other): return not self.__eq__(other) class LDAPUrlExtensions(MutableMapping): """ Models a collection of LDAP URL extensions as a mapping type """ __slots__ = ('_data', ) def __init__(self, default=None): self._data = {} if default is not None: self.update(default) def __setitem__(self, name, value): """Store an extension name string value LDAPUrlExtension instance, whose extype nust match `name` """ if not isinstance(value, LDAPUrlExtension): raise TypeError("value must be LDAPUrlExtension, not " + type(value).__name__) if name != value.extype: raise ValueError( "key {!r} does not match extension type {!r}".format( name, value.extype)) self._data[name] = value def __getitem__(self, name): return self._data[name] def __delitem__(self, name): del self._data[name] def __iter__(self): return iter(self._data) def __len__(self): return len(self._data) def __str__(self): return ','.join(str(v) for v in self.values()) def __repr__(self): return '<%s.%s instance at %s: %s>' % ( self.__class__.__module__, self.__class__.__name__, hex(id(self)), self._data ) def __eq__(self,other): if not isinstance(other, self.__class__): return NotImplemented return self._data == other._data def parse(self,extListStr): for extension_str in extListStr.strip().split(','): if extension_str: e = LDAPUrlExtension(extension_str) self[e.extype] = e def unparse(self): return ','.join(v.unparse() for v in self.values()) class LDAPUrl(object): """ Class for parsing and unparsing LDAP URLs as described in RFC 4516. Usable class attributes: urlscheme URL scheme (either ldap, ldaps or ldapi) hostport LDAP host (default '') dn String holding distinguished name (default '') attrs list of attribute types (default None) scope integer search scope for ldap-module filterstr String representation of LDAP Search Filters (see RFC 4515) extensions Dictionary used as extensions store who Maps automagically to bindname LDAP URL extension cred Maps automagically to X-BINDPW LDAP URL extension """ attr2extype = {'who':'bindname','cred':'X-BINDPW'} def __init__( self, ldapUrl=None, urlscheme='ldap', hostport='',dn='',attrs=None,scope=None,filterstr=None, extensions=None, who=None,cred=None ): self.urlscheme=urlscheme self.hostport=hostport self.dn=dn self.attrs=attrs self.scope=scope self.filterstr=filterstr self.extensions=(extensions or LDAPUrlExtensions({})) if ldapUrl!=None: self._parse(ldapUrl) if who!=None: self.who = who if cred!=None: self.cred = cred def __eq__(self,other): return \ self.urlscheme==other.urlscheme and \ self.hostport==other.hostport and \ self.dn==other.dn and \ self.attrs==other.attrs and \ self.scope==other.scope and \ self.filterstr==other.filterstr and \ self.extensions==other.extensions def __ne__(self,other): return not self.__eq__(other) def _parse(self,ldap_url): """ parse a LDAP URL and set the class attributes urlscheme,host,dn,attrs,scope,filterstr,extensions """ if not isLDAPUrl(ldap_url): raise ValueError('Value %s for ldap_url does not seem to be a LDAP URL.' % (repr(ldap_url))) scheme,rest = ldap_url.split('://',1) self.urlscheme = scheme.strip() if not self.urlscheme in ['ldap','ldaps','ldapi']: raise ValueError('LDAP URL contains unsupported URL scheme %s.' % (self.urlscheme)) slash_pos = rest.find('/') qemark_pos = rest.find('?') if (slash_pos==-1) and (qemark_pos==-1): # No / and ? found at all self.hostport = unquote(rest) self.dn = '' return else: if slash_pos!=-1 and (qemark_pos==-1 or (slash_pos<qemark_pos)): # Slash separates DN from hostport self.hostport = unquote(rest[:slash_pos]) # Eat the slash from rest rest = rest[slash_pos+1:] elif qemark_pos!=1 and (slash_pos==-1 or (slash_pos>qemark_pos)): # Question mark separates hostport from rest, DN is assumed to be empty self.hostport = unquote(rest[:qemark_pos]) # Do not eat question mark rest = rest[qemark_pos:] else: raise ValueError('Something completely weird happened!') paramlist=rest.split('?',4) paramlist_len = len(paramlist) if paramlist_len>=1: self.dn = unquote(paramlist[0]).strip() if (paramlist_len>=2) and (paramlist[1]): self.attrs = unquote(paramlist[1].strip()).split(',') if paramlist_len>=3: scope = paramlist[2].strip() try: self.scope = SEARCH_SCOPE[scope] except KeyError: raise ValueError('Invalid search scope %s' % (repr(scope))) if paramlist_len>=4: filterstr = paramlist[3].strip() if not filterstr: self.filterstr = None else: self.filterstr = unquote(filterstr) if paramlist_len>=5: if paramlist[4]: self.extensions = LDAPUrlExtensions() self.extensions.parse(paramlist[4]) else: self.extensions = None return def applyDefaults(self,defaults): """ Apply defaults to all class attributes which are None. defaults Dictionary containing a mapping from class attributes to default values """ for k, value in defaults.items(): if getattr(self,k) is None: setattr(self, k, value) def initializeUrl(self): """ Returns LDAP URL suitable to be passed to ldap.initialize() """ if self.urlscheme=='ldapi': # hostport part might contain slashes when ldapi:// is used hostport = ldapUrlEscape(self.hostport) else: hostport = self.hostport return '%s://%s' % (self.urlscheme,hostport) def unparse(self): """ Returns LDAP URL depending on class attributes set. """ if self.attrs is None: attrs_str = '' else: attrs_str = ','.join(self.attrs) scope_str = SEARCH_SCOPE_STR[self.scope] if self.filterstr is None: filterstr = '' else: filterstr = ldapUrlEscape(self.filterstr) dn = ldapUrlEscape(self.dn) if self.urlscheme=='ldapi': # hostport part might contain slashes when ldapi:// is used hostport = ldapUrlEscape(self.hostport) else: hostport = self.hostport ldap_url = '%s://%s/%s?%s?%s?%s' % ( self.urlscheme, hostport,dn,attrs_str,scope_str,filterstr ) if self.extensions: ldap_url = ldap_url+'?'+self.extensions.unparse() return ldap_url def htmlHREF(self,urlPrefix='',hrefText=None,hrefTarget=None): """ Returns a string with HTML link for this LDAP URL. urlPrefix Prefix before LDAP URL (e.g. for addressing another web-based client) hrefText link text/description hrefTarget string added as link target attribute """ if not isinstance(urlPrefix, str): raise TypeError("urlPrefix must be str, not " + type(urlPrefix).__name__) if hrefText is None: hrefText = self.unparse() if not isinstance(hrefText, str): raise TypeError("hrefText must be str, not " + type(hrefText).__name__) if hrefTarget is None: target = '' else: if not isinstance(hrefTarget, str): raise TypeError("hrefTarget must be str, not " + type(hrefTarget).__name__) target = ' target="%s"' % hrefTarget return '<a%s href="%s%s">%s</a>' % ( target, urlPrefix, self.unparse(), hrefText ) def __str__(self): return self.unparse() def __repr__(self): return '<%s.%s instance at %s: %s>' % ( self.__class__.__module__, self.__class__.__name__, hex(id(self)), self.__dict__ ) def __getattr__(self,name): if name in self.attr2extype: extype = self.attr2extype[name] if self.extensions and \ extype in self.extensions and \ not self.extensions[extype].exvalue is None: result = unquote(self.extensions[extype].exvalue) else: return None else: raise AttributeError('%s has no attribute %s' % ( self.__class__.__name__,name )) return result # __getattr__() def __setattr__(self,name,value): if name in self.attr2extype: extype = self.attr2extype[name] if value is None: # A value of None means that extension is deleted delattr(self,name) elif value!=None: # Add appropriate extension self.extensions[extype] = LDAPUrlExtension( extype=extype,exvalue=unquote(value) ) else: self.__dict__[name] = value def __delattr__(self,name): if name in self.attr2extype: extype = self.attr2extype[name] if self.extensions: try: del self.extensions[extype] except KeyError: pass else: del self.__dict__[name]
Save
cmd:
run