
    b
                     2   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dS )    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dS )LDAPBaseFsection SUBTc                    g }|}d|vr*t           j                            |          rd|z  }nd|z  }|                                                    d          rdg}|| _        || _        t          ||||          | _        |
| _	        || _
        || _        || _        || _        || _        |	| _        || _        || _        || _        t'          | j                                                  | _        t'          | j                                                  | _        t'          | j                                                  | _        t'          | j                                                  | _        |                                 | _        |                                 | _        tA          j!        dd| j                  "                    d	d
          | _#        | $                                | _%        | &                                 | j        r| j        s| j        '                    d| j        z             | j        '                    dd| j        z  z              | j        '                    dd| j        z  z              | j        '                    dd| j        z  z              | j        '                    dd| j#        z  z              d S d S d S )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__-   s    	w~~d## /&-		'$.	??''	22 	534K		9#(*, , ,  !
$"		.4866889948335566TX7799::TX7799::"//11 --//6+r4<@@HHcRR..00  		.DJ 		.IOO9DIEFFFIOOG&A L') ) * * *IOOG&A /'0 0 1 1 1IOOG&B -'. . / / /IOOG&A ,'- - . . . . .		. 		. 		. 		.    c                     | 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   s@    hoo4<<MU_o``(*CF;,?,BCCCrK   c                     | j                             d| j        z  t          ddg          }t	          |          dk    sJ d |D             S )z	
        zOU=Domain Controllers,%sz(objectClass=computer)cn)rE   rF   rM   attrsr   c                 D    g | ]}t          |d          d                   S )rT   r   r-   .0xs     rI   
<listcomp>z)LDAPBase.find_servers.<locals>.<listcomp>l   s&    ---AAdGAJ---rK   )r"   rO   r/   r   lenrQ   s     rI   r8   zLDAPBase.find_serversf   s]     hoo#=#L$1>V_c^d  f f3xx!||||------rK   c                     | j                             d| j        z  t          dg          }t	          |          dk    sJ |D ]}d|v r|d         d         c S d S )NzCN=Partitions,%snETBIOSNamerE   rF   rU   r   )r"   rO   r3   r   r\   )rB   rR   rZ   s      rI   r6   zLDAPBase.find_netbiosn   s    hoo#5#F$1-  J J3xx!|||| 	+ 	+A!!'**** "	+ 	+rK   c                     d }	 | j                             |t                    }n.# t          $ r!}|j        \  }}|t
          k    rY d }~dS  d }~ww xY wt          |          dk    S )N)rE   rF   F   )r"   rO   r   r
   argsr	   r\   )rB   	object_dnrR   e2enumestrs         rI   object_existszLDAPBase.object_existsv   s}    	(//y
/CCCC 	 	 	7LT4)))uuuuu		
 3xx1}s   !& 
AAAAc                     	 | j                             |           d S # t          j        $ r}dt	          |          v sJ Y d }~d S d }~ww xY w)NzNo such object)r"   deleter   r
   r-   )rB   rc   es      rI   delete_forcezLDAPBase.delete_force   sk    	.HOOI&&&&&| 	. 	. 	.#s1vv----------	.s    AAAc                 h    t                               |          }||S |                    d          S )zi Returns the real attribute name
            It resolved ranged results e.g. member;range=0-1499
        Nra   )RE_RANGED_RESULTmatchgroup)rB   keyms      rI   get_attribute_namezLDAPBase.get_attribute_name   s1    
 ""3''9JwwqzzrK   c                    t                               |          }||S |                    d          }t          |                    d                    }	 d||dz   fz  }| j                            |t          |g          }t          |          dk    sJ t          |d                   }|d= d}	d}
|D ]P}t                               |          }||                    d          |k    r9|}	t          ||                   }
 |	n~|
                    |
           |	                    d          d	k    rnOt          |	                    d
                    |dz   k    sJ t          |	                    d                    }2|S )zp Returns list with all attribute values
            It resolved ranged results e.g. member;range=0-1499
        Nra      Tz%s;range=%d-*r_   r   dn*   )rm   rn   ro   intr"   rO   r   r\   dictlistextend)rB   rc   rp   valsrq   attrhinrR   fmfvalss              rI   get_attribute_valueszLDAPBase.get_attribute_values   s   
 ""3''9Kwwqzz__!	"4a.0A(//y
1#/NNCs88q====s1v,,CD	BE  $**3//9771::%%SXzKKxx{{c!!rxx{{##rAv----RXXa[[!!BC!	"F rK   c                 Z   | j                             |t          dg          }t          |          dk    sJ t	          |d                   }|d= i }|                                D ]C\  }}|                     |          }t          |          }|                     |||          ||<   D|S )z: Returns dict with all default visible attributes
        rv   r_   ra   r   ru   )	r"   rO   r   r\   ry   itemsrr   sortedr   )rB   rc   rR   
attributesrp   r|   names          rI   get_attributeszLDAPBase.get_attributes   s     hoo9JseoLL3xx1}}}}3q6llI
 	O 	OIC**3//D$<<D#88CNNJtrK   c                     | j                             |t          dg          }|d         d         d         }t          t          j        |          }|                    | j                  S )NnTSecurityDescriptorr_   r   )r"   rO   r   r   r   r'   as_sddlr?   )rB   rc   rR   descs       rI   get_descriptor_sddlzLDAPBase.get_descriptor_sddl   sY    hoo9JG]F^o__1v,-a0(-t44||DO,,,rK   c                 0   d|z  }g d}d}d}d}|t          |          k     rd}d}|||         k     rt          t          ||                                                 dd          }	dd|	z   |	gt          |	                   }	d|z  t          |          k     r|	|z   }n||	z  }|d	z  }|d	z  }|||         k     ||d
z   z  }|d	z  }|t          |          k     |t          |          k    sJ |                                                    d
d          S )z Translate binary representation of schemaIDGUID to standard string representation.
            @gid_blob: binary schemaIDGUID
        %s)   rw   rw   rw      r   r   0xN0rw   ra    -)r\   hexordr<   strip)
rB   	guid_blobblobstopsindexrR   rZ   tmpycs
             rI   guid_as_stringzLDAPBase.guid_as_string   s;    i#e**nnCAeAh,,DK(())11$;;37A&s1vv.u9s4yy((c'CC1HC
Q eAh,, 39CFA #e**nn D		!!!!yy{{""3,,,rK   c           	      (   i | _         | j                            | j        dt          ddg          }|D ]]}	 t          |d         d                   | j         dt          t          j        |d         d                   z  <   N# t          $ r Y Zw xY wdS )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     hoo4<)8VacsUt  v v 	 	DZ]^bcs^tuv^wZxZxTJx/?kARSTAU$V$VVWW   	 	s   A
B
BBN)__name__
__module____qualname__sysstdoutstderrrJ   r>   r8   r6   rg   rk   rr   r   r   r   r   r@    rK   rI   r   r   +   s         %EUTYbjsz43. 3. 3. 3.jD D D. . .+ + +	 	 	. . .	 	 	2 2 2h  $- - -- - -4
 
 
 
 
rK   r   c                   F    e Zd Zej        ej        fdZd Zd Zd Z	d Z
dS )
Descriptorc                    || _         || _        || _        || _        | j                            | j                  | _        |                                 | _        | j        j        r| j        	                                 d S d S N)
r    r!   conru   r   sddlextract_dacl	dacl_listr(   sort)rB   
connectionru   r    r!   s        rI   rJ   zDescriptor.__init__  s{    		H0099	**,,8 	"N!!!!!	" 	"rK   c                    	 d| j         v r.t          j        d| j                                       d          }n-t          j        d| j                                       d          }n# t          $ r g cY S w xY wt          j        d|          S )zG Extracts the DACL as a list of ACE string (with the brakets).
        zS:zD:(.*?)(\(.*?\))S:rw   zD:(.*?)(\(.*\))z	(\(.*?\)))r   r:   rO   ro   AttributeErrorfindallrQ   s     rI   r   zDescriptor.extract_dacl  s    	ty  i 5tyAAGGJJi 2DI>>DDQGG 	 	 	III	z,,,,s   A$A' 'A65A6c                     d|z  }t          j        d|          }t          |          dk    r|S |D ];}	 | j        j        |         }|                    ||          },# t          $ r Y 8w xY w|S )Nr   z	S-[-0-9]+r   )r:   r   r\   r   r   r<   r   )rB   acerR   sidssidr   s         rI   fix_sidzDescriptor.fix_sid  s    Sjz+s++t99>>J 	 	Cx',kk#t,,    
s   (A
A+*A+c                 x   d}t          | j                  t          |j                  k    r?|dz  }|ddt          | j                  z  z   z  }|ddt          |j                  z  z   z  }d}d}	 d }d }	 d| j        |         z  }n# t          $ r d}Y nw xY w	 d|j        |         z  }n# t          $ r d}Y nw xY wt          |          t          |          z   dk    rnWd|                     |          z  }d|                    |          z  }||k    r||dd	|d
z  }d}n||dd|d
z  }|dz  }||fS )Nr       Difference in ACE count:
        => %s
r   Tr   z>60z * 
Fz | ra   )r\   r   
IndexErrorr   )	rB   otherrR   iflagself_ace	other_aceself_ace_fixedother_ace_fixeds	            rI   diff_1zDescriptor.diff_1+  s   t~#eo"6"66699C7YT^)<)<<<<C7YU_)=)====C	HI$."33    5?1#55		   			8}}s9~~-22!DLL$:$::N"U]]9%=%==O00HHHHFA+	, c{s$   6B BBB+ +B:9B:c                 T    d}t           j                  t          j                  k    r?|dz  }|ddt           j                  z  z   z  }|ddt          j                  z  z   z  }g }g }g } fd j        D             }fdj        D             }|D ]R}	 |                    |           |                    |           .# t          $ r |                    |           Y Ow xY wt          |          }t          |          dk    r%|dd	 j        j        z  z   z  }|D ]}|d|z   d
z   z  }|D ]R}	 |                    |           |                    |           .# t          $ r |                    |           Y Ow xY wt          |          }t          |          dk    r%|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    o|g k    |fS )Nr   r   r   r   c                 :    g | ]}                     |          S r   r   )rY   r   rB   s     rI   r[   z%Descriptor.diff_2.<locals>.<listcomp>V  s%    LLLcS 1 1LLLrK   c                 :    g | ]}                     |          S r   r   )rY   r   r   s     rI   r[   z%Descriptor.diff_2.<locals>.<listcomp>W  s%     O O Os!3!3 O O OrK   r   r   zACEs found only in %s:
r   z    ACEs found in both:
)r\   r   r   append
ValueErrorr   r   r+   rz   setr*   )	rB   r   rR   common_aces	self_aces
other_acesself_dacl_list_fixedother_dacl_list_fixedr   s	   ``       rI   diff_2zDescriptor.diff_2L  s   t~#eo"6"66699C7YT^)<)<<<<C7YU_)=)====C	
LLLLT^LLL O O O Ou O O O' 	( 	(C(%++C00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"233448 	,44C" , ,w}t++R4J"$4c::s$   C

C,+C,;E&&FFN)r   r   r   r   r   r   rJ   r   r   r   r   r   rK   rI   r   r     sn        ,/JSZ " " " "
- 
- 
-    B+; +; +; +; +;rK   r   c                   ^    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d
S )
LDAPObjectc                 X   || _         || _        || _        | j        j        | _        | j        j        | _        | j        j        | _        || _        |                    d| j        j                  | _	        | j	                            dd| j        j
        z            | _	        | j        j        D ]%}| j	                            dd|z            | _	        &| 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| _        d	 | j        D             | _        g d
| _        d | j        D             | _        g d| _        d | j        D             | _        g d| _        d | j        D             | _        ddg| _        d | j        D             | _        t+          d | j        D                       | _        d S )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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-ClaimTypeAppliesToClassc                 6    g | ]}|                                 S r   upperrX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>  s     !H!H!H!''))!H!H!HrK   )proxyAddressesmailuserPrincipalName"msExchSmtpFullyQualifiedDomainNamednsHostNamenetworkAddressdnsRootservicePrincipalNamec                 6    g | ]}|                                 S r   r5  rX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>       %P%P%PAaggii%P%P%PrK   )r  r   CNr   dNSHostNamer>  r#  r  r$  r"  r  c                 6    g | ]}|                                 S r   r5  rX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>  s     )X)X)X!'')))X)X)XrK   )r>  rA  r  r^   r   c                 6    g | ]}|                                 S r   r5  rX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>  s     &R&R&RQqwwyy&R&R&RrK   r   DCc                 6    g | ]}|                                 S r   r5  rX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>  s     $N$N$N1QWWYY$N$N$NrK   c                 6    g | ]}|                                 S r   r5  rX   s     rI   r[   z'LDAPObject.__init__.<locals>.<listcomp>  r@  rK   )r    r!   r   r%   r&   r*   summaryr<   r/   ru   r7   r9   r   r   non_replicated_attributesignore_attributesdn_attributesdomain_attributesservername_attributesnetbios_attributesother_attributesr   )rB   r   ru   rH  filter_listr    r!   rZ   s           rI   rJ   zLDAPObject.__init__{  s   		8/X^
x'**^TX-=>>'//"8'DHD[:[\\& 	H 	HAgoo&97Q;GGDGG(11$'::#*
 #*
 #*
&H "&!?#<"== 	2""k1""!#%'""$ "  4	O"" 'H 'H 'H H"" " " "D" "I!HT5G!H!H!HD&V &V &VD" &Q%P9O%P%P%PD"*^ *^ *^D& *Y)XT=W)X)X)XD&&r&r&rD#&R&R$:Q&R&R&RD#%+T$4D!$N$N8M$N$N$ND!!$%P%P9O%P%P%P!Q!QrK   c                 R    | j         s| j                            |dz              dS dS zE
        Log on the screen if there is no --quiet option set
        r   Nr&   r    rA   rB   msgs     rI   logzLDAPObject.log  s6     z 	'IOOCI&&&&&	' 	'rK   c                    d|z  }| j         s|S |                                                    | j        j                                                  r4|d t          |          t          | j        j                  z
           dz   }|S )Nr   r   )r%   r6  endswithr   r/   r\   rB   srR   s      rI   fix_dnzLDAPObject.fix_dn  s}    Qh 	J99;; 0 6 6 8 899 	J7s3xx#dh&6"7"7778>IC
rK   c                 "   d|z  }| j         s|S |                    | j        j                                        | j        j                                                  }|                    | j        j                                        d          }|S )Nr   z${DOMAIN_NAME})r%   r<   r   r=   r   r6  rY  s      rI   fix_domain_namezLDAPObject.fix_domain_name
  sz    Qh 	Jkk$(.44668L8R8R8T8TUUkk$(.44668HII
rK   c                 "   d|z  }| j         s|S |                    | j        j                                        | j        j                                                  }|                    | j        j                                        d          }|S )Nr   z${DOMAIN_NETBIOS})r%   r<   r   r7   r   r6  rY  s      rI   fix_domain_netbioszLDAPObject.fix_domain_netbios  sz    Qh 	Jkk$(1779948;R;X;X;Z;Z[[kk$(17799;NOO
rK   c                     d|z  }| j         rt          | j        j                  dk    r|S | j        j        D ]*}|                                                    |d          }+|S )Nr   ra   z${SERVER_NAME})r%   r\   r   r9   r6  r<   )rB   rZ  rR   rZ   s       rI   fix_server_namezLDAPObject.fix_server_name  sk    Qh 	3tx'<#=#=#A#AJ& 	; 	;A))++%%a)9::CC
rK   c                 n    | j         j        r|                     |          S |                     |          S r   )r   r'   cmp_desc	cmp_attrs)rB   r   s     rI   __eq__zLDAPObject.__eq__"  s3    8 	(=='''~~e$$$rK   c                    t          | j        | j        | j        | j                  }t          |j        |j        | j        | j                  }| j        j        dk    r|                    |          }n5| j        j        dk    r|                    |          }nt          d          |d         | _	        |d         |_	        |d         S )N)r    r!   r   	collisionzUnknown --view option value.ra   r   )
r   r   ru   r    r!   r)   r   r   	Exceptionscreen_output)rB   r   d1d2rR   s        rI   rc  zLDAPObject.cmp_desc'  s    $'		JJJ	58$)$)LLL8=I%%))B--CCX]k))))B--CC:;;; V!!f1vrK   c                     d}g  _         t          d  j        D                       }t          d j        D                       }||z
  j        z
  }|r%|dd j        j        z  z   z  }|D ]}|d|z   dz   z  }||z
   j        z
  }|r%|ddj        j        z  z   z  }|D ]}|d|z   dz   z  }||z  }d}	 j        D ]}|                                 j        v s|                                |v r5t           j        |         t                    rdt          j        |         t                    rDt           j        |                    j        |<   t          j        |                   j        |<    j        |         j        |         k    rCd }
d }d }d }|                                 j
        v r; fd	 j        |         D             }
fd
j        |         D             }|
|k    r3nY|                                 j        v r> j        |         }j        |         } fd|D             }
fd|D             }|
|k    r|                                 j        v rF|
}|}|
s|s j        |         }j        |         } fd|D             }
fd|D             }|
|k    r|                                 j        v rF|
}|}|
s|s j        |         }j        |         } fd|D             }
fd|D             }|
|k    rO|                                 j        v rF|
}|}|
s|s j        |         }j        |         } fd|D             }
fd|D             }|
|k    r|	r
||	dz   z  }d }	|
r|r|d|z   d|
d|z   dz   z  }n*|d|z   d j        |         dj        |         z   dz   z  } j                             |           |r||k    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 )Nr   c                 6    g | ]}|                                 S r   r5  rY   r}   s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>:  s     CCC4$**,,CCCrK   c                 6    g | ]}|                                 S r   r5  rn  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>;  s     EEED4::<<EEErK   r   zAttributes found only in %s:r   r   z#    Difference in attribute values:c                 b    g | ]+}j         j                            d           d         |k    ,S r   r   r   r=   splitrY   jrB   s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>Y  s6    ]]]Q-33C88;q@]]]rK   c                 b    g | ]+}j         j                            d           d         |k    ,S rq  rr  rY   ru  r   s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>Z  s6    ___a.44S99!<A___rK   c                 :    g | ]}                     |          S r   r[  rt  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>a  s#    333AQ333rK   c                 :    g | ]}                     |          S r   ry  rw  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>b  s#    444Qa444rK   c                 :    g | ]}                     |          S r   r]  rt  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>l  '    <<<Q--a00<<<rK   c                 :    g | ]}                     |          S r   r|  rw  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>m  '    ===a..q11===rK   c                 :    g | ]}                     |          S r   ra  rt  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>x  r}  rK   c                 :    g | ]}                     |          S r   r  rw  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>y  r  rK   c                 :    g | ]}                     |          S r   r_  rt  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>  s'    ???0033???rK   c                 :    g | ]}                     |          S r   r  rw  s     rI   r[   z(LDAPObject.cmp_attrs.<locals>.<listcomp>  s'    @@@11!44@@@rK   z => 
unique_attrsdf_value_attrs)r  r   r   rJ  r   r+   r6  
isinstancerz   r   rO  rK  rL  rM  rN  r   rH  ri  )rB   r   rR   
self_attrsother_attrsself_unique_attrsrZ   other_unique_attrsmissing_attrstitlepqrq   r   s   ``            rI   rd  zLDAPObject.cmp_attrs6  s    CC4?CCCDD
EEE4DEEEFF&4u7NN 	*7;dhmKKKC& * *w{T))(:58NN 	*7;einLLLC' * *w{T))),>>; E	. E	.AwwyyD222aggii=6P6P$/!,d33 B
5CSTUCVX\8]8] B%+DOA,>%?%?"&,U-=a-@&A&A #q!U%5a%888 7799 555]]]]$/Z[J\]]]A____5K[\]K^___AAvv   WWYY$"444*A(+A3333333A4444!444AAvv 7799 666AA 0Q 0 OA.!,Q/<<<<!<<<A====1===AAvv 7799 :::AA 0Q 0 OA.!,Q/<<<<!<<<A====1===AAvv 7799 777AA 0Q 0 OA.!,Q/????Q???A@@@@a@@@AAvv  !54<'C E k k7Q;;111aa)@@4GGCC7Q;;4?1;M;M;MuO_`aObOb)ccfjjjC#**1--- 	;$(:::::^$$$->(?(??$$$%&&&$*==&&&n%%%.@)A)AA%%%&'''4+>>''' !byrK   N)r   r   r   r   r   r   rJ   rV  r[  r]  r_  ra  re  rc  rd  r   rK   rI   r   r   z  s        jsz~R ~R ~R ~R@' ' '        % % %
  f f f f frK   r   c                   P    e Zd Zddej        ej        fdZd Zd Zd Z	d Z
d ZdS )
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|| _        nY|                                dv r4|                                | _        |                     |          | _        nt          d          d}|t!          | j                  k     r| j        r| j        |         }|d t!          |          t!          | j        j                  z
           dz   }|                    d	| j        j        z  d
          }t!          | j        j                  dk    r(| j        j        D ]}	|                    d	|	z  d          }|| j        |<   |dz  }|t!          | j                  k     r| j        t+          t-          | j                            | _        t/          | j                  | _        t!          | j                  | _        d S )Nr  r  known_ignored_dnabnormal_ignored_dnDOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFORESTz-Unknown initialization data for LDAPBundle().r   r   r   r   ra   r   )r    r!   r   r%   r&   r*   r#   r$   r,   rH  rP  dn_listr6  contextget_dn_listrh  r\   r/   r<   r7   r9   rz   r   r   size)
rB   r   r  r  rP  r    r!   counterr   rZ   s
             rI   rJ   zLDAPBundle.__init__  s5   		8/X^
x'8/ H1#x7')^$)+%&+-'(.0*+& 	M"DLL]]__ ___"==??DL++G44DLLKLLLDL))))d.>),w'C7s3xx#dh&6"7"7778>IC++g(??AWXXC48())Q... H HA++gk3FGGCC$'DL!qLG DL))))d.>) C--..dl++%%			rK   c                 R    | j         s| j                            |dz              dS dS rR  rS  rT  s     rI   rV  zLDAPBundle.log  s6     z 	(IOOC$J'''''	( 	(rK   c                 j    t          | j                  | _        t          | j                  | _        d S r   )r\   r  r  r   rB   s    rI   update_sizezLDAPBundle.update_size  s(    %%	dl++rK   c           	         d}| j         |j         k    r.|                     d| j         d|j                    | j        sd}t          d | j        D                       }t          d |j        D                       }| j        t          k    r| j        s||z
  }|rNd}|                     d| j        j        z             t          |          D ]}|                     d|z              ||z
  }|rNd}|                     d|j        j        z             t          |          D ]}|                     d|z              ||z  }|                     d	t          |          z             |D ]}		 t          | j        |	| j        | j        | j        | j        
          }
n2# t           $ r%}|                     d|	d|           Y d }~]d }~ww xY w	 t          |j        |	|j        | j        | j        | j        
          }n2# t           $ r%}|                     d|	d|           Y d }~d }~ww xY w|
|k    r| j        j        r|                     d           |                     d|
j        d|
j        j        d           |                     d|j        d|j        j        d           |                     d           n|                     d           |                     d|
j        d|
j        j        d           |                     d|j        d|j        j        d           |                     |
j                   |                     d           d}|
j        | _        |j        |_        |S )NTz!
* DN lists have different size: z != Fc                 6    g | ]}|                                 S r   r5  rY   r  s     rI   r[   z#LDAPBundle.diff.<locals>.<listcomp>  s     888a		888rK   c                 6    g | ]}|                                 S r   r5  r  s     rI   r[   z#LDAPBundle.diff.<locals>.<listcomp>  s     :::q:::rK   z
* DNs found only in %s:r   z
* Objects to be compared: %d)r   ru   rH  rP  r    r!   zLdbError for dn z: z
Comparing:'z' []z    OKz
    FAILED)r  rV  r,   r   r  r$   r   r   r+   r   r\   r   rH  rP  r    r!   r
   r*   ru   ri  )rB   r   rR   self_dns	other_dns	self_onlyrZ   
other_only
common_dnsru   object1rj   object2s                rI   diffzLDAPBundle.diff  s   9
""HHHTYYYPUPZPZ[\\\' 884<88899::EM:::;;	 
**43G* 9,I *4tx}DEEE	** * *AHHWq[))))"X-J *4uy~EFFF
++ * *AHHWq[))))	)
1C
OOCDDD $	, $	,B$(*-1\151A*.)$)	E E E
    RRR;<<<$	(*-2]151A*.)$)	E E E
    RRR;<<< '!!8# -HH^,,,HHHGJJJ8H8H8HIJJJHHHGJJJ8H8H8HIJJJHH^,,,(((


GK4D4D4DEFFF


GK4D4D4DEFFF.///+,,,"?DL#OEMM
s0   ..F
G'GG.G??
H.	H))H.c                    |                                 dk    r| j        j        }n|                                 dk    r| j        j        }nt|                                 dk    r| j        j        }nO|                                 dk    rd| j        j        z  }n'|                                 dk    rd| j        j        z  }g }| j        s|| _        | j                                         | _        | j        dk    rt          | _        n?| j        d	k    rt          | _        n'| j        d
k    rt          | _        nt          d          	 | j        j                            | j        | j        dg          }n?# t          $ r2}|j        \  }}| j                            d| j        z              d}~ww xY w|D ]/}|                    |d                                                    0|S )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.
        r  r  r  r  zDC=DomainDnsZones,%sr  zDC=ForestDnsZones,%sr   BASEONEz0Wrong 'scope' given. Choose from: SUB, ONE, BASEru   r_   zFailed search of base=%s
N)r6  r   r/   r3   r5   r1   r#   r$   r   r   r   r   r"   rO   r
   rb   r    rA   r   get_linearized)	rB   r  r#   r  rR   e3re   rf   rZ   s	            rI   r  zLDAPBundle.get_dn_list  s    ==??h&&(*KK]]__//(,KK]]__(((,KK]]__++0483CCKK]]__++0483CCK 	+*D -3355%% -D&(( *D%'' .DOPPP	(,%%4+;4CT]a\b%ccCC 	 	 	7LT4IOO84;KKLLL	  	5 	5ANN1T711334444s   -E3 3
F/=-F**F/c                 p   t          t          | j        d                             | j        d<   t          t          | j        d                             | j        d<   | j        d         r_|                     d| j        j        z             |                     d                    d | j        d         D                                  | j        d         r^|                     d           |                     d                    d | j        d         D                                  g | j        d<   d S d S )Nr  r  z
Attributes found only in %s:r   c                 2    g | ]}t          d |z             S z
    rW   rX   s     rI   r[   z,LDAPBundle.print_summary.<locals>.<listcomp>G  s%    \\\!c.1"455\\\rK   z"
Attributes with different values:c                 2    g | ]}t          d |z             S r  rW   rX   s     rI   r[   z,LDAPBundle.print_summary.<locals>.<listcomp>K  s%    ^^^!c.1"455^^^rK   )rz   r   rH  rV  r   r+   joinr  s    rI   print_summaryzLDAPBundle.print_summaryA  s   '+C^0L,M,M'N'N^$)-c$,?O2P.Q.Q)R)R%&<' 	_HH5EFFFHHRWW\\t|N?[\\\]]^^^<() 	0HH:;;;HHRWW^^t|L\?]^^^__```-/DL)***	0 	0rK   )r   r   r   r   r   r   rJ   rV  r  r  r  r  r   rK   rI   r  r    s        48djsz%& %& %& %&N( ( (, , ,G G GR# # #J0 0 0 0 0rK   r  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d3S )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 attibutes onlyz--sort-acesr(   z=Sort ACEs before comparison of nTSecurityDescriptor attributez--viewr)   r   rg  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 comparisionz--skip-missing-dnr,   zCSkip report and failure due to missing DNs in one server or anotherNc                    |                                 }|                    d          p|                    d          }|r|                    |d          }nd }|                    |d          }|                                r|}n*|                    d           |                    d           |r#|                                st          d          g }||r|rdg}nag d	}n\|||||fD ]T}||	                                d	vrt          d
|z            |
                    |	                                           U|
r|	rt          d          |s|s|r|st          d          t          |||||	|||
|||| j        | j        |          }t          |j                  dk    sJ t          |||||	|||
|||| j        | j        |          }t          |j                  dk    sJ |                    d          }d}|D ]T} |	s| j                            d| z             t%          || || j        | j                  }!t%          || || j        | j                  }"|!                    |"          r |	s| j                            d| z             |	s| j                            d| z             |st          |!j        d                   t          |"j        d                   k    sJ g |"j        d<   | j                            d           | j                            d           |!                                 |"                                 d}V|dk    rt          d|z            d S )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)rD   r&   r'   r(   r*   r)   rE   rF   r    r!   r,   r   r   z
* Comparing [%s] context...
)r  rP  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   r6  r   r   r    r!   r\   r/   rs  rA   r  r  rH  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con2rP  statusr  b1b2s#                                      rI   runzcmd_ldapcmp.runt  s2    ##%%__V,,G0G0G
 	,,R$,GGEEE**2U*;;   	'FFb!!!""2&&& 	Ve<<>> 	VTUUU  [ [ %: [ZZ(HhG + +9wwyy$ccc&'?!'CDDD		**** 	Pu 	PNOOO 	_ 	_D 	_ 	_]^^^eRuy 'dU!YTYY Y Y 4<  1$$$$fbuy 'de!YTYY Y Y 4<  1$$$$ll3'' 	 	G M	 AG KLLLD'{!%< < <BD'{!%< < <B wwr{{  -IOO$D$+%, - - -  +IOO$Dw$NOOO% +"2:.>#?@@C
ScHdDeDeeeee79
#34	666	666((***((***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  O  s       %%`H )-4  cbbJ 	tW5u8	: 	: 	:tYW\5G	I 	I 	It[yu@	B 	B 	BvLuA	C 	C 	C};|US	U 	U 	Uxfi)[AYk	m 	m 	mxfbP	R 	R 	Ryw E	F 	F 	Fyw?U?U?UT	V 	V 	Vz"U	W 	W 	W"):<Y^Y	[ 	[ 	[+M4 RVOTCEMR	W> W> W> W> W> 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   compilerm   objectr   r   r   r  r  r   rK   rI   <module>r     s  0 
			 				 



                          ! ! ! ! ! ! W W W W W W W W W W W W W W          2:?@@ W W W W Wv W W Wtr; r; r; r; r; r; r; r;jb b b b b b b bJ	m0 m0 m0 m0 m0 m0 m0 m0`|> |> |> |> |>' |> |> |> |> |>rK   