
    bF                     |   d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZm	Z	 d dl
mZmZ d dl
mZ d dlmZ d dlZd dlmZmZmZ d dlZd dlZd dlmZmZ d	                    d
  ed d          D                       dz   Z ed          Z e d  edd          D              e!d          z   d  edd          D             z   d  edd          D             z   d  edd          D             z   d  edd          D             z   d  edd           D             z   d!  ed"d#          D             z             Z"h d$Z#d%Z$d&Z%d'Z&ej'        Z(ej)        *                                reZ+nd( Z+d) Z,d* Z- G d+ d,e          Z.e G d- d.e.                      Z/e G d/ d0e.                      Z0d1 Z1 e1             dS )2    N)SamDB)system_session)SubunitOptionsTestProgram)TestCaseldb_err)DynamicTestCase)c_REDc_GREENc_DARK_YELLOW)UF_SERVER_TRUST_ACCOUNTUF_TRUSTED_FOR_DELEGATION c              #   4   K   | ]}t          |          V  d S Nchr.0xs     B/usr/lib/python3/dist-packages/samba/tests/ldap_upn_sam_account.py	<genexpr>r   (   s(      66AQ666666        z"/\[]:|<>+=;?,*   c                 ,    g | ]}t          |          S  r   r   s     r   
<listcomp>r   .   s    8881A888r         u   ªºÿc                 ,    g | ]}t          |          S r   r   r   s     r   r   r   0       :::1A:::r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   r   1   r"   r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   r   2   r"   r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   r   3   r"   r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   r   4   r"   r         c                 ,    g | ]}t          |          S r   r   r   s     r   r   r   5   r"   r         >	   2  3  J  K  R  S  f  g    TFreportc                     | S r   r   )r   s    r   <lambda>r?   V   s    a r   c                  d    t          dt           t          t                      t                    S )Nzldap://)urllpsession_infocredentials)r   SERVERLPr   CREDSr   r   r   	get_samdbrH   Y   s3    'v'',.."$ $ $ $r   c                     t          |           t          u rN|                     t                                          t                                          t          dz             } | S )Nz.another.example.net)realmlrealmother_realm)typestrformatREALMupperlower)ss    r   rO   rO   `   sP    Aww#~~HH5;;==!KKMM"'*@"@  C C Hr   c                   Z     e Zd ZdZdZed             Zd Zd Zd Z	d Z
d Z fd	Z xZS )
LdapUpnSamTestBasez^Make sure we can't add userPrincipalNames or sAMAccountNames that
    implicitly collide.
    Fc                     t          | dd          rd S | j        D ]2^}}t          j        dd|          }|                     d|||           3d S )N	_disabledFz\W+_test_upn_sam)getattrcasesresubgenerate_dynamic_test)clsdocrowsnames       r   setUpDynamicTestCasesz(LdapUpnSamTestBase.setUpDynamicTestCasesn   sn    3U++ 	F) 	G 	GJC$6&#s++D%%ndD#FFFF	G 	Gr   c                     t          d |D                       }|D ]Y}d|v r|                    dd          \  }}nd} t          | d|           |           |                     | j        |           Zd S )Nc              3   &   K   | ]}|d          V  dS )r   Nr   )r   rs     r   r   z3LdapUpnSamTestBase.setup_objects.<locals>.<genexpr>w   s&      ))qad))))))r   :   useradd_)setsplitrZ   
addCleanupremove_object)selfra   objectsrb   objtypes        r   setup_objectsz LdapUpnSamTestBase.setup_objectsv   s    ))D))))) 	6 	6Dd{{ $

3 2 2 +GD***++D111OOD.5555	6 	6r   c                 <   |                      |           t          |          }t          |          D ]\  }}t          |          dk    r|\  }}}}	n|\  }}}t          j        }	| j        |         \  }
}d\  }}t          |t                    r+|	                    d          }|	                    d          }n(t          |t                    r
d|v r|}n|}n	d|v r|}n|}d|
i}|t          |          |d<   |t          |          |d	<   t          j                            | j        ||	          }|t          u r	 | j                            |           nF# t          j        $ r4}t%          d
|dz    d| dt'          |           d           Y d }~ed }~ww xY w|                     d
|dz    d| dt+          j        |           d|            |t.          u ru	 | j                            |           # t          j        $ rF}t1          d
|dz    d| dt'          |           dt+          j        |           d| 
          d d }~ww xY w|t2          u r	 | j                            |           t%          d
|dz    d| dt+          j        |           d|            y# t          j        $ rK}t%          d
|dz    d| dt'          |           dt+          j        |           d| 
           Y d }~d }~ww xY w	 | j                            |           n# t          j        $ r}t5          |d          r|j        d         |v rY d }~&|j        d         |k    rY d }~=|                     d
|dz    d| dt'          |           dt'          |           dt+          j        |           d|            Y d }~nd }~ww xY w|                     d
|dz    d| dt'          |           dt+          j        |           d| 
           d S )N   )NNsamupn@   @dnuserPrincipalNamesAMAccountNamezrow rh   z of 'z' failed as expected with 
z' should have failed:
z on z' failed with z:
z' SUCCEEDED:
z' FAILED with __contains__r   z' should have failed with z but instead failed with )rr   c_doc	enumeratelenldbFLAG_MOD_REPLACErp   
isinstancedictgetrN   rO   Message	from_dictsamdbbadmodifyLdbErrorprintr   failpprintpformatokAssertionErrorr=   hasattrargs)ro   ra   r`   cdocirowobjdataexpectedopry   dnsnameru   rv   mmsges                    r   _test_upn_sam_with_argsz*LdapUpnSamTestBase._test_upn_sam_with_args   s   4   Szzoo L	; L	;FAs3xx1}}*-'T8RR&)#T8),s+KB!HC$%% hhuoohhuooD#&& 	$;;CCCC4<<CCCr
A)/%&&,Skk"#+''
Ar::C3J%%c****|    ,1 , ,4 , ,$QZZ, , , - - -HHHH 		 :1 : :4 : :#^A..: :47: : ; ; ; ;RCJ%%c****| C C C(8qs 8 8 8 8WQZZ 8 8!>!,,8 8258 89 9>BCC V##;J%%c*** :1 : :4 : :#^A..: :47: : ; ; ; ;| ; ; ; :1 : :4 : :")!**: :#^A..: :47: : ; ; ; ; ; ; ; ;;?J%%c****| ? ? ?x88 %6!900$HHHHvayH,, II >QqS > >t > >9@9J9J> >9@> > "(!2!2> > 9<> > ? ? ? ? ? ? ? ?? 		 :1 : :4 : :5<X5F5F: :#^A..: :47: : ; ; ; ;UL	; L	;sp    EF*)FF#G??IAII!A
J--L<A LLL&&O5OO1AOOc                    d| d| j          }| dt                                           }| j                            |dt          t          t          z            ||                                 d           ||f| j	        |<   d S )NCN=z,OU=Domain Controllers,.computer)ry   objectclassuserAccountControldnsHostName
carLicense)
base_dnrP   rR   r   addrN   r   r   idrp   ro   rb   ry   r   s       r   add_dczLdapUpnSamTestBase.add_dc   s    >4>>>>##E##))++
%"%&=&?'@ #A #A"''))
 
 	 	 	 !']Tr   c                     d| d| j          }| j                            ||d|                                 d           |d f| j        |<   d S )Nr   ,ri   )ry   rb   r   r   )our   r   r   rp   )ro   rb   ry   s      r   add_userzLdapUpnSamTestBase.add_user   sg    #4##$'##
!''))	
 
 	 	 	 !$ZTr   c                 t    | j                             |          \  }}| j                            |           d S r   )rp   popr   deleter   s       r   rn   z LdapUpnSamTestBase.remove_object   s7    l&&t,,G
"r   c                    t                                                       t                      | _        | j                                        | _        |                                                     dd          d         d d         | _        i | _	        d| j         d| j         | _
        |                     | j        j        | j
        dg           | j                            | j
        dd           d S )	Nr   rh   ?   zOU=r   ztree_delete:1organizationalUnit)ry   r   )supersetUprH   r   get_default_basednr   r   rsplitshort_idrp   r   rm   r   r   )ro   	__class__s    r   r   zLdapUpnSamTestBase.setUp   s    [[
z4466		((a003CRC8:::4<::
)47_4EFFF
dg6JKKLLLLLr   )__name__
__module____qualname____doc__rW   classmethodrc   rr   r   r   r   rn   r   __classcell__)r   s   @r   rU   rU   h   s          IG G [G6 6 6P; P; P;d+ + +( ( (  M M M M M M M M Mr   rU   c                      e Zd Zg dddeffdddefddej        fddej        ffdddefddefddeffddd	efdd	effd
ddefddeffddd	efddeffddd	efddeffddd	ddefdd	ddeffdddefddeffdddefddej        ffdddefdd	ej        ffddd	efddeffddd	efdd	effddd	efddeffdddddefddddeej        fffdddddefddddeffddd efdd ej        ffd!ddefdd"effd#dd$d%iefdd$d%iej        fd&d$d'iej        ffd(dd$d)iefdd$d*iefd&d$d+iefd,d$d-ieffd.dd$d*iefdd$d)iefd,d$d-iefd&d$d+ieffd/dd0efdd1efdd2effd3dd4effd5ddefdd6efdd7efdd8effd9dd:d7iefdd;effd<dd:diefdd6effd=dd6efdd:dieffd>dd?efdd?ej        fdd@efd&dAefd,dBej        fd,dCeej        fffdDdd:dEiefdd:dFiefd&d:dEiefd&d:dFiefd&d$dGiefd&d$dHieffdIdd$dEiefdd$dHiefd&d$dEiefd&d:dFieffdJdd:dKiefdd:dLiefd&d:dKiefd&d:dLiefd&d$dMiefd&d$dNieffdOdd$dKiefdd$dPiefd&d$dKiefd&d:dHieffZdQS )RLdapUpnSamTestzadd good UPNAz	a@{realm}z%add the same upn to different objectsBz
a@{lrealm}zreplace UPN with itselfzreplace SAM with itselfazreplace UPN realmza@{other_realm}zmatching SAM and UPNz!matching SAM and UPN, other realmz$matching SAM and UPN, single message)ru   rv   z#different objects, different realmsz+different objects, same UPN, different casez	A@{realm}z different objects, SAM after UPNz!different objects, SAM before UPNz$different objects, SAM account clashz4different objects, SAM account clash, different caseztwo way clashr   z	y@{realm}yz	x@{realm}ztwo way clash, other realmzy@{other_realm}zx@{other_realm}zUPN clash on other realmza@x.xz UPN same but for trailing spacesz
a @{realm}zUPN has no atrv   noatCNOATz UPN with non-ascii at vs real atu   smallat﹫{realm}zsmallat@{realm}u   tagat󠁀{realm}Dztagat@{realm}z-UPN with unicode at vs real at, real at firstUPN username too longzaaaaaaaaaaaaaaaaaaaaaaaaa@b.czEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@b.ca  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@b.czsam account name 20 longaaaaaaaaaaaaaaaaaaaazUPN has two at signsza@{realm}@{realm}za@a.bza@a@a.bz/SAM has at signs clashing upn second, non-realmru   z	a@a.b@a.bz$SAM has at signs clashing upn secondz#SAM has at signs clashing upn firstzspaces around atza name @ {realm}za name @{realm}za name@{realm}za nameza name zSAM starts with atz@{realm}z@az@{realm}@{realm}z
@a@{realm}zUPN starts with atzSAM ends with atz{realm}@za@z
a@@{realm}z{realm}@@{realm}zUPN ends with atz@a@{realm}@N)	r   r   r   r   r   ERR_CONSTRAINT_VIOLATIONexistsr   r[   r   r   r   r   r      s       z2 

{B		
3z8 
1
{B	
{C8	9
|S9	:	
9zB 
#
{B	
{B	
|R	 	
CzL 
#
sB
sB	
MzT 

{B	
 "	%	
Uz\ 
 
sB
{B		
]zd 
-
sB
 "	%	
ezl 
0
s;//	4
s#455r	:	
mzt 
/
{B	
 "	%	
uz| 
7
{B	
{C8	9	
}zD 
,
{B	
sC0	1	
EzL 
-
sB
{F	#	
MzT 
0
sB
sF		
Uz\ 
@
sB
sF		
]zd 

s;//	4 s;//3/
0
2	
ezt 
&
s#455r	:
s#455r	:	
uz~ 
$
w	
w4	5	
zF 
,
{B	
|R	 	
GzP 

v	#
v <	=
v <	=	
Qz\ 
,
*+R	0
()2	.
/0"	5
'	,		
]zh 
9
()2	.
*+R	0
'	,
/0"	5		
izt 
!
 "	%
 "	%
!2	&		
uz@ 
$
x		
AzH 
 
{B	
"B	'
w	
y"			
IzT 
;
w	$
{B		
Uz\ 
0
{#R	(
"C	(	
]zd 
/
"B	'
{#S	)	
ezl 

!2	&
!3#?	@
 "	%
	$
x5	6
y63#?@	A	
mz| 

z"B	'
t}b	!
z"F	+
t}f	%
)*C	0
|$c	*	
}zL 

z"B	'
|$b	)
z"C	(
t}c	"		
MzX 

z"B	'
t}b	!
z"F	+
t}f	%
|$c	*
)*C	0	
Yzh 

z"B	'
}%r	*
z"C	(
|$b	)		
izEEEr   r   c                      e Zd Zdej        vZdddefddefddefddefddefdd	ej        ffd
ddej        ffdddefddej	        ffdddej	        fdd
                                ej	        fddej	        fdd
                                ej	        fddej	        fdd
                                ej	        ffddddiefdddieffddddiefdddieffgZdS )LdapUpnSamSambaOnlyTestSAMBA_SELFTESTzsam account name too longr   aaaaaaaaaaaaaaaaaaar   Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   a  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@b.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cb.cz UPN same but for internal spacesza b@x.xr   za  b@x.xzSAM contains deletezazabzbz#UPN with unicode wide at vs real atrv   u   wideat＠{realm}zwideat@{realm}zUPN with real at vs wide atN)r   r   r   osenvironrW   r   r   ERR_INVALID_ATTRIBUTE_SYNTAXr   encoder[   r   r   r   r   r     sq        !
2I	$
x	
x	
x	
y"	
y"	
y#:	;	
 
!
,

*
,	
 
,
y"	
z37	8	
 

w4	5
w~~!=	>
x5	6
x  #">	?
w4	5
w~~!=	>	 
/
)*B	/
'("	-	
 
'
'("	-
)*B	/	
C%EEEr   r   c                     t          j        d          } t          j        |           }|                     |           t          j        |           }|                     |           t          |           }|                     |           |                                 \  }}t          |          dk    r(| 	                                 t          j        d           |                                a|                    t                    a|d         at                                          at'          t(          |           d S )Nz7python3 ldap_upn_sam_account_name.py <server> [options]rh   r   )moduleopts)optparseOptionParseroptionsSambaOptionsadd_option_groupCredentialsOptionsr   
parse_argsr   print_usagesysexitget_loadparmrF   get_credentialsrG   rE   	get_realmrP   r   r   )parser	sambaoptscredoptssubunitoptsr   r   s         r   mainr     s    "AC CF$V,,I
I&&& )&11H
H%%% ((K
K(((""$$JD$
4yyA~~				!	!B$$R((E!WFOOExk222222r   )2r   r   samba.samdbr   
samba.authr   r   samba.tests.subunitrunr   r   samba.testsr   r   r	   samba.getoptgetoptr   r   samba.colourr
   r   r   r\   r   
samba.dsdbr   r   joinrangeBAD_SAM_CHARSr   ALLEGED_BAD_SAM_CHARSrk   listLATIN1_BAD_CHARSLATIN_EXTENDED_A_NO_CLASHr   r   r=   ERR_ENTRY_ALREADY_EXISTSr   stdoutisattyr~   rH   rO   rU   r   r   r   r   r   r   <module>r     s  & 
			 



       % % % % % % 



 > > > > > > > > ) ) ) ) ) ) ) ) ' ' ' ' ' '        6 6 6 6 6 6 6 6 6 6 				         66q"66666#$ C 388c3888tH~~&::dD(9(9:::; ;:dD(9(9:::; ;:dD(9(9:::	;
 ;:dD(9(9:::; ;:dD(9(9:::; ;:dD(9(9:::; < <  JII * 
			% : EEKE$ $ $  MM MM MM MM MM MM MM MM` { { { { {' { { {| ) ) ) ) )0 ) ) )X3 3 34 r   