From 4f08a2951a04ba75fdf7b784dcf84059537d7b4c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 20 Oct 2011 13:24:45 +1100 Subject: [PATCH] s4-dsdb: moved dsdb_Dn() into common.py this gives a method for dealing with binary DNs from python Pair-Programmed-With: Amitay Isaacs --- source4/scripting/python/samba/common.py | 40 +++++++++++++++++++++ source4/scripting/python/samba/dbchecker.py | 29 ++------------- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/source4/scripting/python/samba/common.py b/source4/scripting/python/samba/common.py index 5a9fae1c922..9738966e451 100644 --- a/source4/scripting/python/samba/common.py +++ b/source4/scripting/python/samba/common.py @@ -18,6 +18,8 @@ # along with this program. If not, see . # +import ldb, dsdb + def confirm(msg, forced = False, allow_all=False): """confirm an action with the user :param msg: A string to print to the user @@ -55,3 +57,41 @@ def normalise_int32(ivalue): if int(ivalue) & 0x80000000 and int(ivalue) > 0: return str(int(ivalue) - 0x100000000) return str(ivalue) + + +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[4:-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 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) diff --git a/source4/scripting/python/samba/dbchecker.py b/source4/scripting/python/samba/dbchecker.py index 8120307dfa0..7d85adfd16d 100644 --- a/source4/scripting/python/samba/dbchecker.py +++ b/source4/scripting/python/samba/dbchecker.py @@ -25,30 +25,7 @@ from samba import common from samba.dcerpc import misc from samba.ndr import ndr_unpack from samba.dcerpc import drsblobs - - -class dsdb_DN(object): - '''a class to manipulate DN components''' - - def __init__(self, samdb, dnstring, syntax_oid): - if syntax_oid in [ dsdb.DSDB_SYNTAX_BINARY_DN, dsdb.DSDB_SYNTAX_STRING_DN ]: - colons = dnstring.split(':') - if len(colons) < 4: - raise Exception("invalid DN prefix") - prefix_len = 4 + len(colons[1]) + int(colons[1]) - self.prefix = dnstring[0:prefix_len] - self.dnstring = dnstring[prefix_len:] - else: - self.dnstring = dnstring - self.prefix = '' - try: - self.dn = ldb.Dn(samdb, self.dnstring) - except Exception, msg: - print("ERROR: bad DN string '%s'" % self.dnstring) - raise - - def __str__(self): - return self.prefix + str(self.dn.extended_str(mode=1)) +from samba.common import dsdb_Dn class dbcheck(object): """check a SAM database for errors""" @@ -196,7 +173,7 @@ class dbcheck(object): self.report("Normalised attribute %s" % attrname) def is_deleted_objects_dn(self, dsdb_dn): - '''see if a dsdb_DN is the special Deleted Objects DN''' + '''see if a dsdb_Dn is the special Deleted Objects DN''' return dsdb_dn.prefix == "B:32:18E2EA80684F11D2B9AA00C04F79F805:" @@ -329,7 +306,7 @@ class dbcheck(object): '''check a DN attribute for correctness''' error_count = 0 for val in obj[attrname]: - dsdb_dn = dsdb_DN(self.samdb, val, syntax_oid) + dsdb_dn = dsdb_Dn(self.samdb, val, syntax_oid) # all DNs should have a GUID component guid = dsdb_dn.dn.get_extended_component("GUID") -- 2.34.1