
    d                        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mZmZmZmZmZ d dlmZmZmZ  ej,                  d      Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Zy)    N)Ldb)
ndr_unpack)security)SCOPE_SUBTREESCOPE_ONELEVEL
SCOPE_BASEERR_NO_SUCH_OBJECTLdbError)CommandCommandErrorOptionz^([^;]+);range=(\d+)-(\d+|\*)$c                       e Zd Zddddddddej                  ej
                  dfdZd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zy)LDAPBaseFsection SUBTc                    g }|}d|vr*t         j                  j                  |      rd|z  }nd|z  }|j                         j	                  d      rdg}|| _        || _        t        ||||      | _        |
| _	        || _
        || _        || _        || _        || _        |	| _        || _        || _        || _        t'        | j                  j)                               | _        t'        | j                  j-                               | _        t'        | j                  j1                               | _        t'        | j                  j5                               | _        | j9                         | _        | j=                         | _        tA        jB                  dd| j*                        jE                  d	d
      | _#        | jI                         | _%        | jM                          | j                  r| j                  s| j
                  jO                  d| j"                  z         | j
                  jO                  dd| j*                  z  z          | j
                  jO                  dd| j:                  z  z          | j
                  jO                  dd| j>                  z  z          | j
                  jO                  dd| jF                  z  z          y y y )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__zLDAPBase.__init__-   sa    	ww~~d#&-	'$.	??''	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                     | j                   j                  | j                  dt              }t	        t
        j                  |d   d   d         S )Nz(objectClass=*))rE   
expressionrF   r   	objectSid)r"   searchr/   r   r   r   dom_sidrB   ress     rI   r>   zLDAPBase.find_domain_sidb   sA    hhoo4<<<MU_o`(**CF;,?,BCCrK   c                     | j                   j                  d| j                  z  t        ddg      }t	        |      dkD  sJ |D cg c]  }t        |d   d          c}S c c}w )z	
        zOU=Domain Controllers,%sz(objectClass=computer)cn)rE   rF   rM   attrsr   )r"   rO   r/   r   lenr-   )rB   rR   xs      rI   r8   zLDAPBase.find_serversf   sd     hhoo#=#L$1>V_c^d  f3x!||),-AAdGAJ---s   A!c                 4   	 | j                   j                  d| j                  z  t        dg      }t              dk(  rt        d      |D ]  }d|v s|d   d   j                         c S  y # t        $ r}|\  }}|dv rt        ||      Y d }~`d }~ww xY w)NzCN=Partitions,%snETBIOSNamerE   rF   rU   )z,Operation unavailable without authenticationr   zCould not find netbios name)r"   rO   r3   r   r
   r   rV   decode)rB   rR   eenumestrrW   s         rI   r6   zLDAPBase.find_netbiosn   s    	,((//'9DNN'J(5m_ " NC s8q=<== 	4A!'*1133	4  	,JD$GG"4++ H	,s   0A/ /	B8BBc                     d }	 | j                   j                  |t              }t        |      dk(  S # t        $ r#}|j                  \  }}|t
        k(  rY d }~y d }~ww xY w)N)rE   rF   F   )r"   rO   r   r
   argsr	   rV   )rB   	object_dnrR   e2r]   r^   s         rI   object_existszLDAPBase.object_exists~   s`    	((//y
/CC 3x1}  	77LT4))		s   !3 	AAAAc                     	 | j                   j                  |       y # t        j                  $ r}dt	        |      v sJ Y d }~y d }~ww xY w)NzNo such object)r"   deleter   r
   r-   )rB   rb   r\   s      rI   delete_forcezLDAPBase.delete_force   s=    	.HHOOI&|| 	.#s1v---	.s    A
AA
c                 V    t         j                  |      }||S |j                  d      S )zi Returns the real attribute name
            It resolved ranged results e.g. member;range=0-1499
        r`   )RE_RANGED_RESULTmatchgroup)rB   keyms      rI   get_attribute_namezLDAPBase.get_attribute_name   s,    
 ""3'9JwwqzrK   c                    t         j                  |      }||S |j                  d      }t        |j                  d            }	 d||dz   fz  }| j                  j                  |t        |g      }t        |      dk(  sJ t        |d         }|d= d}	d}
|D ]@  }t         j                  |      }||j                  d      |k7  r0|}	t        ||         }
 n |		 |S |j                  |
       |	j                  d      dk(  r	 |S t        |	j                  d	            |dz   k(  sJ t        |	j                  d            })
zp Returns list with all attribute values
            It resolved ranged results e.g. member;range=0-1499
        Nr`      z%s;range=%d-*rZ   r   dn*   )ri   rj   rk   intr"   rO   r   rV   dictlistextend)rB   rb   rl   valsrm   attrhinrR   fmfvalss              rI   get_attribute_valueszLDAPBase.get_attribute_values   s\   
 ""3'9Kwwqz_ 4a.0A((//y
1#/NCs8q= =s1v,CD	BE $**3/9771:%SX z  KKxx{c!
  rxx{#rAv---RXXa[!BC rK   c                 &   | j                   j                  |t        dg      }t        |      dk(  sJ t	        |d         }|d= i }|j                         D ]7  \  }}| j                  |      }t        |      }| j                  |||      ||<   9 |S )z: Returns dict with all default visible attributes
        rr   rZ   r`   r   rq   )	r"   rO   r   rV   ru   itemsrn   sortedr~   )rB   rb   rR   
attributesrl   rx   names          rI   get_attributeszLDAPBase.get_attributes   s     hhoo9JseoL3x1}}3q6lI
 	OIC**3/D$<D#88CNJt		O rK   c                     | j                   j                  |t        dg      }|d   d   d   }t        t        j
                  |      }|j                  | j                        S )NnTSecurityDescriptorrZ   r   )r"   rO   r   r   r   r'   as_sddlr?   )rB   rb   rR   descs       rI   get_descriptor_sddlzLDAPBase.get_descriptor_sddl   sW    hhoo9JG]F^o_1v,-a0(--t4||DOO,,rK   c                    d|z  }g d}d}d}d}|t        |      k  rd}d}|||   k  rjt        t        ||               j                  dd      }	dd|	z   |	gt        |	         }	d|z  t        |      k  r|	|z   }n||	z  }|d	z  }|d	z  }|||   k  rj||d
z   z  }|d	z  }|t        |      k  r|t        |      k(  sJ |j	                         j                  d
d      S )z Translate binary representation of schemaIDGUID to standard string representation.
            @gid_blob: binary schemaIDGUID
        %s)   rs   rs   rs      r   r   0xN0rs   r`    -)rV   hexordr<   strip)
rB   	guid_blobblobstopsindexrR   rW   tmpycs
             rI   guid_as_stringzLDAPBase.guid_as_string   s    i#e*nCAeAh,DK()11$;37A&s1v.u9s4y(c'C1HC
Q eAh, 39CFA #e*n D	!!!yy{""3,,rK   c           	         i | _         | j                  j                  | j                  dt        ddg      }|D ]B  }	 t        |d   d         | j                   dt        t        j                  |d   d         z  <   D y# t        $ r Y Qw xY w)za Build dictionary that maps GUID to 'name' attribute found in Schema or Extended-Rights.
        z(objectSid=*)rN   sAMAccountName)rE   rM   rF   rU   r   r   N)
sid_mapr"   rO   r/   r   r-   r   r   rP   KeyError)rB   rR   items      rI   r@   zLDAPBase.get_sid_map   s     hhoo4<<)8VacsUt  v 	DZ]^bcs^tuv^wZxTJx/?/?kARSTAU$VVW	  s   ?A??	B
BN)__name__
__module____qualname__sysstdoutstderrrJ   r>   r8   r6   rd   rg   rn   r~   r   r   r   r@    rK   rI   r   r   +   se     %EUTYbjjszz43.jD.4 	.	2h$--4
rK   r   c                   X    e Zd Zej                  ej
                  fdZd Zd Zd Z	d Z
y)
Descriptorc                    || _         || _        || _        || _        | j                  j	                  | j                        | _        | j                         | _        | j                  j                  r| j                  j                          y y N)
r    r!   conrq   r   sddlextract_dacl	dacl_listr(   sort)rB   
connectionrq   r    r!   s        rI   rJ   zDescriptor.__init__  sj    		HH009	**,88NN! rK   c                 ,   	 d| j                   v r0t        j                  d| j                         j                  d      }n/t        j                  d| j                         j                  d      }t        j
                  d|      S # t        $ r g cY S w xY w)zH Extracts the DACL as a list of ACE string (with the brackets).
        zS:zD:(.*?)(\(.*?\))S:rs   zD:(.*?)(\(.*\))z	(\(.*?\)))r   r:   rO   rk   AttributeErrorfindallrQ   s     rI   r   zDescriptor.extract_dacl  s|    	tyy ii 5tyyAGGJii 2DII>DDQG zz,,,  	I	s   A-B BBc                     d|z  }t        j                  d|      }t        |      dk(  r|S |D ].  }	 | j                  j                  |   }|j                  ||      }0 |S # t        $ r Y >w xY w)Nr   z	S-[-0-9]+r   )r:   r   rV   r   r   r<   r   )rB   acerR   sidssidr   s         rI   fix_sidzDescriptor.fix_sid$  s~    Sjzz+s+t9>J 	Cxx'',kk#t,	 
  s   +A!!	A-,A-c                 Z   d}t        | j                        t        |j                        k7  rA|dz  }|ddt        | j                        z  z   z  }|ddt        |j                        z  z   z  }d}d}	 d }d }	 d| j                  |   z  }	 d|j                  |   z  }t        |      t        |      z   dk(  r	 ||fS d| j                  |      z  }d|j                  |      z  }||k7  r||dd	|d
z  }d}n||dd|d
z  }|dz  }# t        $ r d}Y w xY w# t        $ r d}Y w xY w)Nr       Difference in ACE count:
        => %s
r   Tr   z>60z * 
Fz | r`   )rV   r   
IndexErrorr   )	rB   otherrR   iflagself_ace	other_aceself_ace_fixedother_ace_fixeds	            rI   diff_1zDescriptor.diff_13  s_   t~~#eoo"6699C7YT^^)<<<<C7YU__)====CHI$.."33 5??1#55	 8}s9~-2 c{ "DLL$::N"U]]9%==O0HHHHFA+ 
  
  	s$   9D D DDD*)D*c                    d}t        | j                        t        |j                        k7  rA|dz  }|ddt        | j                        z  z   z  }|ddt        |j                        z  z   z  }g }g }g }| j                  D cg c]  }| j                  |       }}|j                  D cg c]  }|j                  |       }}|D ]%  }	 |j                  |       |j	                  |       ' t        |      }t        |      dkD  r1|dd| j                  j                  z  z   z  }|D ]  }|d|z   dz   z  } |D ]%  }	 |j                  |       |j	                  |       ' t        |      }t        |      dkD  r1|dd|j                  j                  z  z   z  }|D ]  }|d|z   dz   z  } t        t        t        |                  }| j                  j                  r|d	z  }|D ]  }|d|z   dz   z  } |g k(  xr |g k(  |fS c c}w c c}w # t
        $ r |j	                  |       Y ew xY w# t
        $ r |j	                  |       Y w xY w)
Nr   r   r   r   r   r   zACEs found only in %s:
r   z    ACEs found in both:
)rV   r   r   r   append
ValueErrorr   r   r+   rv   setr*   )	rB   r   rR   common_aces	self_aces
other_acesr   self_dacl_list_fixedother_dacl_list_fixeds	            rI   diff_2zDescriptor.diff_2T  s{   t~~#eoo"6699C7YT^^)<<<<C7YU__)====C	
=A^^LcS 1LL?D Os!3 O 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?H0H-,H-0IIN)r   r   r   r   r   r   rJ   r   r   r   r   r   rK   rI   r   r     s)    ,/JJSZZ "
-B+;rK   r   c                   p    e Zd Zej                  ej
                  fdZd Zd Zd Z	d Z
d Zd Zd Zd	 Zy
)
LDAPObjectc                 V   || _         || _        || _        | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        || _        |j                  d| j                  j                        | _	        | j                  j                  dd| j                  j                  z        | _	        | j                  j                  D ]&  }| j                  j                  dd|z        | _	        ( | j                  j                  | j                        | _        g d| _        | j                  | _        | xj                  dgz  c_        |r| xj                  |z  c_        g | _        g | _        g | _        g | _        g | _        | j                  r%| xj                  g dz  c_        g d| _        | j                   D cg c]  }|j+                          c}| _        g d	| _        | j"                  D cg c]  }|j+                          c}| _        g d
| _        | j$                  D cg c]  }|j+                          c}| _        g d| _        | j&                  D cg c]  }|j+                          c}| _        ddg| _        | j(                  D cg c]  }|j+                          c}| _        t-        | j                  D cg c]  }|j+                          c}      | _        y c c}w c c}w c c}w c c}w c c}w c c}w )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
objectGUIDrN   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   dNSHostNamer5  r  r  r  r  r  )r5  r6  r  rY   r   r   DC)r    r!   r   r%   r&   r*   summaryr<   r/   rq   r7   r9   r   r   non_replicated_attributesignore_attributesdn_attributesdomain_attributesservername_attributesnetbios_attributesother_attributesupperr   )rB   r   rq   r9  filter_listr    r!   rW   s           rI   rJ   zLDAPObject.__init__  s   		88//XX^^
xx''**^TXX-=-=>''//"8'DHHD[D[:[\&& 	HAggoo&97Q;GDG	H((11$'':#*
&H "&!?!?#<"==""k1"!#%'""$ " "" 'H H"""D" 6:5G5G!H!'')!HD&VD" :>9O9O%PAaggi%PD"*^D& >B=W=W)X!''))XD&&rD#:>:Q:Q&RQqwwy&RD#%+T$4D!8<8M8M$N1QWWY$ND!!$9O9O%PAaggi%P!Q) "I &Q *Y 'S %O%Ps$   LLLL7L!)L&c                 Z    | j                   s| j                  j                  |dz          yyzE
        Log on the screen if there is no --quiet option set
        r   Nr&   r    rA   rB   msgs     rI   logzLDAPObject.log  s$     zzIIOOCI& rK   c                    d|z  }| j                   s|S |j                         j                  | j                  j                  j                               r1|d t        |      t        | j                  j                        z
   dz   }|S )Nr   r   )r%   rA  endswithr   r/   rV   rB   srR   s      rI   fix_dnzLDAPObject.fix_dn  so    QhJ99; 0 0 6 6 897s3x#dhh&6&6"778>IC
rK   c                 @   d|z  }| j                   s|S |j                  | j                  j                  j	                         | j                  j                  j                               }|j                  | j                  j                  j                         d      }|S )Nr   z${DOMAIN_NAME})r%   r<   r   r=   r   rA  rK  s      rI   fix_domain_namezLDAPObject.fix_domain_name  sx    QhJkk$((..4468L8L8R8R8TUkk$((..4468HI
rK   c                 @   d|z  }| j                   s|S |j                  | j                  j                  j	                         | j                  j                  j                               }|j                  | j                  j                  j                         d      }|S )Nr   z${DOMAIN_NETBIOS})r%   r<   r   r7   r   rA  rK  s      rI   fix_domain_netbiosz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
rK   c                     d|z  }| j                   r"t        | j                  j                        dkD  r|S | j                  j                  D ]"  }|j	                         j                  |d      }$ |S )Nr   r`   z${SERVER_NAME})r%   rV   r   r9   rA  r<   )rB   rL  rR   rW   s       rI   fix_server_namezLDAPObject.fix_server_name#  sf    Qh3txx'<'<#=#AJ&& 	;A))+%%a)9:C	;
rK   c                 r    | j                   j                  r| j                  |      S | j                  |      S r   )r   r'   cmp_desc	cmp_attrs)rB   r   s     rI   __eq__zLDAPObject.__eq__+  s-    88==''~~e$$rK   c                     t        | j                  | j                  | j                  | j                        }t        |j                  |j                  | j                  | j                        }| j                  j
                  dk(  r|j                  |      }nM| j                  j
                  dk(  r|j                  |      }n"t        d| j                  j
                         |d   | _	        |d   |_	        |d   S )N)r    r!   r   	collisionzUnknown --view option value: r`   r   )
r   r   rq   r    r!   r)   r   r   r   screen_output)rB   r   d1d2rR   s        rI   rU  zLDAPObject.cmp_desc0  s    $''				J		588$))$))L88==I%))B-CXX]]k)))B-C<TXX]]OLMM V!!f1vrK   c                 $
   d}g | _         t        | j                  D cg c]  }|j                          c}      }t        |j                  D cg c]  }|j                          c}      }||z
  |j                  z
  }|r1|dd| j
                  j                  z  z   z  }|D ]  }|d|z   dz   z  } ||z
  | j                  z
  }|r1|dd|j
                  j                  z  z   z  }|D ]  }|d|z   dz   z  } ||z  }	d}
| j                  D ]+  }|j                         | j                  v s|j                         |	v r3| j                  |   }|j                  j                  |      }t        |t              r&t        |t              rt        |      }t        |      }||k7  sd }d }d }d }|j                         | j                  v rw|D cg c]-  }| j
                  j                  j                  d      d   |k(  / }}|D cg c]-  }|j
                  j                  j                  d      d   |k(  / }}||k(  re4|j                         | j                  v rG|}|}|D cg c]  }| j                  |       }}|D cg c]  }|j                  |       }}||k(  r|j                         | j                   v rO|}|}|s|s|}|}|D cg c]  }| j#                  |       }}|D cg c]  }|j#                  |       }}||k(  r|j                         | j$                  v rO|}|}|s|s|}|}|D cg c]  }| j'                  |       }}|D cg c]  }|j'                  |       }}||k(  rm|j                         | j(                  v rO|}|}|s|s|}|}|D cg c]  }| j+                  |       }}|D cg c]  }|j+                  |       }}||k(  r|
r
||
dz   z  }d }
|r|r|d|z   d	|d|z   dz   z  }n|d|z   d	|d|z   dz   z  }| j                   j-                  |       . |	r||k7  sJ | j.                  d
xx   t        |      z  cc<   | j.                  dxx   | j                   z  cc<   |j.                  d
xx   t        |      z  cc<   |j.                  dxx   | j                   z  cc<   || _        ||_        |dk(  S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr   r   zAttributes found only in %s:r   r   z#    Difference in attribute values:r   r   z => 
unique_attrsdf_value_attrs)r_  r   r   rA  r;  r   r+   get
isinstancerv   r   r@  r=   splitr<  rM  r=  rO  r>  rS  r?  rQ  r   r9  rZ  )rB   r   rR   ry   
self_attrsother_attrsself_unique_attrsrW   other_unique_attrsmissing_attrstitleourstheirspqrm   r{   js                     rI   rV  zLDAPObject.cmp_attrs?  s#    4??C4$**,CD
E4D4DED4::<EF&4u7N7NN7;dhhmmKKKC& *w{T))* ):58N8NN7;eiinnLLLC' *w{T))* *,>>; I	.AwwyD222aggi=6P??1%D%%))!,F$%*VT*Bd|v~ 779 5 55JNOQ--33C8;q@OAOKQRa..44S9!<ARARAv WWY$"4"44AA123AQ3A3234Qa4A4Av 779 6 66AAQ ":;<Q--a0<A<;<=a..q1=A=Av 779 : ::AAQ ":;<Q--a0<A<;<=a..q1=A=Av 779 7 77AAQ "=>?003?A?>?@11!4@A@Av 54<'C E7Q;1a)@@4GGC7Q;4)HH4OOC##**1-SI	.V $(::::^$->(??$%&$*=*==&n%.@)AA%&'4+>+>>' !byM DED PR 44 == == @@sG   SS
2S 2S%!S*?S/S4*S97S>T"T TN)r   r   r   r   r   r   rJ   rH  rM  rO  rQ  rS  rW  rU  rV  r   rK   rI   r   r     s@    jjszzRB'%
jrK   r   c                   b    e Zd Zddej                  ej
                  fdZd Zd Zd Z	d Z
d Zy)
LDAPBundleNc                    || _         || _        || _        | j                  j                  | _        | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        i | _	        g | j                  d<   g | j                  d<   g | j                  d<   g | j                  d<   || _
        |r|| _        nI|j                         dv r,|j                         | _        | j                  |      | _        nt        d      d}|t!        | j                        k  r | j                  r| j                  |   }|d t!        |      t!        | j                  j"                        z
   dz   }|j%                  d	| j                  j&                  z  d
      }t!        | j                  j(                        dk(  r0| j                  j(                  D ]  }	|j%                  d	|	z  d      } || j                  |<   |dz  }|t!        | j                        k  r| j                  rt+        t-        | j                              | _        t/        | j                        | _        t!        | j                        | _        y )Nr^  r_  known_ignored_dnabnormal_ignored_dnDOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFORESTz-Unknown initialization data for LDAPBundle().r   r   r   r   r`   r   )r    r!   r   r%   r&   r*   r#   r$   r,   r9  rB  dn_listrA  contextget_dn_list	ExceptionrV   r/   r<   r7   r9   rv   r   r   size)
rB   r   rz  ry  rB  r    r!   counterr   rW   s
             rI   rJ   zLDAPBundle.__init__  s3   		88//XX^^
xx''88// HH11#xx77')^$)+%&+-'(.0*+&"DL]]_ __"==?DL++G4DLKLLDLL))d.>.>,,w'C7s3x#dhh&6&6"778>IC++g(?(??AWXC488(()Q... HA++gk3FGCH$'DLL!qLG DLL))d.>.> C-.dll+%	rK   c                 Z    | j                   s| j                  j                  |dz          yyrD  rE  rF  s     rI   rH  zLDAPBundle.log  s$     zzIIOOC$J' rK   c                 l    t        | j                        | _        t        | j                        | _        y r   )rV   ry  r}  r   )rB   s    rI   update_sizezLDAPBundle.update_size  s"    %	dll+rK   c           	      &   d}| j                   |j                   k7  r9| j                  d| j                   d|j                          | j                  sd}t        | j                  D cg c]  }|j                          c}      }t        |j                  D cg c]  }|j                          c}      }| j                  t        k7  r| j                  s||z
  }|rNd}| j                  d| j                  j                  z         t        |      D ]  }| j                  d|z           ||z
  }|rNd}| j                  d|j                  j                  z         t        |      D ]  }| j                  d|z           ||z  }	| j                  dt        |	      z         |	D ]  }
	 t        | j                  |
| j                  | j                  | j                  | j                         }	 t        |j                  |
|j                  | j                  | j                  | j                         }||k(  r| j                  j$                  r:| j                  d       | j                  d|j&                  d|j                  j                  d       | j                  d|j&                  d|j                  j                  d       | j                  d       n| j                  d       | j                  d|j&                  d|j                  j                  d       | j                  d|j&                  d|j                  j                  d       | j                  |j(                         | j                  d       d}|j                  | _        |j                  |_         |S c c}w c c}w # t"        $ r"}| j                  d	|
d
|       Y d }~9d }~ww xY w# t"        $ r"}| j                  d	|
d
|       Y d }~gd }~ww xY w)NTz!
* DN lists have different size: z != Fz
* DNs found only in %s:r   z
* Objects to be compared: %d)r   rq   r9  rB  r    r!   zLdbError for dn z: z
Comparing:'z' []z    OKz
    FAILED)r}  rH  r,   r   ry  rA  r$   r   r   r+   r   rV   r   r9  rB  r    r!   r
   r*   rq   rZ  )rB   r   rR   rl  self_dns	other_dns	self_onlyrW   
other_only
common_dnsrq   object1r\   object2s                 rI   diffzLDAPBundle.diff  s%   99

"HHTYYPUPZPZ[\''4<<8a	89EMM:q:;	 
*43G3G 9,I4txx}}DE	* *AHHWq[)* #X-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>   (N-N2)AN7-AO%7	O" OO"%	P.PPc                 4   |j                         dk(  r| j                  j                  }n|j                         dk(  r| j                  j                  }n|j                         dk(  r| j                  j                  }nY|j                         dk(  rd| j                  j                  z  }n,|j                         dk(  rd| j                  j
                  z  }g }| j                  s| _        | j                  j                         | _        | j                  dk(  rt        | _        nA| j                  d	k(  rt        | _        n&| j                  d
k(  rt        | _        nt        d      	 | j                  j                  j                  | j                  | j                  dg      }|D ]$  }|j%                  |d   j'                                & |S # t        $ r=}|j                  \  }}| j                   j#                  d| j                  z          d}~ww xY w)z Query 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.
        rt  ru  rv  rw  zDC=DomainDnsZones,%srx  zDC=ForestDnsZones,%sr   BASEONEz0Wrong 'scope' given. Choose from: SUB, ONE, BASErq   rZ   zFailed search of base=%s
N)rA  r   r/   r3   r5   r1   r#   r$   r   r   r   r   r"   rO   r
   ra   r    rA   r   get_linearized)	rB   rz  r#   ry  rR   e3r]   r^   rW   s	            rI   r{  z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
  	5ANN1T71134	5  	77LT4IIOO84;K;KKL	s   )=G 	H8HHc                    t        t        | j                  d               | j                  d<   t        t        | j                  d               | j                  d<   | j                  d   ro| j                  d| j                  j
                  z         | j                  dj                  | j                  d   D cg c]  }t        d|z          c}             | j                  d   rh| j                  d       | j                  dj                  | j                  d   D cg c]  }t        d|z          c}             g | j                  d<   y y c c}w c c}w )Nr^  r_  z
Attributes found only in %s:r   z
    z"
Attributes with different values:)rv   r   r9  rH  r   r+   joinr-   )rB   rW   s     rI   print_summaryzLDAPBundle.print_summaryN  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   r   r   rJ   rH  r  r  r{  r  r   rK   rI   ro  ro    s6    48djjszz%&N(,GR#J0rK   ro  c                      e Zd ZdZdZej                  ej                  ej                  dZ	g dZ
 eddddd	d
       eddddd	d       eddddd	d       edddd	d       edddd	d       edddddgd       ed d!d"d#$       ed%d&d"d'$       ed(d)d*g d+d,       ed-d.d"d/$       ed0d1dd	d2      gZ	 	 	 	 d5d4Zy3)6cmd_ldapcmpz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--tworD   
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   rY  zUDisplay mode for nTSecurityDescriptor results. Possible values: section or collision.)r  r  choicesr  z--baserE   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--scoperF   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                    |j                         }|j                  d      xs |j                  d      }|r|j                  |d      }nd }|j                  |d      }|j	                         r|}n"|j                  d       |j                  d       |r|j                         st        d      g }||r|rdg}nSg d	}nN|||||fD ]D  }||j                         d	vrt        d
|z        |j                  |j                                F |
r|	rt        d      |s|s|r|st        d      t        |||||	|||
|||| j                  | j                  |      }t        |j                        dkD  sJ t        |||||	|||
|||| j                  | j                  |      }t        |j                        dkD  sJ |j!                  d      }d}|D ]Z  } |	s| j                  j#                  d| z         t%        || || j                  | j                        }!t%        || || j                  | j                        }"|!j'                  |"      r"|	r| j                  j#                  d| z         |	s| j                  j#                  d| z         |st        |!j(                  d         t        |"j(                  d         k(  sJ g |"j(                  d<   | j                  j#                  d       | j                  j#                  d       |!j+                          |"j+                          d}] |dk7  rt        d|z        y )NldapT)fallback_machineF)guessr   z3You must supply at least one username/password pairrt  rs  zIncorrect argument: %sz-You cannot set --verbose and --quiet togetherz<You need to specify both --base and --base2 at the same time)rD   r&   r'   r(   r*   r)   rE   rF   r    r!   r,   r   r   z
* Comparing [%s] context...
)rz  rB  r    r!   z
* Result for [%s]: SUCCESS
z
* Result for [%s]: FAILURE
r_  z	
SUMMARY
z
---------
zCompare failed: %d)get_loadparmr   get_credentialsget_credentials2is_anonymous
set_domainset_workstationauthentication_requestedr   rA  r   r   r    r!   rV   r/   rb  rA   ro  r  r9  r  )#rB   r  r  context1context2context3context4context5rD   r&   r*   r'   r(   r)   rE   r  rF   r  r  r  r  r,   r   
using_ldaprC   creds2contextsr   con1con2rB  statusrz  b1b2s#                                      rI   runzcmd_ldapcmp.run  s1    ##%__V,G0G
,,R$,GEE**2U*; Fb!""2&e<<>TUU  %: [(HhG +9wwy$cc&'?!'CDD	*+ uNOOD]^^eRuy 'dU!YYTYYY 4<< 1$$$fbuy 'd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<== rK   )NNNNNFFFFFr   r   r   r   r   NNNF)r   r   r   __doc__synopsisr   SambaOptionsVersionOptionsCredentialsOptionsDoubletakes_optiongroups
takes_argsr   takes_optionsr  r   rK   rI   r  r  \  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>rK   r  )r   r:   r   sambasamba.getoptgetoptr   r   	samba.ndrr   samba.dcerpcr   r"   r   r   r   r	   r
   samba.netcmdr   r   r   compileri   objectr   r   r   ro  r  r   rK   rI   <module>r     s   0 
 	 
      ! W W  2::?@ _v _Dr; r;jg gT	m0 m0`|>' |>rK   