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
import dsdb
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 ,
}
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 ]
2013-03-01 10:29:09 +04: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 ) )
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 )