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-19 02:59:48 +04:00
import ldb
2018-01-30 20:52:11 +03:00
from samba import dsdb
2018-01-30 11:51:20 +03:00
from samba . ndr import ndr_pack
from samba . dcerpc import misc
2017-03-08 07:17:27 +03:00
import binascii
2012-02-19 02:59:48 +04:00
2018-03-26 07:07:33 +03:00
from samba . compat import PY3
if PY3 :
# cmp() exists only in Python 2
def cmp ( a , b ) :
return ( a > b ) - ( a < b )
2018-10-11 02:52:09 +03:00
raw_input = input
2011-10-20 06:24:45 +04:00
2011-11-02 19:22:16 +04: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 19:22:16 +04: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 07:02:48 +04:00
mapping = {
' Y ' : True ,
' YES ' : True ,
' ' : False ,
' N ' : False ,
' NO ' : False ,
2018-07-30 09:14:37 +03:00
}
2011-07-05 07:02:48 +04:00
prompt = ' [y/N] '
2011-07-05 06:38:31 +04:00
if allow_all :
2011-07-05 07:02:48 +04: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 05:17:06 +04:00
def normalise_int32 ( ivalue ) :
''' normalise a ldap integer to signed 32 bit '''
2011-08-05 08:02:39 +04:00
if int ( ivalue ) & 0x80000000 and int ( ivalue ) > 0 :
2011-08-05 05:17:06 +04:00
return str ( int ( ivalue ) - 0x100000000 )
return str ( ivalue )
2011-10-20 06:24:45 +04: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-19 02:59:48 +04:00
if syntax_oid in [ dsdb . DSDB_SYNTAX_BINARY_DN , dsdb . DSDB_SYNTAX_STRING_DN ] :
2011-10-20 06:24:45 +04: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 ]
2018-07-30 09:18:25 +03:00
self . binary = self . prefix [ 3 + len ( colons [ 1 ] ) : - 1 ]
2011-10-20 06:24:45 +04: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 11:51:20 +03: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 " )
guid2 = dn2 . dn . get_extended_component ( " GUID " )
v = cmp ( guid1 , guid2 )
if v != 0 :
return v
v = cmp ( dn1 . binary , dn2 . binary )
return v
2018-03-26 07:07:33 +03:00
# 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
2011-10-20 06:24:45 +04: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 07:17:27 +03:00
def get_bytes ( self ) :
''' return binary as a byte string '''
return binascii . unhexlify ( self . binary )