diff options
author | Stefan Metzmacher <metze@samba.org> | 2011-02-14 14:18:14 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2011-02-14 16:26:46 +0100 |
commit | b423d83729f3f096078fe49f7e46481b1b46679a (patch) | |
tree | d6c0fec18db77876b549982e6b6b818b05de9011 /source4/scripting | |
parent | d3c082e53984fa8069180ed712030f8bd2a109ca (diff) | |
download | samba-b423d83729f3f096078fe49f7e46481b1b46679a.tar.gz samba-b423d83729f3f096078fe49f7e46481b1b46679a.tar.bz2 samba-b423d83729f3f096078fe49f7e46481b1b46679a.zip |
s4:ldapcmp: cope with range retrivals of multivalued attributes
A Windows Server returns a 'member;range=0-1499' attribute
with the first 1500 values of the 'member' attribute.
The client can do a BASE search on the given object
and ask for the 'member;range=1500-*' attribute.
It needs to loop until the high part of the returned
range is '*'.
metze
Autobuild-User: Stefan Metzmacher <metze@samba.org>
Autobuild-Date: Mon Feb 14 16:26:46 CET 2011 on sn-devel-104
Diffstat (limited to 'source4/scripting')
-rwxr-xr-x | source4/scripting/python/samba/netcmd/ldapcmp.py | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/source4/scripting/python/samba/netcmd/ldapcmp.py b/source4/scripting/python/samba/netcmd/ldapcmp.py index 1cde860fb1..160aa31258 100755 --- a/source4/scripting/python/samba/netcmd/ldapcmp.py +++ b/source4/scripting/python/samba/netcmd/ldapcmp.py @@ -133,6 +133,73 @@ class LDAPBase(object): except Ldb.LdbError, e: assert "No such object" in str(e) + def get_attribute_name(self, key): + """ Returns the real attribute name + It resolved ranged results e.g. member;range=0-1499 + """ + + r = re.compile("^([^;]+);range=(\d+)-(\d+|\*)$") + + m = r.match(key) + if m is None: + return key + + return m.group(1) + + def get_attribute_values(self, object_dn, key, vals): + """ Returns list with all attribute values + It resolved ranged results e.g. member;range=0-1499 + """ + + r = re.compile("^([^;]+);range=(\d+)-(\d+|\*)$") + + m = r.match(key) + if m is None: + # no range, just return the values + return vals + + attr = m.group(1) + hi = int(m.group(3)) + + # get additional values in a loop + # until we get a response with '*' at the end + while True: + + n = "%s;range=%d-*" % (attr, hi + 1) + res = self.ldb.search(base=object_dn, scope=SCOPE_BASE, attrs=[n]) + assert len(res) == 1 + res = dict(res[0]) + del res["dn"] + + fm = None + fvals = None + + for key in res.keys(): + m = r.match(key) + + if m is None: + continue + + if m.group(1) != attr: + continue + + fm = m + fvals = list(res[key]) + break + + if fm is None: + break + + vals.extend(fvals) + if fm.group(3) == "*": + # if we got "*" we're done + break + + assert int(fm.group(2)) == hi + 1 + hi = int(fm.group(3)) + + return vals + def get_attributes(self, object_dn): """ Returns dict with all default visible attributes """ @@ -142,7 +209,11 @@ class LDAPBase(object): # 'Dn' element is not iterable and we have it as 'distinguishedName' del res["dn"] for key in res.keys(): - res[key] = list(res[key]) + vals = list(res[key]) + del res[key] + name = self.get_attribute_name(key) + res[name] = self.get_attribute_values(object_dn, key, vals) + return res def get_descriptor_sddl(self, object_dn): |