summaryrefslogtreecommitdiff
path: root/python/samba/samdb.py
diff options
context:
space:
mode:
authorDavid Mulder <dmulder@suse.com>2020-09-14 11:12:37 -0600
committerDavid Mulder <dmulder@samba.org>2020-10-02 13:29:35 +0000
commit85d2ff2f0003b106ca84866b7e7893723f1dd93c (patch)
tree7d7ed7ac27b47cc3b05dedea730f352e3eefc9af /python/samba/samdb.py
parent234957a2e4408537c5722edf04dfe03dd31bd1b1 (diff)
downloadsamba-85d2ff2f0003b106ca84866b7e7893723f1dd93c.tar.gz
python: Move dsdb_Dn to samdb
The import dsdb needed for dsdb_Dn causes import errors when trying to import get_bytes/get_string in some places. Signed-off-by: David Mulder <dmulder@suse.com> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'python/samba/samdb.py')
-rw-r--r--python/samba/samdb.py76
1 files changed, 75 insertions, 1 deletions
diff --git a/python/samba/samdb.py b/python/samba/samdb.py
index f1af3c28c30..1da59dcdaab 100644
--- a/python/samba/samdb.py
+++ b/python/samba/samdb.py
@@ -32,8 +32,9 @@ from samba import dsdb, dsdb_dns
from samba.ndr import ndr_unpack, ndr_pack
from samba.dcerpc import drsblobs, misc
from samba.common import normalise_int32
-from samba.compat import get_bytes
+from samba.compat import get_bytes, cmp
from samba.dcerpc import security
+import binascii
__docformat__ = "restructuredText"
@@ -1341,3 +1342,76 @@ schemaUpdateNow: 1
if not full_dn.is_child_of(domain_dn):
full_dn.add_base(domain_dn)
return full_dn
+
+class dsdb_Dn(object):
+ '''a class for binary DN'''
+
+ def __init__(self, samdb, dnstring, syntax_oid=None):
+ '''create a dsdb_Dn'''
+ if syntax_oid is None:
+ # auto-detect based on string
+ if dnstring.startswith("B:"):
+ syntax_oid = dsdb.DSDB_SYNTAX_BINARY_DN
+ elif dnstring.startswith("S:"):
+ syntax_oid = dsdb.DSDB_SYNTAX_STRING_DN
+ else:
+ syntax_oid = dsdb.DSDB_SYNTAX_OR_NAME
+ if syntax_oid in [dsdb.DSDB_SYNTAX_BINARY_DN, dsdb.DSDB_SYNTAX_STRING_DN]:
+ # it is a binary DN
+ colons = dnstring.split(':')
+ if len(colons) < 4:
+ raise RuntimeError("Invalid DN %s" % dnstring)
+ prefix_len = 4 + len(colons[1]) + int(colons[1])
+ self.prefix = dnstring[0:prefix_len]
+ self.binary = self.prefix[3 + len(colons[1]):-1]
+ self.dnstring = dnstring[prefix_len:]
+ else:
+ self.dnstring = dnstring
+ self.prefix = ''
+ self.binary = ''
+ self.dn = ldb.Dn(samdb, self.dnstring)
+
+ def __str__(self):
+ return self.prefix + str(self.dn.extended_str(mode=1))
+
+ def __cmp__(self, other):
+ ''' compare dsdb_Dn values similar to parsed_dn_compare()'''
+ dn1 = self
+ dn2 = other
+ guid1 = dn1.dn.get_extended_component("GUID")
+ guid2 = dn2.dn.get_extended_component("GUID")
+
+ v = cmp(guid1, guid2)
+ if v != 0:
+ return v
+ v = cmp(dn1.binary, dn2.binary)
+ return v
+
+ # In Python3, __cmp__ is replaced by these 6 methods
+ def __eq__(self, other):
+ return self.__cmp__(other) == 0
+
+ def __ne__(self, other):
+ return self.__cmp__(other) != 0
+
+ def __lt__(self, other):
+ return self.__cmp__(other) < 0
+
+ def __le__(self, other):
+ return self.__cmp__(other) <= 0
+
+ def __gt__(self, other):
+ return self.__cmp__(other) > 0
+
+ def __ge__(self, other):
+ return self.__cmp__(other) >= 0
+
+ def get_binary_integer(self):
+ '''return binary part of a dsdb_Dn as an integer, or None'''
+ if self.prefix == '':
+ return None
+ return int(self.binary, 16)
+
+ def get_bytes(self):
+ '''return binary as a byte string'''
+ return binascii.unhexlify(self.binary)