
    @Oc`                        d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlZddlZddlZddlZddlmZmZ ddlZddlZddlmZ dd	lmZ dd
lmZ ddlZddlZ	 ddlmZ n# e$ r d ZY nw xY wddlZddl Zddl!Z	 ddlm"Z" n# e$ r  G d de#          Z"Y nw xY wej$        %                    ej$        &                    ej$        '                    e(          d                    Z) e*d  e+d          D                       Z,d  e-e          .                                D             Z/d Z0d Z1 G d dej2                  Z2 G d de2          Z3 G d de2          Z4d Z5d2dZ6dZ7 G d d e2          Z8 G d! d"e2          Z9 G d# d$e#          Z: G d% d&e4          Z;	 	 d3d(Z<	 	 d4d)Z=d5d*Z>d+ Z?d, Z@e G d- d.e                      ZA	 	 	 	 d6d0ZB	 	 d7d1ZCdS )8zSamba Python tests.    N)param)credentials)Credentials)gensec)IntEnumunique)randint)SystemRandom)contextmanager)SamDBc                      d S N )argskwargss     6/usr/lib/python3/dist-packages/samba/tests/__init__.pyr   r   /   s    t    )SkipTestc                       e Zd ZdZdS )r   zTest skipped.N__name__
__module____qualname____doc__r   r   r   r   r   9   s        r   r   z../../../../binc           	          g | ]F}t          t          t          |                              d k    r|dk     r|nt          d          GS )      .)lenreprchrord.0xs     r   
<listcomp>r&   ?   sJ    lll\]3tCFF||#4#4#9#9CAAsSVxxlllr      c                 D    i | ]\  }}|                     d           ||S ERR_)
startswithr$   kvs      r   
<dictcomp>r/   A   s/    III!ALL4H4HIq!IIIr   c                    t          | t          j                  r| j        d         } | t          v rt          |          S 	 dd                    d | D                        dS # t          $ r}t          |           Y d }~nd }~ww xY w| S )Nr   [, c              3   L   K   | ]}t                               ||          V   d S r   )LDB_ERR_LUTgetr#   s     r   	<genexpr>zldb_err.<locals>.<genexpr>K   s0      >>q[__Q22>>>>>>r   ])
isinstanceldbLdbErrorr   r4   join	TypeErrorprint)r.   es     r   ldb_errr?   C   s    !S\"" F1IK1~A499>>A>>>>>AAAA   aHs   "A" "
B,B  Bc                 .    |                                   | S r   )setUpDynamicTestCases)clss    r   DynamicTestCaserC   Q   s    Jr   c                        e Zd ZdZeddd            Zed             Z fdZd Zd Z	d	 Z
d
 ZddZddZd Z xZS )TestCasezA Samba test case.N)docc                    fd}||_         d|}t          | |          rt          d| d          t          | ||           dS )a   
        fnname is something like "test_dynamic_sum"
        suffix is something like "1plus2"
        argstr could be (1, 2)

        This would generate a test case called
        "test_dynamic_sum_1plus2(self)" that
        calls
        self._test_dynamic_sum_with_args(1, 2)
        c                 4     t          | dz              d S )Nz_%s_with_args)getattr)selfr   fnnames    r   fnz*TestCase.generate_dynamic_test.<locals>.fnd   s%    3GD/F233T::::r   _zDynamic test z already exists!N)r   hasattrRuntimeErrorsetattr)rB   rK   suffixrF   r   rL   attrs    `  `  r   generate_dynamic_testzTestCase.generate_dynamic_testX   s~    	; 	; 	; 	; 	; 	;
 &&&&)3 	GEtEEEFFFT2r   c                 *    d| z  }t          |          )zThis can be implemented in order to call cls.generate_dynamic_test()
        In order to implement autogenerated testcase permutations.
        z=%s needs setUpDynamicTestCases() if @DynamicTestCase is used!)	Exception)rB   msgs     r   rA   zTestCase.setUpDynamicTestCasesl   s    
 NQTUnnr   c                 <   t          t          |                                            t          j        d          }|]t          |          }t          j                    | _        t          j	        |           | 
                    t          j	        |           d S d S )NTEST_DEBUG_LEVEL)superrE   setUposgetenvintsambaget_debug_level_old_debug_levelset_debug_level
addCleanup)rJ   test_debug_level	__class__s     r   rZ   zTestCase.setUpt   s    h##%%%9%788'"#344$)$9$;$;D!!"2333OOE13CDDDDD	 ('r   c                     t                      S r   )env_loadparmrJ   s    r   get_loadparmzTestCase.get_loadparm}   s    ~~r   c                     t           S r   )cmdline_credentialsrg   s    r   get_credentialszTestCase.get_credentials   s    ""r   c                     |                                  }|                    |                                           }|                                }|S r   )rk   get_named_ccacherh   get_name)rJ   credsccacheccache_names       r   get_creds_ccache_namezTestCase.get_creds_ccache_name   sG    $$&&''(9(9(;(;<<oo''r   c           	         d}d}t          |t                    }|rB|d d         }|dd         }|dd          }|rsd                    d |D                       }d                    d |D                       }|                    t                    }|                    t                    }nd                    d |D                       }d                    d	 |D                       }|                    t                                        d
          }|                    t                                        d
          }|d|d|d|||fz  z  }|dz  }|B|S )Nr           c                 2    g | ]}d t          |          z  S z%02Xr"   r#   s     r   r&   z$TestCase.hexdump.<locals>.<listcomp>   "    ;;;1vA;;;r   c                 2    g | ]}d t          |          z  S ry   rz   r#   s     r   r&   z$TestCase.hexdump.<locals>.<listcomp>   r{   r   c                     g | ]}d |z  S ry   r   r#   s     r   r&   z$TestCase.hexdump.<locals>.<listcomp>       666avz666r   c                     g | ]}d |z  S ry   r   r#   s     r   r&   z$TestCase.hexdump.<locals>.<listcomp>   r~   r   utf8z[%04X] %-*s  %-*s  %s %s
   )r8   strr;   	translateHEXDUMP_FILTERdecode)	rJ   srcNresult	is_stringlllrhlhrs	            r   hexdumpzTestCase.hexdump   so   sC((	 	RaRBQrTBbcc(C 	AXX;;;;;<<XX;;;;;<<\\.11\\.11XX66266677XX66266677\\.1188@@\\.1188@@2aE2rSU5VVVFGA  	  r   c                    |t          d          ||t          d          |,|J |                                }|                                }|                                }||                                }t                      }|                    |           |                    |           |                    |	                                           |
                    |                                           |                    |                                           |                    |                                t           j        z             |                    |           |r|                    |           |S )Nz)you need to supply a Credentials templatez8you cannot set creds username without setting a password)
ValueErrorget_usernameget_passwordget_bind_dnget_kerberos_stater   set_usernameset_password
set_domain
get_domain	set_realm	get_realmset_workstationget_workstationset_gensec_featuresget_gensec_featuresr   FEATURE_SEALset_kerberos_stateset_bind_dn)rJ   templateusernameuserpasskerberos_statesimple_bind_dncs          r   insta_credszTestCase.insta_creds   s   HIIIH$4JL L L ###,,..H,,..H!--//!%88::N MM	x   	x   	X((**+++	H&&(()))	(2244555	a3355 & 34 	5 	5 	5	^,,, 	*MM.)))r   Fc                    |r(|                                 }|                                 }||k    rt          j                            d|rdndt	          |          t	          |          fz             ddlm}  ||                    d          |                    d          dd          }|D ]!}t          j                            |           "|                     |           d	S d	S )
zAssert equality between two strings and highlight any differences.
        If strip is true, leading and trailing whitespace is ignored.z8The strings differ %s(lengths %d vs %d); a diff follows
zwhen stripped rt   r   )unified_diffTabN)	stripsysstderrwriter   difflibr   
splitlinesfail)rJ   r   r   rV   r   r   difflines           r   assertStringsEqualzTestCase.assertStringsEqual   s     			A		A66J 049 A 0 0r #AA "" # # # -,,,,,<T 2 2 !T 2 2 #S* *D  ' '
  &&&&IIcNNNNN 6r   c                    ||j          d| d| d}	  ||i | d t          t                                                    D             t	          |t
          j        j                  r"d                    fd|D                       }n	                    |          }| 
                    |d|d	|d
           dS # t          j        $ r}|j        \  }}	t	          |t
          j        j                  r||v }
n||k    }
|
sd t          t                                                    D             t	          |t
          j        j                  r"d                    fd|D                       }n	                    |          }| 
                    | d| d| d	                    |           d| d|	            Y d}~dS Y d}~dS d}~ww xY w)z/Assert a function raises a particular LdbError.Nz(*z, **)c                 n    i | ]2\  }}|                     d           t          |t                    /||3S r)   r+   r8   r]   r,   s      r   r/   z1TestCase.assertRaisesLdbError.<locals>.<dictcomp>   sX     C C CDAqll6**C/9!S/A/AC1a C C Cr   rw   c              3   B   K   | ]}                     |          V  d S r   r5   r$   r%   luts     r   r6   z0TestCase.assertRaisesLdbError.<locals>.<genexpr>   s-      'D'Dq

'D'D'D'D'D'Dr   z, expected LdbError z, (z) but we got successc                 n    i | ]2\  }}|                     d           t          |t                    /||3S r)   r   r,   s      r   r/   z1TestCase.assertRaisesLdbError.<locals>.<dictcomp>   sX     G G G1,,v..G3=a3E3EGq! G G Gr   c              3   B   K   | ]}                     |          V  d S r   r   r   s     r   r6   z0TestCase.assertRaisesLdbError.<locals>.<genexpr>   s-      +H+H1CGGAJJ+H+H+H+H+H+Hr   r2   z got z (z) )r   varsr9   itemsr8   collectionsabc	Containerr;   r5   r   r:   r   )rJ   errcodemessagefr   r   errcode_namer>   numrV   foundr   s              @r   assertRaisesLdbErrorzTestCase.assertRaisesLdbError   s   ?::t:::::G	8Atv&C CDIIOO$5$5 C C CC';?#<== 0"xx'D'D'D'DG'D'D'DDD"www//II.5gg.:ll.5gg	7 8 8 8 8 81 | 	$ 	$ 	$JS#';?#<== 'ww 
$G GS		(9(9 G G Gg{'@AA 4#&88+H+H+H+H+H+H+H#H#HLL#&777#3#3L		W # #&2# #6=# #!$# #14# # !# # $ $ $ $ $ $ $ $ $
$ 
$ 
$ 
$ 
$ 
$	$s   C GC5GG)NNNN)NF)r   r   r   r   classmethodrS   rA   rZ   rh   rk   rr   r   r   r   r   __classcell__rd   s   @r   rE   rE   U   s        >B     [&   [E E E E E  # # #    ,       D   ."8 "8 "8 "8 "8 "8 "8r   rE   c                   ,     e Zd ZdZ fdZg fdZ xZS )LdbTestCasez2Trivial test case for running tests against a LDB.c                     t          t          |                                            t          j        d          | _        | j        j        | _        t          j        | j                  | _	        d S )NF)delete)
rY   r   rZ   tempfileNamedTemporaryFilenamefilenamer^   Ldbr9   rJ   rd   s    r   rZ   zLdbTestCase.setUp  sW    k4  &&((( 35AAA*9T]++r   c                 
   t          j                    }t          j        | j         d          |_        d                    |          |d<   | j                             |           t          j        | j                  | _         dS )z Change the modules for this Ldb.z@MODULES,z@LISTN)	r9   MessageDndnr;   addr^   r   r   )rJ   modulesms      r   set_moduleszLdbTestCase.set_modules  s_    KMMvdh
++XXg&&'
Q9T]++r   )r   r   r   r   rZ   r   r   r   s   @r   r   r      sW        <<, , , , , #% , , , , , , , ,r   r   c                   ^     e Zd Z fdZd Zed             Zdej        ddZ	dddZ
 xZS )	TestCaseInTempDirc                     t          t          |                                            t          j                    | _        |                     | j                   d S r   )rY   r   rZ   r   mkdtemptempdirrb   _remove_tempdirr   s    r   rZ   zTestCaseInTempDir.setUp  sK    &&,,...')),-----r   c                     |                      g t          j        | j                             t          j        | j                   d | _        d S r   )assertEqualr[   listdirr   rmdirrg   s    r   r   z!TestCaseInTempDir._remove_tempdir  sA    RZ55666
r   c              #     K   	 t          j        | j                  \  }}|V  	 t          j        |           t          j        |           dS # t          t          f$ r)}t          d|z  t          j
                   Y d}~dS d}~ww xY w# 	 t          j        |           t          j        |           w # t          t          f$ r(}t          d|z  t          j
                   Y d}~w d}~ww xY wxY w)z*Yield a temporary filename in the tempdir.)dirz#could not remove temporary file: %s)fileN)r   mkstempr   r[   closeunlinkOSErrorIOErrorr=   r   r   )rJ   fdrL   r>   s       r   mktempzTestCaseInTempDir.mktemp  s<     		'%$,777FBHHH'	"W% ' ' ';a?:' ' ' ' ' ' ' ' ' '''	"W% ' ' ';a?:' ' ' ' ' ' ' ' ''sL   !B (A B
!BB
C4(B87C48C1	C,'C4,C11C4Fallow_missing_rmc          	      |   |D ]}t           j                            | j        |          }t           j                            |          | j        k    rt          d          	  ||           k# t          $ rA}|st          | d| j         d|           t          | d| j                    Y d}~d}~ww xY wdS )aU  Remove listed files from the temp directory.

        The files must be true files in the directory itself, not in
        sub-directories.

        By default a non-existent file will cause a test failure (or
        error if used outside a test in e.g. tearDown), but if
        allow_missing is true, the absence will be ignored.
        z&{path} might be outside {self.tempdir}z not in : N)	r[   pathr;   r   dirnamer   FileNotFoundErrorAssertionErrorr=   )rJ   r   r   filesr   r   r>   s          r   rm_fileszTestCaseInTempDir.rm_files+  s      	4 	4A7<<a00D wt$$44 !IJJJ4D				$ 4 4 4$ L(A)J)Jt|)J)Jq)J)JKKK22DL2233333333	4	4 	4s   "A..
B987B44B9)r   c                6     | j         ||t          j        d dS )zRemove listed directories from temp directory.

        This works like rm_files, but only removes directories,
        including their contents.
        r   N)r  shutilrmtree)rJ   r   dirss      r   rm_dirszTestCaseInTempDir.rm_dirsE  s%     	t=fmLLLLLLr   )r   r   r   rZ   r   r   r   r[   remover  r  r   r   s   @r   r   r     s        . . . . .
   ' ' ^' .3	 4 4 4 4 44 ,1 M M M M M M M M Mr   r   c                      t          j                    } 	 |                     t          j        d                    n# t
          $ r t          d          w xY w| S )NSMB_CONF_PATHzSMB_CONF_PATH not set)r   LoadParmloadr[   environKeyError)lps    r   rf   rf   N  s_    			B0

?+,,,, 0 0 0.///0Is	   %; AFc                     |r"| t           j                                        vrdS | t           j                                        v sJ d| z              t           j        |          S )zReturns value for variable in os.environ

    Function throws AssertionError if variable is defined.
    Unit-test based python tests require certain input params
    to be set in environment, otherwise they can't be run
    NzPlease supply %s in environment)r[   r  keys)var_namer   s     r   env_get_var_valuer  W  s`      2:??,,,,4rz(((((*Kh*V(((:hr   c                       e Zd ZdZdS )RpcInterfaceTestCasezDCE/RPC Test case.Nr   r   r   r   r  r  h  s        r   r  c                        e Zd Zd Zd Zd ZdS )ValidNetbiosNameTestsc                 T    |                      t          j        d                     d S )NFOO)
assertTruer^   valid_netbios_namerg   s    r   
test_validz ValidNetbiosNameTests.test_validn  s%    07788888r   c                 T    |                      t          j        d                     d S )NFOOFOOFOOFOOFOOFOOFOOFOOFOOFOOassertFalser^   r  rg   s    r   test_too_longz#ValidNetbiosNameTests.test_too_longq  s'    1*==>>>>>r   c                 T    |                      t          j        d                     d S )Nz*BLAr  rg   s    r   test_invalid_charactersz-ValidNetbiosNameTests.test_invalid_characterst  s'    1&99:::::r   N)r   r   r   r  r   r"  r   r   r   r  r  l  sA        9 9 9? ? ?; ; ; ; ;r   r  c                        e Zd ZdZddZd ZdS )BlackboxProcessErrorzThis is raised when check_output() process returns a non-zero exit status

    Exception instance should contain the exact exit code (S.returncode),
    command line (S.cmd), process output (S.stdout) and process error stream
    (S.stderr)
    Nc                     || _         t          |t                    r"d                    |          | _        d| _        n|| _        d| _        || _        || _        || _        d S )Nrw   FT)	
returncoder8   listr;   cmdshellstdoutr   rV   )rJ   r&  r(  r*  r   rV   s         r   __init__zBlackboxProcessError.__init__  s\    $c4   	xx}}DHDJJDHDJr   c                 r    d| j         | j        | j        | j        | j        fz  }| j        |d| j        }|S )NzBCommand '%s'; shell %s; exit status %d; stdout: '%s'; stderr: '%s'z; message: )r(  r)  r&  r*  r   rV   )rJ   ss     r   __str__zBlackboxProcessError.__str__  sH    *h
DOT[$+NO 8%&QQ1Ar   r   )r   r   r   r   r+  r.  r   r   r   r$  r$  x  sA         
 
 
 
    r   r$  c                   <    e Zd ZdZd Zd
dZd
dZd Zd Zdd	Z	dS )BlackboxTestCasez"Base test case for blackbox tests.c                    t          |t                    r|}n|                    dd          }|d         }t          j                            t          |          }g d}t          j                            |          r||d<   ||v r;t          j        dd          r&|	                    dt          j
        d                    t          |t                    sd                    |          }|S )zQExpand the called script into a fully resolved path in the bin
        directory.rw      r   )z
samba-toolsamba_dnsupdatesamba_upgradednszscript/traffic_replayzscript/traffic_learnerPYTHONN)r8   r'  splitr[   r   r;   BINDIRexistsr\   insertr  )rJ   r   partsr(  exepython_cmdss         r   _make_cmdlinezBlackboxTestCase._make_cmdline  s     dD!! 	'EEJJsA&&EAhgll63''& & & 7>># 	E!H+")Hd";";LLBJx0111$%% 	#88E??Dr   Nc                 6    |                      |d|           d S )Nr   )rV   )check_exit_code)rJ   r   rV   s      r   	check_runzBlackboxTestCase.check_run  s#    T1#.....r   c                 6   |                      |          }t          |t                     }t          j        |t          j        t          j        |          }|                                \  }}|j        }||k    r|d|d|}t          |||||          |S )Nr*  r   r)  zexpected return code z; got )	r=  r8   r'  
subprocessPopenPIPEcommunicater&  r$  )	rJ   r   expectedrV   	use_shellp
stdoutdata
stderrdataretcodes	            r   r?  z BlackboxTestCase.check_exit_code  s    !!$''"4...	T$.O$.O#,. . . "#
J,h{{;C88WWM&w'+'1'1'*	, , ,
 r   c                    t          |t                     }|                     |          }t          j        |t          j        t          j        |d          }|                                \  }}|j        }|rt          ||||          |S )NT)r*  r   r)  	close_fds)	r8   r'  r=  rC  rD  rE  rF  r&  r$  rJ   r   rH  rI  rJ  rK  rL  s          r   check_outputzBlackboxTestCase.check_output  s    "4...	!!$''T*/*/#,> > >!"
J, 	N&wj*MMMr   c                 B   |                      |          }t          |t                     }t          j        |t          j        t          j        |          }|                                \  }}|j        }||                    d          |                    d          fS )NrB  UTF8)	r=  r8   r'  rC  rD  rE  rF  r&  r   rO  s          r   run_commandzBlackboxTestCase.run_command  s    !!$''"4...	T$.O$.O#,. . . "#
J,**622J4E4Ef4M4MNNr       c                 x   t                                          t          j                  }|t                                          t          j                  z  }|t                                          t          j                  z  }|d                    d t          |dz
            D                       z  }|S )Nrt   c              3      K   | ]I}t                                          t          j        t          j        z   t          j        z             V  Jd S r   )r
   choicestringascii_uppercaseascii_lowercasedigitsr#   s     r   r6   z3BlackboxTestCase.random_password.<locals>.<genexpr>  sd       > >'( )NN11&2H*3+M3" # # > > > > > >r   r   )r
   rW  rX  rY  r[  rZ  r;   range)rJ   countpasswords      r   random_passwordz BlackboxTestCase.random_password  s    >>(()?@@LNN))&-888LNN))&*@AAABGG > >,1%!),<,<> > > > > 	> r   r   )rT  )
r   r   r   r   r=  r@  r?  rP  rS  r_  r   r   r   r0  r0    s        ,,  4/ / / /   &	 	 	"	O 	O 	O     r   r0  Tc           	      \   d| vr,|s%t           j                            |           rd| z  } nd| z  } |                     d          rdg}n|rt	          d| z            |t                      }|t          j                            |          }|t          }t          | ||||||          S )	au  Create SamDB instance and connects to samdb_url database.

    :param samdb_url: Url for database to connect to.
    :param lp: Optional loadparm object
    :param session_info: Optional session information
    :param credentials: Optional credentials, defaults to anonymous.
    :param flags: Optional LDB flags
    :param ldap_only: If set, only remote LDAP connection will be created.
    :param global_schema: Whether to use global schema.

    Added value for tests is that we have a shorthand function
    to make proper URL for ldb.connect() while using default
    parameters for connection based on test environment
    z://ztdb://%sz	ldap://%szldap://zmodules:paged_searchesz;Trying to connect to %s while remote connection is requiredN)urlr  session_infor   flagsoptionsglobal_schema)r[   r   isfiler+   r   rf   r^   authsystem_sessionrj   r   )	samdb_urlr  rb  r   rc  ldb_options	ldap_onlyre  s           r   connect_samdbrl    s      I 	0RW^^I66 	0"Y.II#i/II&& C/0	 C 68AB C C 	C 
z^^z0044)Y*($,. . . .r   c           	          t          | ||||||          }|                    ddt          j        dg          }||d         fS )a  Connects to samdb_url database

    :param samdb_url: Url for database to connect to.
    :param lp: Optional loadparm object
    :param session_info: Optional session information
    :param credentials: Optional credentials, defaults to anonymous.
    :param flags: Optional LDB flags
    :param ldap_only: If set, only remote LDAP connection will be created.
    :return: (sam_db_connection, rootDse_record) tuple
    rt   *)base
expressionscopeattrsr   )rl  searchr9   
SCOPE_BASE)	ri  r  rb  r   rc  rj  rk  sam_dbress	            r   connect_samdb_exrw    sX     9b, +y: :F --RBcn"e  % %CCFr   c                 F   t          |           }t          j                    }|(t          j                    }|                    |           |                    t          |                     |                    t          |                     t          |||          S )a  Connect to SamDB by getting URL and Credentials from environment

    :param env_url: Environment variable name to get lsb url from
    :param env_username: Username environment variable
    :param env_password: Password environment variable
    :return: sam_db_connection
    N)r   r  )	r  r   r   r   r
  guessr   r   rl  )env_urlenv_usernameenv_passwordr  ri  ro   s         r   connect_samdb_envr}  2  s     "'**I#%%E	z ^B	(66777	(66777"====r   c                     	  | j         |fi | d S # t          j        $ r2}|j        \  }}|t          j        k    sJ d|z              Y d }~d S d }~ww xY w)Nzldb.delete() failed: %s)r   r9   r:   r   ERR_NO_SUCH_OBJECT)samdbr   r   errorr   errstrs         r   delete_forcer  F  s    QR""6"""""< Q Q Q
fc,,,,.G&.P,,,,,,,,,Qs    A'AAc                     t          dd          }t          j        | d|||                                 fz            }|                     |dd           |S )z Creates a unique OU for the testr2  i z
OU=%s%d,%sorganizationalUnit)r   objectclass)r	   r9   r   get_default_basednr   )r  r   randr   s       r   create_test_our  N  s\     1hD	|tT53K3K3M3M&NN	O	OB	IIR(<==>>>Ir   c                       e Zd ZdZdZdZdZdS )OptStater   r2     r   N)r   r   r   NOOPTHYPHEN1HYPHEN2NAMEr   r   r   r  r  [  s"        EGGDDDr   r  
   c                 R   |g }nd }|                      d          D ]v}|                                }|dk    r|
||k    rg }n)t          |          t          |          |z
  k     rM|d         dk    r|                    |           ||k    r nw|d S t	          j        d          j        }|D ]r}t          j        }	d }
d}|D ]"}|	t          j        k    r)|dk    r |	                                rt          j
        }	|}<|	t          j
        k    r9|                                rd|z   }
t          j        }	n|dk    rt          j        }	|	t          j        k    r5|                                rd|z   }
t          j        }	nt          j        }	|}|	t          j        k    rH ||          r|
|z  }
|                    |
g                               |           t          j        }	|}$|	t          j        k    r)|                    |
g                               |           td S )N
rt   r   -z^[\w-]$rw   z--)r6  lstripr   appendrecompilematchr  r  isspacer  isalnumr  r  
setdefault)outoptions_startoptions_endoptmapmax_leading_spaces	opt_linesraw_liner   is_longname_charstater   prevr   s                r   parse_help_consistencyr  c  sZ   
 			IIdOO    2::}$$		t99s8}}'9999 7c>>T""";E  z*--3 "5 "5 	 	A&&888$,E(((99;; -7D$MEE#XX$,E(((99;; !8D$MEE$NED%%##A&& AIDD%%dB//66t<<<$NEDHM!!dB''..t444E"5 "5r   c                    i }t          | |||           g }t          |                                          D ]7\  }}t          |          dk    r|D ]}|                    |d|           8|rd                    |          S dS )a  Ensure that options are not repeated and redefined in --help
    output.

    Returns None if everything is OK, otherwise a string indicating
    the problems.

    If options_start and/or options_end are provided, only the bit in
    the output between these two lines is considered. For example,
    with samba-tool,

    options_start='Options:', options_end='Available subcommands:'

    will prevent the test looking at the preamble which may contain
    examples using options.
    r2  r   r  N)r  sortedr   r   r  r;   )r  r  r  r  errorsr-   valuesr.   s           r   check_help_consistencyr    s    & F3(&!# # #
 FFLLNN++ 1 1	6v;;?? 1 1!!!QQ/0000 !yy   ! !r   )F)NNNr   NFT)NNNr   NFr   )NNNr  )NN)Dr   r[   r   warningsr   r9   r^   r   r   samba.credentialsr   r   rC  r   unittestr  enumr   r   
samba.authsamba.dcerpc.baserandomr	   r
   
contextlibr   r  rX  samba.samdbr   ImportError	samba.ndrsamba.dcerpc.dcerpcsamba.dcerpc.epmapperr   rU   r   abspathr;   r   __file__r7  	bytearrayr\  r   r   r   r4   r?   rC   rE   r   r   rf   r  rj   r  r  r$  r0  rl  rw  r}  r  r  r  r  r  r   r   r   <module>r     s  &   				       



              ) ) ) ) ) )           



  				                                     % % % % % %  !!!!!!!                   !!!!!!!       9      
bgooh&?&?&79 9 
: 
: llafafgjakaklllmmIIttCyy00III    f8 f8 f8 f8 f8x  f8 f8 f8R, , , , ,( , , ,$;M ;M ;M ;M ;M ;M ;M ;M|               8   	; 	; 	; 	; 	;H 	; 	; 	;    9   <X X X X X( X X Xv FJLP*. *. *. *.Z IM:?   (> > > >(Q Q Q
 
 
     w    *.'+"&.0	G5 G5 G5 G5V *.'+ !  !  !  !  !  !s$   .A5 5B ?B B B-,B-