2011-06-19 23:09:59 +04:00
# Samba common functions
#
# Copyright (C) Matthieu Patou <mat@matws.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
2012-02-18 23:59:48 +01:00
import ldb
import dsdb
2018-01-30 09:51:20 +01:00
from samba . ndr import ndr_pack
from samba . dcerpc import misc
2017-03-08 17:17:27 +13:00
import binascii
2012-02-18 23:59:48 +01:00
2011-10-20 13:24:45 +11:00
2011-11-02 16:22:16 +01:00
def confirm ( msg , forced = False , allow_all = False ) :
2011-06-19 23:09:59 +04:00
""" confirm an action with the user
2011-11-02 16:22:16 +01:00
: param msg : A string to print to the user
: param forced : Are the answer forced
2011-06-19 23:09:59 +04:00
"""
if forced :
print ( " %s [YES] " % msg )
return True
2011-07-05 13:02:48 +10:00
mapping = {
' Y ' : True ,
' YES ' : True ,
' ' : False ,
' N ' : False ,
' NO ' : False ,
}
prompt = ' [y/N] '
2011-07-05 12:38:31 +10:00
if allow_all :
2011-07-05 13:02:48 +10:00
mapping [ ' ALL ' ] = ' ALL '
mapping [ ' NONE ' ] = ' NONE '
prompt = ' [y/N/all/none] '
while True :
v = raw_input ( msg + ' %s ' % prompt )
v = v . upper ( )
if v in mapping :
return mapping [ v ]
print ( " Unknown response ' %s ' " % v )
2011-06-19 23:09:59 +04:00
2011-08-05 11:17:06 +10:00
def normalise_int32 ( ivalue ) :
''' normalise a ldap integer to signed 32 bit '''
2011-08-05 14:02:39 +10:00
if int ( ivalue ) & 0x80000000 and int ( ivalue ) > 0 :
2011-08-05 11:17:06 +10:00
return str ( int ( ivalue ) - 0x100000000 )
return str ( ivalue )
2011-10-20 13:24:45 +11:00
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
2012-02-18 23:59:48 +01:00
if syntax_oid in [ dsdb . DSDB_SYNTAX_BINARY_DN , dsdb . DSDB_SYNTAX_STRING_DN ] :
2011-10-20 13:24:45 +11:00
# 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 ]
2013-03-01 17:29:09 +11:00
self . binary = self . prefix [ 3 + len ( colons [ 1 ] ) : - 1 ]
2011-10-20 13:24:45 +11:00
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 ) )
2018-01-30 09:51:20 +01:00
def __cmp__ ( self , other ) :
''' compare dsdb_Dn values similar to parsed_dn_compare() '''
dn1 = self
dn2 = other
guid1 = dn1 . dn . get_extended_component ( " GUID " )
guid1b = ndr_pack ( misc . GUID ( guid1 ) )
guid2 = dn2 . dn . get_extended_component ( " GUID " )
guid2b = ndr_pack ( misc . GUID ( guid2 ) )
v = cmp ( guid1 , guid2 )
if v != 0 :
return v
v = cmp ( dn1 . binary , dn2 . binary )
return v
2011-10-20 13:24:45 +11:00
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 )
2017-03-08 17:17:27 +13:00
def get_bytes ( self ) :
''' return binary as a byte string '''
return binascii . unhexlify ( self . binary )