mirror of
https://github.com/samba-team/samba.git
synced 2025-07-23 20:59:10 +03:00
s4-dsdb: moved dsdb_Dn() into common.py
this gives a method for dealing with binary DNs from python Pair-Programmed-With: Amitay Isaacs <amitay@gmail.com>
This commit is contained in:
@ -18,6 +18,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
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)
|
||||
|
@ -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")
|
||||
|
Reference in New Issue
Block a user