
    g`                        S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJrJrJrJr  S SKJrJrJr  \R,                  " S5      r " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)Ldb)
ndr_unpack)security)SCOPE_SUBTREESCOPE_ONELEVEL
SCOPE_BASEERR_NO_SUCH_OBJECTLdbError)CommandCommandErrorOptionz^([^;]+);range=(\d+)-(\d+|\*)$c                       \ rS rSrSSSSSSSS\R
                  \R                  S4S jrS rS	 r	S
 r
S rS rS rS rS rS rS rSrg)LDAPBase+   Fsection SUBTc                    / nUnSU;  a/  [         R                  R                  U5      (       a  SU-  nOSU-  nUR                  5       R	                  S5      (       a  S/nXl        Xl        [        UUUUS9U l        Xl	        Xl
        X@l        XPl        X`l        Xpl        Xl        Xl        Xl        Xl        ['        U R                  R)                  5       5      U l        ['        U R                  R-                  5       5      U l        ['        U R                  R1                  5       5      U l        ['        U R                  R5                  5       5      U l        U R9                  5       U l        U R=                  5       U l        [@        RB                  " SSU R*                  5      RE                  S	S
5      U l#        U RI                  5       U l%        U RM                  5         U R                  (       a  U R                  (       d  U R
                  RO                  SU R"                  -  5        U R
                  RO                  SSU R*                  -  -   5        U R
                  RO                  SSU R:                  -  -   5        U R
                  RO                  SSU R>                  -  -   5        U R
                  RO                  SSU RF                  -  -   5        g g g )Nz://ztdb://%sz	ldap://%szldap://zmodules:paged_searches)urlcredentialslpoptionsz	[Dd][Cc]=r   ,.z
* Place-holders for %s:
    z${DOMAIN_DN}      => %s
z${DOMAIN_NETBIOS} => %s
z${SERVER_NAME}     => %s
z${DOMAIN_NAME}    => %s
)(ospathisfilelower
startswithoutferrfr   ldbsearch_basesearch_scopetwo_domainsquiet
descriptor	sort_acesviewverbosehostskip_missing_dnstrget_default_basednbase_dnget_root_basednroot_dnget_config_basedn	config_dnget_schema_basedn	schema_dnfind_netbiosdomain_netbiosfind_serversserver_namesresubreplacedomain_namefind_domain_sid
domain_sidget_sid_mapwrite)selfr,   credsr   twor'   r(   r)   r+   r*   basescoper!   r"   r-   ldb_options	samdb_urls                    6/usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py__init__LDAPBase.__init__-   sO    	ww~~d##&-	'$.	??''	2234K		9#(*,  !
$"		.48866894883356TXX779:TXX779:"//1 --/66+r4<<@HHcR..0 DJJIIOO9DIIEFIIOOG&A LL') ) *IIOOG&A //'0 0 1IIOOG&B --'. . /IIOOG&A ,,'- - . %/    c                     U R                   R                  U R                  S[        S9n[	        [
        R                  US   S   S   5      $ )Nz(objectClass=*))rF   
expressionrG   r   	objectSid)r#   searchr0   r   r   r   dom_sidrC   ress     rJ   r?   LDAPBase.find_domain_sidb   sA    hhoo4<<<MU_o`(**CF;,?,BCCrM   c                     U R                   R                  SU R                  -  [        SS/S9n[	        U5      S:  d   eU Vs/ s H  n[        US   S   5      PM     sn$ s  snf )z	
        zOU=Domain Controllers,%sz(objectClass=computer)cn)rF   rG   rO   attrsr   )r#   rQ   r0   r   lenr.   )rC   rT   xs      rJ   r9   LDAPBase.find_serversf   sh     hhoo#=#L$1>V_c^d  f3x!||),-AAdGAJ---s   A"c                 :    U R                   R                  SU R                  -  [        S/S9n[        W5      S:X  a  [        S5      eU H!  nSU;   d  M  US   S   R                  5       s  $    g ! [         a  nUu  p4US;   a  [        XB5      e S nANfS nAff = f)NzCN=Partitions,%snETBIOSNamerF   rG   rX   )z,Operation unavailable without authenticationr   zCould not find netbios name)r#   rQ   r4   r   r
   r   rY   decode)rC   rT   eenumestrrZ   s         rJ   r7   LDAPBase.find_netbiosn   s    	,((//'9DNN'J(5m_ " NC s8q=<==A!'*1133   	,JDGG"4++ H	,s   -A1 1
B;BBc                     S n U R                   R                  U[        S9n[        U5      S:H  $ ! [         a#  nUR                  u  pEU[
        :X  a   S nAge S nAff = f)N)rF   rG   F   )r#   rQ   r   r
   argsr	   rY   )rC   	object_dnrT   e2ra   rb   s         rJ   object_existsLDAPBase.object_exists~   s^    	((//y
/CC 3x1}  	77LT))		s   0 
AAAAc                      U R                   R                  U5        g ! [        R                   a  nS[	        U5      ;   d   e S nAg S nAff = f)NzNo such object)r#   deleter   r
   r.   )rC   rg   r`   s      rJ   delete_forceLDAPBase.delete_force   s=    	.HHOOI&|| 	.#s1v---	.s    AAAc                 X    [         R                  U5      nUc  U$ UR                  S5      $ )zTReturns the real attribute name
It resolved ranged results e.g. member;range=0-1499
re   )RE_RANGED_RESULTmatchgroup)rC   keyms      rJ   get_attribute_nameLDAPBase.get_attribute_name   s,    
 ""3'9JwwqzrM   c                    [         R                  U5      nUc  U$ UR                  S5      n[        UR                  S5      5      n SXVS-   4-  nU R                  R                  U[        U/S9n[        U5      S:X  d   e[        US   5      nUS	 Sn	Sn
U HC  n[         R                  U5      nUc  M  UR                  S5      U:w  a  M4  Un	[        X   5      n
  O   U	c   U$ UR                  U
5        U	R                  S5      S:X  a   U$ [        U	R                  S	5      5      US-   :X  d   e[        U	R                  S5      5      nGM  )
z[Returns list with all attribute values
It resolved ranged results e.g. member;range=0-1499
Nre      z%s;range=%d-*r^   r   dn*   )rp   rq   rr   intr#   rQ   r   rY   dictlistextend)rC   rg   rs   valsrt   attrhinrT   fmfvalss              rJ   get_attribute_valuesLDAPBase.get_attribute_values   sS   
 ""3'9Kwwqz_ 4a.0A((//y
1#/NCs8q= =s1v,CD	BE$**3/9771:%SX  z  KKxx{c!
  rxx{#rAv---RXXa[!BC rM   c                     U R                   R                  U[        S/S9n[        U5      S:X  d   e[	        US   5      nUS	 0 nUR                  5        H5  u  pEU R                  U5      n[        U5      nU R                  XU5      X6'   M7     U$ )z9Returns dict with all default visible attributes
        rz   r^   re   r   ry   )	r#   rQ   r   rY   r}   itemsru   sortedr   )rC   rg   rT   
attributesrs   r   names          rJ   get_attributesLDAPBase.get_attributes   s     hhoo9JseoL3x1}}3q6lI
IC**3/D$<D#88NJ	 % rM   c                     U R                   R                  U[        S/S9nUS   S   S   n[        [        R
                  U5      nUR                  U R                  5      $ )NnTSecurityDescriptorr^   r   )r#   rQ   r   r   r   r(   as_sddlr@   )rC   rg   rT   descs       rJ   get_descriptor_sddlLDAPBase.get_descriptor_sddl   sW    hhoo9JG]F^o_1v,-a0(--t4||DOO,,rM   c           	         0 U l         U R                  R                  U R                  S[        SS/S9nU HC  n [        US   S   5      U R                   S[        [        R                  US   S   5      -  '   ME     g! [         a     MU  f = f)z`Build dictionary that maps GUID to 'name' attribute found in Schema or Extended-Rights.
        z(objectSid=*)rP   sAMAccountName)rF   rO   rG   rX   r   %sN)
sid_mapr#   rQ   r0   r   r.   r   r   rR   KeyError)rC   rT   items      rJ   rA   LDAPBase.get_sid_map   s     hhoo4<<)8VacsUt  vDZ]^bcs^tuv^wZxTJx/?/?kARSTAU$VVW   s   ?A>>
BB)r0   r4   r(   r>   r8   r@   r"   r,   r#   r!   r'   r2   r6   r$   r%   r:   r   r-   r)   r&   r+   r*   N)__name__
__module____qualname____firstlineno__sysstdoutstderrrK   r?   r9   r7   ri   rm   ru   r   r   r   rA   __static_attributes__ rM   rJ   r   r   +   s`     %EUTYbjjszz43.jD.4 	.	2h$-
rM   r   c                   b    \ rS rSr\R
                  \R                  4S jrS rS r	S r
S rSrg)	
Descriptor   c                    X0l         X@l        Xl        X l        U R                  R	                  U R                  5      U l        U R                  5       U l        U R                  R                  (       a  U R                  R                  5         g g N)
r!   r"   conry   r   sddlextract_dacl	dacl_listr)   sort)rC   
connectionry   r!   r"   s        rJ   rK   Descriptor.__init__   sb    		HH009	**,88NN! rM   c                 :    SU R                   ;   a1  [        R                  " SU R                   5      R                  S5      nO1[        R                  " SU R                   5      R                  S5      n [        R
                  " SU5      $ ! [         a    / s $ f = f)zGExtracts the DACL as a list of ACE string (with the brackets).
        zS:zD:(.*?)(\(.*?\))S:r{   zD:(.*?)(\(.*\))z	(\(.*?\)))r   r;   rQ   rr   AttributeErrorfindallrS   s     rJ   r   Descriptor.extract_dacl   s|    	tyy ii 5tyyAGGJii 2DII>DDQG zz,,,  	I	s   A B 0B BBc                     SU-  n[         R                  " SU5      n[        U5      S:X  a  U$ U H.  n U R                  R                  U   nUR                  XE5      nM0     U$ ! [         a     MA  f = f)Nr   z	S-[-0-9]+r   )r;   r   rY   r   r   r=   r   )rC   acerT   sidssidr   s         rJ   fix_sidDescriptor.fix_sid
  sw    Sjzz+s+t9>JCxx'',kk#,  
  s   *A$$
A21A2c                 f   Sn[        U R                  5      [        UR                  5      :w  aA  US-  nUSS[        U R                  5      -  -   -  nUSS[        UR                  5      -  -   -  nSnSn S nS n SU R                  U   -  n SUR                  U   -  n[        U5      [        U5      -   S:X  a   XB4$ SU R                  U5      -  nSUR                  U5      -  nXx:w  a  X'<S S	U< S
3-  nSnOX'<S SU< S
3-  nUS-  nM  ! [         a    Sn Nf = f! [         a    Sn Nf = f)Nr       Difference in ACE count:
        => %s
r   Tr   z>60z * 
Fz | re   )rY   r   
IndexErrorr   )	rC   otherrT   iflagself_ace	other_aceself_ace_fixedother_ace_fixeds	            rJ   diff_1Descriptor.diff_1  s[   t~~#eoo"6699C7YT^^)<<<<C7YU__)====CHI$.."33 5??1#55	 8}s9~-2 { "DLL$::N"U]]9%==O0HHHHFA+ 
  
  	s$   :D D! DD!D0/D0c                    Sn[        U R                  5      [        UR                  5      :w  aA  US-  nUSS[        U R                  5      -  -   -  nUSS[        UR                  5      -  -   -  n/ n/ n/ nU R                   Vs/ s H  o`R                  U5      PM     nnUR                   Vs/ s H  oaR                  U5      PM     nnU H&  n UR                  U5        UR	                  U5        M(     [        U5      n[        U5      S:  a3  USSU R                  R                  -  -   -  nU H  nUSU-   S-   -  nM     U H&  n UR                  U5        UR	                  U5        M(     [        U5      n[        U5      S:  a3  USSUR                  R                  -  -   -  nU H  nUSU-   S-   -  nM     [        [        [        U5      5      5      nU R                  R                  (       a  US	-  nU H  nUSU-   S-   -  nM     U/ :H  =(       a    U/ :H  U4$ s  snf s  snf ! [
         a    UR	                  U5         GM}  f = f! [
         a    UR	                  U5         GM'  f = f)
Nr   r   r   r   r   r   zACEs found only in %s:
r   z    ACEs found in both:
)rY   r   r   indexappend
ValueErrorr   r   r,   r~   setr+   )	rC   r   rT   common_aces	self_aces
other_acesr   self_dacl_list_fixedother_dacl_list_fixeds	            rJ   diff_2Descriptor.diff_2:  sf   t~~#eoo"6699C7YT^^)<<<<C7YU__)====C	
=A^^L^cS 1^L?D Os!3 O'C(%++C0 ""3' ( 9%	y>A77$((--GGGC w}t++ ! )C($**3/ ""3' ) J'
z?Q77%))..HHHC!w}t++ " T#k"2348844C"w}t++ #R4J"$4c::C  M O  &  %%&  '!!#&&'s0   H .H%H*	I*I
	I
I-,I-)r   r   ry   r"   r!   r   N)r   r   r   r   r   r   r   rK   r   r   r   r   r   r   rM   rJ   r   r      s)    ,/JJSZZ "
-B+;rM   r   c                   z    \ rS rSr\R
                  \R                  4S jrS rS r	S r
S rS rS rS	 rS
 rSrg)
LDAPObjectih  c                 ~   XPl         X`l        Xl        U R                  R                  U l        U R                  R                  U l        U R                  R
                  U l        X0l        UR                  SU R                  R                  5      U l	        U R                  R                  SSU R                  R                  -  5      U l	        U R                  R                   H'  nU R                  R                  SSU-  5      U l	        M)     U R                  R                  U R                  5      U l        / SQU l        U R                  U l        U =R                  S/-  sl        U(       a  U =R                  U-  sl        / U l        / U l        / U l        / U l        / U l        U R                  (       Ga/  U =R                  / SQ-  sl        / SQU l        U R                    Vs/ s H  owR+                  5       PM     snU l        / S	QU l        U R"                   Vs/ s H  owR+                  5       PM     snU l        / S
QU l        U R$                   Vs/ s H  owR+                  5       PM     snU l        / SQU l        U R&                   Vs/ s H  owR+                  5       PM     snU l        SS/U l        U R(                   Vs/ s H  owR+                  5       PM     snU l        [-        U R                   Vs/ s H  owR+                  5       PM     sn5      U l        g s  snf s  snf s  snf s  snf s  snf s  snf )N${DOMAIN_DN}CN=${DOMAIN_NETBIOS}CN=%sCN=${SERVER_NAME}) badPasswordTimebadPwdCountdSCorePropagationData
lastLogoff	lastLogon
logonCountmodifiedCountzmsDS-Cached-Membershipz!msDS-Cached-Membership-Time-StampzmsDS-EnabledFeatureBLzmsDS-ExecuteScriptPasswordzmsDS-NcTypezmsDS-ReplicationEpochzmsDS-RetiredReplNCSignatureszmsDS-USNLastSyncSuccesspartialAttributeDeletionListpartialAttributeSetpekList	prefixMapreplPropertyMetaDatareplUpToDateVectorrepsFromrepsTo
rIDNextRIDrIDPreviousAllocationPoolschemaUpdateserverStatesubRefs
uSNChanged
uSNCreateduSNLastObjRemwhenChangedmsExchServer1HighestUSN)$objectCategory
objectGUIDrP   whenCreatedr   
pwdLastSetr   creationTimer   priorSetTimerIDManagerReferencegPLinkipsecNFAReferencefRSPrimaryMemberfSMORoleOwner
masteredByipsecOwnersReferencewellKnownObjectsotherWellKnownObjectsr   ipsecISAKMPReferenceipsecFilterReferencezmsDs-masteredBylastSetTimeipsecNegotiationPolicyReferencer   gPCFileSysPathaccountExpiresinvocationIdoperatingSystemoperatingSystemVersionoEMInformation
schemaInfotargetAddressmsExchMailboxGuidsiteFolderGUID)&distinguishedNamedefaultObjectCategorymembermemberOfsiteListnCNamehomeMDBhomeMTAinterSiteTopologyGeneratorserverReferencezmsDS-HasInstantiatedNCshasMasterNCszmsDS-hasMasterNCszmsDS-HasDomainNCsdMDLocationmsDS-IsDomainForrIDSetReferencesserverReferenceBLmsExchHomeRoutingGroupmsExchResponsibleMTAServersiteFolderServermsExchRoutingMasterDNmsExchRoutingGroupMembersBL	homeMDBBLmsExchHomePublicMDBmsExchOwningServertemplateRootsaddressBookRootsmsExchPolicyRootsglobalAddressListmsExchOwningPFTreemsExchResponsibleMTAServerBLmsExchOwningPFTreeBLz$msDS-MembersOfResourcePropertyListBLzmsDS-ValueTypeReferencez"msDS-MembersOfResourcePropertyListzmsDS-ValueTypeReferenceBLzmsDS-ClaimTypeAppliesToClass)proxyAddressesmailuserPrincipalName"msExchSmtpFullyQualifiedDomainNamednsHostNamenetworkAddressdnsRootservicePrincipalName)r  r   CNr   dNSHostNamer8  r   r  r!  r  r  )r8  r9  r  r]   r   r   DC)r!   r"   r   r&   r'   r+   summaryr=   r0   ry   r8   r:   r   r   non_replicated_attributesignore_attributesdn_attributesdomain_attributesservername_attributesnetbios_attributesother_attributesupperr   )rC   r   ry   r<  filter_listr!   r"   rZ   s           rJ   rK   LDAPObject.__init__i  s   		88//XX^^
xx''**^TXX-=-=>''//"8'DHHD[D[:[\&&Aggoo&97Q;GDG '((11$'':#*
&H "&!?!?#<"==""k1"!#%'""$ " "" 'H H"""D" 6:5G5G!H5G'')5G!HD&VD" :>9O9O%P9OAggi9O%PD"*^D& >B=W=W)X=W'')=W)XD&&rD#:>:Q:Q&R:QQwwy:Q&RD#%+T$4D!8<8M8M$N8M1WWY8M$ND!!$9O9O%P9OAggi9O%P!Q) "I &Q *Y 'S %O%Ps$   'L!L&L+L0L5;L:c                 d    U R                   (       d  U R                  R                  US-   5        ggz5
Log on the screen if there is no --quiet option set
r   Nr'   r!   rB   rC   msgs     rJ   logLDAPObject.log  s$     zzIIOOCI& rM   c                 $   SU-  nU R                   (       d  U$ UR                  5       R                  U R                  R                  R                  5       5      (       a1  US [        U5      [        U R                  R                  5      -
   S-   nU$ )Nr   r   )r&   rD  endswithr   r0   rY   rC   srT   s      rJ   fix_dnLDAPObject.fix_dn  sr    QhJ99; 0 0 6 6 8997s3x#dhh&6&6"778>IC
rM   c                 J   SU-  nU R                   (       d  U$ UR                  U R                  R                  R	                  5       U R                  R                  R                  5       5      nUR                  U R                  R                  R                  5       S5      nU$ )Nr   z${DOMAIN_NAME})r&   r=   r   r>   r   rD  rP  s      rJ   fix_domain_nameLDAPObject.fix_domain_name  sx    QhJkk$((..4468L8L8R8R8TUkk$((..4468HI
rM   c                 J   SU-  nU R                   (       d  U$ UR                  U R                  R                  R	                  5       U R                  R                  R                  5       5      nUR                  U R                  R                  R                  5       S5      nU$ )Nr   z${DOMAIN_NETBIOS})r&   r=   r   r8   r   rD  rP  s      rJ   fix_domain_netbiosLDAPObject.fix_domain_netbios  sx    QhJkk$((11779488;R;R;X;X;Z[kk$((11779;NO
rM   c                     SU-  nU R                   (       a#  [        U R                  R                  5      S:  a  U$ U R                  R                   H#  nUR	                  5       R                  US5      nM%     U$ )Nr   re   z${SERVER_NAME})r&   rY   r   r:   rD  r=   )rC   rQ  rT   rZ   s       rJ   fix_server_nameLDAPObject.fix_server_name	  sa    Qh3txx'<'<#=#AJ&&A))+%%a)9:C '
rM   c                 |    U R                   R                  (       a  U R                  U5      $ U R                  U5      $ r   )r   r(   cmp_desc	cmp_attrs)rC   r   s     rJ   __eq__LDAPObject.__eq__  s-    88==''~~e$$rM   c                    [        U R                  U R                  U R                  U R                  S9n[        UR                  UR                  U R                  U R                  S9nU R                  R
                  S:X  a  UR                  U5      nONU R                  R
                  S:X  a  UR                  U5      nO"[        SU R                  R
                   35      eUS   U l	        US   Ul	        US   $ )N)r!   r"   r   	collisionzUnknown --view option value: re   r   )
r   r   ry   r!   r"   r*   r   r   r   screen_output)rC   r   d1d2rT   s        rJ   r^  LDAPObject.cmp_desc  s    $''				J		588$))$))L88==I%))B-CXX]]k)))B-C<TXX]]OLMM V!!f1vrM   c                 (   Sn/ U l         [        U R                   Vs/ s H  o3R                  5       PM     sn5      n[        UR                   Vs/ s H  o3R                  5       PM     sn5      nXE-
  UR                  -
  nU(       a3  USSU R
                  R                  -  -   -  nU H  nUSU-   S-   -  nM     XT-
  U R                  -
  nU(       a3  USSUR
                  R                  -  -   -  nU H  nUSU-   S-   -  nM     Xh-  n	Sn
U R                   GH  nUR                  5       U R                  ;   d  UR                  5       U	;   a  M8  U R                  U   nUR                  R                  U5      n[        U[        5      (       a+  [        U[        5      (       a  [        U5      n[        U5      nX:w  d  M  S nS nS nS nUR                  5       U R                  ;   a  U Vs/ s H.  nU R
                  R                  R                  S5      S   U:H  PM0     nnU Vs/ s H.  nUR
                  R                  R                  S5      S   U:H  PM0     nnX:X  a  GMM  OlUR                  5       U R                  ;   aN  UnUnU Vs/ s H  nU R                  U5      PM     nnU Vs/ s H  nUR                  U5      PM     nnX:X  a  GM  UR                  5       U R                   ;   a`  UnUnU(       d  U(       d  UnUnU Vs/ s H  nU R#                  U5      PM     nnU Vs/ s H  nUR#                  U5      PM     nnX:X  a  GM8  UR                  5       U R$                  ;   a`  UnUnU(       d  U(       d  UnUnU Vs/ s H  nU R'                  U5      PM     nnU Vs/ s H  nUR'                  U5      PM     nnX:X  a  GM  UR                  5       U R(                  ;   a`  UnUnU(       d  U(       d  UnUnU Vs/ s H  nU R+                  U5      PM     nnU Vs/ s H  nUR+                  U5      PM     nnX:X  a  GM4  U
(       a	  X*S-   -  nS n
U(       a  U(       a  USU-   S	U< SU< 3-   S-   -  nOUSU-   S	U< SU< 3-   S-   -  nU R                   R-                  U5        GM     U	(       a  Xh:w  d   eU R.                  S
==   [        U5      -  ss'   U R.                  S==   U R                   -  ss'   UR.                  S
==   [        U5      -  ss'   UR.                  S==   U R                   -  ss'   X l        X!l        US:H  $ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )Nr   r   zAttributes found only in %s:r   r   z#    Difference in attribute values:r   r   z => 
unique_attrsdf_value_attrs)rj  r   r   rD  r>  r   r,   get
isinstancer~   r   rC  r>   splitr?  rR  r@  rU  rA  r[  rB  rX  r   r<  rd  )rC   r   rT   r   
self_attrsother_attrsself_unique_attrsrZ   other_unique_attrsmissing_attrstitleourstheirspqrt   r   js                     rJ   r_  LDAPObject.cmp_attrs%  s    4??C?4**,?CD
E4D4DE4DD::<4DEF&4u7N7NN7;dhhmmKKKC&w{T)) ' )58N8NN7;eiinnLLLC'w{T)) ( *>;AwwyD222aggi=6P??1%D%%))!,F$%%*VT*B*Bd|~ 779 5 55JNO$Q--33C8;q@$AOKQR6a..44S9!<A6ARv   WWY$"4"44AA123AQA3234!Qa!A4v 779 6 66AAQ ":;<!Q--a0!A<;<=1a..q11A=v 779 : ::AAQ ":;<!Q--a0!A<;<=1a..q11A=v 779 7 77AAQ "=>?Q003QA?>?@a11!4aA@v 4<'C E7Q;1a)@@4GGC7Q;4)HH4OOC##**1-S !V $:::^$->(??$%&$*=*==&n%.@)AA%&'4+>+>>' !byM DED PR 44 == == @@sG   UU+5U"&5U'U,-U1
U6+U;V )VV
'V)r   r   rj  ry   r?  r@  r"   r>  rB  r=  rC  r!   r'   rd  rA  r<  r&   r+   N)r   r   r   r   r   r   r   rK   rL  rR  rU  rX  r[  r`  r^  r_  r   r   rM   rJ   r   r   h  s@    jjszzRB'%
jrM   r   c                   l    \ rS rSrSS\R
                  \R                  4S jrS rS r	S r
S rS rS	rg)

LDAPBundlei  Nc                    XPl         X`l        Xl        U R                  R                  U l        U R                  R                  U l        U R                  R
                  U l        U R                  R                  U l        U R                  R                  U l        U R                  R                  U l        0 U l	        / U R                  S'   / U R                  S'   / U R                  S'   / U R                  S'   X@l
        U(       a  X0l        OKUR                  5       S;   a,  UR                  5       U l        U R                  U5      U l        O[        S5      eSnU[!        U R                  5      :  Ga  U R                  (       a  U R                  U   nUS [!        U5      [!        U R                  R"                  5      -
   S-   nUR%                  S	U R                  R&                  -  S
5      n[!        U R                  R(                  5      S:X  a2  U R                  R(                   H  n	UR%                  S	U	-  S5      nM     XR                  U'   US-  nU[!        U R                  5      :  a  U R                  (       a  M  [+        [-        U R                  5      5      U l        [/        U R                  5      U l        [!        U R                  5      U l        g )Nri  rj  known_ignored_dnabnormal_ignored_dnDOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFORESTz-Unknown initialization data for LDAPBundle().r   r   r   r   re   r   )r!   r"   r   r&   r'   r+   r$   r%   r-   r<  rE  dn_listrD  contextget_dn_list	ExceptionrY   r0   r=   r8   r:   r~   r   r   size)
rC   r   r  r  rE  r!   r"   countertmprZ   s
             rJ   rK   LDAPBundle.__init__  s#   		88//XX^^
xx''88// HH11#xx77')^$)+%&+-'(.0*+&"L]]_ __"==?DL++G4DLKLLDLL))d.>.>,,w'C7s3x#dhh&6&6"778>IC++g(?(??AWXC488(()Q...A++gk3FGC /$'LL!qLG DLL))d.>.>.> C-.dll+%	rM   c                 d    U R                   (       d  U R                  R                  US-   5        ggrH  rI  rJ  s     rJ   rL  LDAPBundle.log  s$     zzIIOOC$J' rM   c                 l    [        U R                  5      U l        [        U R                  5      U l        g r   )rY   r  r  r   )rC   s    rJ   update_sizeLDAPBundle.update_size  s"    %	dll+rM   c           
         SnU R                   UR                   :w  a@  U R                  SU R                   < SUR                   < 35        U R                  (       d  Sn[        U R                   Vs/ s H  o3R                  5       PM     sn5      n[        UR                   Vs/ s H  o3R                  5       PM     sn5      nU R                  [        :w  a  U R                  (       d  XE-
  nU(       aP  SnU R                  SU R                  R                  -  5        [        U5       H  nU R                  SU-   5        M     XT-
  nU(       aP  SnU R                  SUR                  R                  -  5        [        U5       H  nU R                  SU-   5        M     XE-  n	U R                  S[        U	5      -  5        U	 GH
  n
 [        U R                  U
U R                  U R                  U R                  U R                   S9n [        UR                  U
UR                  U R                  U R                  U R                   S9nX:X  a  U R                  R$                  (       a  U R                  S5        U R                  SUR&                  < SUR                  R                  < S35        U R                  SUR&                  < SUR                  R                  < S35        U R                  S5        OU R                  S5        U R                  SUR&                  < SUR                  R                  < S35        U R                  SUR&                  < SUR                  R                  < S35        U R                  UR(                  5        U R                  S5        SnUR                  U l        UR                  Ul        GM     U$ s  snf s  snf ! ["         a%  nU R                  S	U
< S
U< 35         S nAGME  S nAff = f! ["         a%  nU R                  S	U
< S
U< 35         S nAGMw  S nAff = f)NTz!
* DN lists have different size: z != Fz
* DNs found only in %s:r   z
* Objects to be compared: %d)r   ry   r<  rE  r!   r"   zLdbError for dn z: z
Comparing:'z' []z    OKz
    FAILED)r  rL  r-   r   r  rD  r%   r   r   r,   r   rY   r   r<  rE  r!   r"   r
   r+   ry   rd  )rC   r   rT   rw  self_dns	other_dns	self_onlyrZ   
other_only
common_dnsry   object1r`   object2s                 rJ   diffLDAPBundle.diff  s   99

"HHTYYPUPZPZ[\''4<<8<a	<89EMM:MqM:;	 
*43G3G ,I4txx}}DE	*AHHWq[) + #-J4uyy~~EF
+AHHWq[) , )
1C
OCDB$(*-1\\151A1A*.))$))	E$		(*-2]]151A1A*.))$))	E !88##HH^,HHGJJ8H8HIJHHGJJ8H8HIJHH^,(

GKK4D4DEF

GKK4D4DEF../+,"??DL#OOEMI L 
A 9:B  R;<  R;<s>   0O#OA OA P
P&PP
P=P88P=c                 L   UR                  5       S:X  a  U R                  R                  nOUR                  5       S:X  a  U R                  R                  nOUR                  5       S:X  a  U R                  R                  nO[UR                  5       S:X  a  SU R                  R                  -  nO-UR                  5       S:X  a  SU R                  R
                  -  n/ nU R                  (       d  WU l        U R                  R                  5       U l        U R                  S:X  a  [        U l        OCU R                  S	:X  a  [        U l        O'U R                  S
:X  a  [        U l        O[        S5      e U R                  R                  R                  U R                  U R                  S/S9nU H%  nUR%                  US   R'                  5       5        M'     U$ ! [         a<  nUR                  u  pgU R                   R#                  SU R                  -  5        e SnAff = f)zQuery LDAP server about the DNs of certain naming self.con.ext Domain (or Default), Configuration, Schema.
Parse all DNs and filter those that are 'strange' or abnormal.
r  r  r  r  zDC=DomainDnsZones,%sr  zDC=ForestDnsZones,%sr   BASEONEz0Wrong 'scope' given. Choose from: SUB, ONE, BASEry   r^   zFailed search of base=%s
N)rD  r   r0   r4   r6   r2   r$   r%   r   r   r   r   r#   rQ   r
   rf   r!   rB   r   get_linearized)	rC   r  r$   r  rT   e3ra   rb   rZ   s	            rJ   r  LDAPBundle.get_dn_list  s    ==?h&((**K]]_/((,,K]]_(((,,K]]_+04883C3CCK]]_+04883C3CCK*D --335% -D&( *D%' .DOPP	((,,%%4+;+;4CTCT]a\b%cC
 ANN1T71134   	77LTIIOO84;K;KKL	s   6:G 
H#'7HH#c                    [        [        U R                  S   5      5      U R                  S'   [        [        U R                  S   5      5      U R                  S'   U R                  S   (       ar  U R                  SU R                  R
                  -  5        U R                  SR                  U R                  S    Vs/ s H  n[        SU-   5      PM     sn5      5        U R                  S   (       ak  U R                  S5        U R                  SR                  U R                  S    Vs/ s H  n[        SU-   5      PM     sn5      5        / U R                  S'   g g s  snf s  snf )Nri  rj  z
Attributes found only in %s:r   z
    z"
Attributes with different values:)r~   r   r<  rL  r   r,   joinr.   )rC   rZ   s     rJ   print_summaryLDAPBundle.print_summary4  s   '+C^0L,M'N^$)-c$,,?O2P.Q)R%&<<'HH5EFHHRWWt||N?[\?[!c.1"45?[\]^<<()HH:;HHRWWt||L\?]^?]!c.1"45?]^_`-/DLL)* * ] _s    E#/E()r   r  r  r"   rE  r!   r'   r$   r%   r  r-   r<  r&   r+   )r   r   r   r   r   r   r   rK   rL  r  r  r  r  r   r   rM   rJ   r{  r{    s6    48djjszz%&N(,GR#J0rM   r{  c                   P   \ rS rSrSrSr\R                  \R                  \R                  S.r
/ SQr\" SSSS	S
SS9\" SSSS	S
SS9\" SSSS	S
SS9\" SSS	S
SS9\" SSS	S
SS9\" SSSSS/SS 9\" S!S"S#S$S%9\" S&S'S#S(S%9\" S)S*S+/ S,QS-S 9\" S.S/S#S0S%9\" S1S2S	S
S3S9/r    S7S5 jrS6rg4)8cmd_ldapcmpiB  zCompare two ldap databases.zO%prog <URL1> <URL2> (domain|configuration|schema|dnsdomain|dnsforest) [options])	sambaoptsversionoptscredopts)URL1URL2z	context1?z	context2?z	context3?z	context4?z	context5?z-wz--tworE   
store_trueFz"Hosts are in two different domains)destactiondefaulthelpz-qz--quietr'   z1Do not print anything but relay on just exit codez-vz	--verboser+   z*Print all DN pairs that have been comparedz--sdr(   z,Compare nTSecurityDescriptor attributes onlyz--sort-acesr)   z=Sort ACEs before comparison of nTSecurityDescriptor attributez--viewr*   r   rc  zUDisplay mode for nTSecurityDescriptor results. Possible values: section or collision.)r  r  choicesr  z--baserF   r   z:Pass search base that will build DN list for the first DC.)r  r  r  z--base2base2znPass search base that will build DN list for the second DC. Used when --two or when compare two different DNs.z--scoperG   r   )r   r  r  z>Pass search scope that builds DN list. Options: SUB, ONE, BASEz--filterfilterz>List of comma separated attributes to ignore in the comparisonz--skip-missing-dnr-   zCSkip report and failure due to missing DNs in one server or anotherNc                 .   UR                  5       nUR                  S5      =(       d    UR                  S5      nU(       a  UR                  USS9nOS nUR                  USS9nUR	                  5       (       a  UnO"UR                  S5        UR                  S5        U(       a   UR                  5       (       d  [        S5      e/ nUc  U(       a  U(       a  S/nOW/ S	QnORX4XVU4 HI  nUc  M  UR                  5       S	;  a  [        S
U-  5      eUR                  UR                  5       5        MK     U
(       a  U	(       a  [        S5      eU(       d  U(       d  U(       a  U(       d  [        S5      e[        UUUXXXUUU R                  U R                  US9n[        UR                  5      S:  d   e[        UUUXXXUUU R                  U R                  US9n[        UR                  5      S:  d   eUR!                  S5      nSnU GHq  n U	(       d  U R                  R#                  SU -  5        [%        UU UU R                  U R                  S9n![%        UU UU R                  U R                  S9n"U!R'                  U"5      (       a)  U	(       d   U R                  R#                  SU -  5        M  M  U	(       d  U R                  R#                  SU -  5        U(       d  [        U!R(                  S   5      [        U"R(                  S   5      :X  d   e/ U"R(                  S'   U R                  R#                  S5        U R                  R#                  S5        U!R+                  5         U"R+                  5         SnGMt     US:w  a  [        SU-  5      eg )NldapT)fallback_machineF)guessr   z3You must supply at least one username/password pairr  r  zIncorrect argument: %sz-You cannot set --verbose and --quiet togetherz<You need to specify both --base and --base2 at the same time)rE   r'   r(   r)   r+   r*   rF   rG   r!   r"   r-   r   r   z
* Comparing [%s] context...
)r  rE  r!   r"   z
* Result for [%s]: SUCCESS
z
* Result for [%s]: FAILURE
rj  z	
SUMMARY
z
---------
zCompare failed: %d)get_loadparmr    get_credentialsget_credentials2is_anonymous
set_domainset_workstationauthentication_requestedr   rD  r   r   r!   r"   rY   r0   rm  rB   r{  r  r<  r  )#rC   r  r  context1context2context3context4context5rE   r'   r+   r(   r)   r*   rF   r  rG   r  r  r  r  r-   r   
using_ldaprD   creds2contextsccon1con2rE  statusr  b1b2s#                                      rJ   runcmd_ldapcmp.rung  s%    ##%__V,G0G
,,R$,GEE**2U*;  Fb!""2&e<<>>TUU  %: [(hG9wwy$cc&'?!'CDD	* H uNOOD]^^eR 'U!YYTYYY 4<< 1$$$fb 'e!YYTYYY 4<< 1$$$ll3'G		 AG KLD'{!%<BD'{!%<B wwr{{IIOO$D$+%, -  IIOO$Dw$NO%"2::.>#?@C

ScHdDeeee79

#34		6		6((*((*1  2 Q;3f<== rM   r   )NNNNNFFFFFr   r   r   r   r   NNNF)r   r   r   r   __doc__synopsisr   SambaOptionsVersionOptionsCredentialsOptionsDoubletakes_optiongroups
takes_argsr   takes_optionsr  r   r   rM   rJ   r  r  B  s=   %`H ))--44 cJ 	tW5u8	:tYW\5G	It[yu@	BvLuB	D};|US	Uxfi)[AYk	mxfbP	Ryw E	Fyw?UT	Vz"T	V"):<Y^Y	[+M4 RVOTCEMR	W>rM   r  )r   r;   r   sambasamba.getoptgetoptr   r   	samba.ndrr   samba.dcerpcr   r#   r   r   r   r	   r
   samba.netcmdr   r   r   compilerp   objectr   r   r   r{  r  r   rM   rJ   <module>r     s   0 
 	 
      ! W W  ::?@ Ev EPr; r;jg gT	m0 m0`|>' |>rM   