2018-12-12 13:43:21 +13:00
#!/usr/bin/env python3
2011-04-11 17:26:35 +02:00
2018-03-09 14:04:29 +00:00
from __future__ import print_function
2018-07-30 18:21:38 +12:00
import sys
import os
import subprocess
2018-12-12 13:43:21 +13:00
from samba . compat import get_string
2011-04-11 17:26:35 +02:00
2012-11-27 12:08:33 +01:00
if len ( sys . argv ) != 3 :
2018-03-09 14:04:29 +00:00
print ( " Usage: test_wbinfo_sids2xids_int.py wbinfo net " )
2011-04-11 17:26:35 +02:00
sys . exit ( 1 )
wbinfo = sys . argv [ 1 ]
2012-11-27 12:08:33 +01:00
netcmd = sys . argv [ 2 ]
2018-07-30 18:20:39 +12:00
2018-12-13 16:33:40 +13:00
def run ( cmd ) :
"""
Run a cmd , return bytes str for py2 and unicode str for py3 .
NOTE : subprocess api always return bytes , in both py2 and py3 .
"""
output = subprocess . check_output ( cmd ) . strip ( )
2018-12-12 13:43:21 +13:00
return get_string ( output )
2018-12-13 16:33:40 +13:00
2017-06-28 14:58:41 +02:00
def flush_cache ( sids = [ ] , uids = [ ] , gids = [ ] ) :
for sid in sids :
os . system ( netcmd + ( " cache del IDMAP/SID2XID/ %s " % ( sid ) ) )
for uids in uids :
os . system ( netcmd + ( " cache del IDMAP/UID2SID/ %s " % ( uid ) ) )
for gids in gids :
os . system ( netcmd + ( " cache del IDMAP/GID2SID/ %s " % ( gid ) ) )
2014-11-25 16:52:53 +13:00
2018-07-30 18:20:39 +12:00
2014-11-25 16:52:53 +13:00
def fill_cache ( inids , idtype = ' gid ' ) :
for inid in inids :
if inid is None :
continue
2018-12-13 16:33:40 +13:00
run ( [ wbinfo , ' -- %s -to-sid= %s ' % ( idtype , inid ) ] )
2012-11-27 12:08:33 +01:00
2018-07-30 18:21:29 +12:00
2018-12-13 16:33:40 +13:00
domain = run ( [ wbinfo , " --own-domain " ] )
domsid = run ( [ wbinfo , " -n " , domain + " / " ] )
2011-04-11 17:26:35 +02:00
domsid = domsid . split ( ' ' ) [ 0 ]
2018-07-30 18:19:49 +12:00
# print domain
# print domsid
2011-04-11 17:26:35 +02:00
2018-07-30 18:18:03 +12:00
sids = [ domsid + ' -512 ' , ' S-1-5-32-545 ' , domsid + ' -513 ' , ' S-1-1-0 ' , ' S-1-3-1 ' , ' S-1-5-1 ' ]
2011-04-11 17:26:35 +02:00
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids )
2012-11-27 12:08:33 +01:00
2018-12-13 16:33:40 +13:00
sids2xids = run ( [ wbinfo , ' --sids-to-unix-ids= ' + ' , ' . join ( sids ) ] )
2011-04-11 17:26:35 +02:00
2018-07-30 18:18:03 +12:00
gids = [ ]
uids = [ ]
2014-11-25 16:52:53 +13:00
idtypes = [ ]
2011-04-11 17:26:35 +02:00
for line in sids2xids . split ( ' \n ' ) :
result = line . split ( ' ' ) [ 2 : ]
2014-11-25 16:52:53 +13:00
idtypes . append ( result [ 0 ] )
2011-04-11 17:26:35 +02:00
2014-11-25 16:52:53 +13:00
gid = None
uid = None
if result [ 0 ] == ' gid ' :
2011-04-11 17:26:35 +02:00
gid = result [ 1 ]
2014-11-25 16:52:53 +13:00
elif result [ 0 ] == ' uid ' :
uid = result [ 1 ]
elif result [ 0 ] == ' uid/gid ' :
gid = result [ 1 ]
uid = result [ 1 ]
2011-04-11 17:26:35 +02:00
if gid == ' -1 ' :
gid = ' '
gids . append ( gid )
2014-11-25 16:52:53 +13:00
if uid == ' -1 ' :
uid = ' '
uids . append ( uid )
2012-11-27 12:08:33 +01:00
# Check the list produced by the sids-to-xids call with the
2014-11-25 16:52:53 +13:00
# singular variant (sid-to-xid) for each sid in turn.
2018-07-30 18:20:39 +12:00
2014-11-25 16:52:53 +13:00
def check_singular ( sids , ids , idtype = ' gid ' ) :
i = 0
2012-11-27 12:08:33 +01:00
for sid in sids :
2014-11-25 16:52:53 +13:00
if ids [ i ] is None :
continue
2018-12-13 16:33:40 +13:00
outid = run ( [ wbinfo , ' --sid-to- %s ' % idtype , sid ] )
2014-11-25 16:52:53 +13:00
if outid != ids [ i ] :
2018-03-09 14:04:29 +00:00
print ( " Expected %s , got %s \n " % ( outid , ids [ i ] ) )
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , uids = uids , gids = gids )
2014-11-25 16:52:53 +13:00
sys . exit ( 1 )
i + = 1
# Check the list produced by the sids-to-xids call with the
# multiple variant (sid-to-xid) for each sid in turn.
2018-07-30 18:20:39 +12:00
2014-11-25 16:52:53 +13:00
def check_multiple ( sids , idtypes ) :
2018-12-13 16:33:40 +13:00
sids2xids = run ( [ wbinfo , ' --sids-to-unix-ids= ' + ' , ' . join ( sids ) ] )
2014-11-25 16:52:53 +13:00
# print sids2xids
i = 0
for line in sids2xids . split ( ' \n ' ) :
result = line . split ( ' ' ) [ 2 : ]
if result [ 0 ] != idtypes [ i ] :
2018-03-09 14:04:29 +00:00
print ( " Expected %s , got %s \n " % ( idtypes [ i ] , result [ 0 ] ) )
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , uids = uids , gids = gids )
2012-11-27 12:08:33 +01:00
sys . exit ( 1 )
2014-11-25 16:52:53 +13:00
i + = 1
2012-11-27 12:08:33 +01:00
2018-07-30 18:21:29 +12:00
2014-11-25 16:52:53 +13:00
# first round: with filled cache via sid-to-id
check_singular ( sids , gids , ' gid ' )
check_singular ( sids , uids , ' uid ' )
2011-04-11 17:26:35 +02:00
2012-11-27 12:08:33 +01:00
# second round: with empty cache
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , gids = gids )
2014-11-25 16:52:53 +13:00
check_singular ( sids , gids , ' gid ' )
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , uids = uids )
2014-11-25 16:52:53 +13:00
check_singular ( sids , uids , ' uid ' )
# third round: with filled cache via uid-to-sid
2017-06-28 14:58:41 +02:00
flush_cache ( sids = uids , uids = uids )
2014-11-25 16:52:53 +13:00
fill_cache ( uids , ' uid ' )
check_multiple ( sids , idtypes )
# fourth round: with filled cache via gid-to-sid
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , gids = gids )
2014-11-25 16:52:53 +13:00
fill_cache ( gids , ' gid ' )
check_multiple ( sids , idtypes )
# flush the cache so any incorrect mappings don't break other tests
2017-06-28 14:58:41 +02:00
flush_cache ( sids = sids , uids = uids , gids = gids )
2011-04-11 17:26:35 +02:00
sys . exit ( 0 )