a
    cl_m                     @   s   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dZG dd	 d	eZG d
d deZG dd deZG dd deZG d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                   @   s   e Zd ZddddddddejejdfddZdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )LDAPBaseFsection SUBTc                 C   s  g }|}d|vr.t j|r&d| }nd| }| drBdg}|| _|| _t||||d| _|
| _	|| _
|| _|| _|| _|| _|	| _|| _|| _|| _t| j | _t| j | _t| j | _t| j | _|  | _|  | _t !dd| j"d	d
| _#| $ | _%| &  | jr| js| j'd| j  | j'dd| j   | j'dd| j   | j'dd| j   | j'dd| j#   d S )Nz://ztdb://%sz	ldap://%szldap://zmodules:paged_searches)ZurlZ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strZget_default_basednbase_dnZget_root_basednroot_dnZget_config_basedn	config_dnZ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'   Zldb_optionsZ	samdb_url r>   6/usr/lib/python3/dist-packages/samba/netcmd/ldapcmp.py__init__-   s`    







zLDAPBase.__init__c                 C   s,   | j j| jdtd}ttj|d d d S )Nz(objectClass=*))r<   
expressionr=   r   	objectSid)r   searchr)   r   r   r   dom_sidr9   resr>   r>   r?   r5   b   s    zLDAPBase.find_domain_sidc                 C   s:   | j jd| j tddgd}t|dks,J dd |D S )z	
        zOU=Domain Controllers,%sz(objectClass=computer)cn)r<   r=   rA   attrsr   c                 S   s   g | ]}t |d  d qS )rG   r   r(   .0xr>   r>   r?   
<listcomp>l       z)LDAPBase.find_servers.<locals>.<listcomp>)r   rC   r)   r   lenrE   r>   r>   r?   r/   f   s
    zLDAPBase.find_serversc                 C   sP   | j jd| j tdgd}t|dks*J |D ]}d|v r.|d d   S q.d S )NzCN=Partitions,%snETBIOSNamer<   r=   rH   r   )r   rC   r+   r   rO   )r9   rF   rL   r>   r>   r?   r-   n   s    zLDAPBase.find_netbiosc              
   C   sl   d }z| j j|td}W nF ty^ } z.|j\}}|tkrHW Y d }~dS  W Y d }~n
d }~0 0 t|dkS )N)r<   r=   F   )r   rC   r   r	   argsr   rO   )r9   	object_dnrF   Ze2enumestrr>   r>   r?   object_existsv   s    
zLDAPBase.object_existsc              
   C   sL   z| j | W n6 tjyF } zdt|v s2J W Y d }~n
d }~0 0 d S )NzNo such object)r   deleter   r	   r(   )r9   rT   er>   r>   r?   delete_force   s    zLDAPBase.delete_forcec                 C   s    t |}|du r|S |dS )zi Returns the real attribute name
            It resolved ranged results e.g. member;range=0-1499
        NrR   )RE_RANGED_RESULTmatchgroup)r9   keymr>   r>   r?   get_attribute_name   s    
zLDAPBase.get_attribute_namec                 C   s  t |}|du r|S |d}t|d}d||d f }| jj|t|gd}t|dksbJ t|d }|d= d}	d}
|D ]<}t |}|du rq|d|krq|}	t	|| }
 qq|	du rʐq|
|
 |	ddkrqt|	d	|d ksJ t|	d}q.|S )
zp Returns list with all attribute values
            It resolved ranged results e.g. member;range=0-1499
        NrR      z%s;range=%d-*rQ   r   dn*   )r[   r\   r]   intr   rC   r   rO   dictlistextend)r9   rT   r^   valsr_   attrhinrF   ZfmZfvalsr>   r>   r?   get_attribute_values   s:    



zLDAPBase.get_attribute_valuesc                 C   st   | j j|tdgd}t|dks$J t|d }|d= i }| D ],\}}| |}t|}| |||||< qB|S )z: Returns dict with all default visible attributes
        rc   rQ   rR   r   rb   )	r   rC   r   rO   rf   itemsr`   sortedrm   )r9   rT   rF   
attributesr^   ri   namer>   r>   r?   get_attributes   s    
zLDAPBase.get_attributesc                 C   s<   | j j|tdgd}|d d d }ttj|}|| jS )NZnTSecurityDescriptorrQ   r   )r   rC   r   r   r   r"   Zas_sddlr6   )r9   rT   rF   Zdescr>   r>   r?   get_descriptor_sddl   s    zLDAPBase.get_descriptor_sddlc           
      C   s   d| }g d}d}d}d}|t |k rd}d}||| k rtt|| dd}	dd|	 |	gt |	 }	d| t |k r|	| }n||	7 }|d	7 }|d	7 }q0||d
 7 }|d	7 }q|t |ksJ | d
dS )z Translate binary representation of schemaIDGUID to standard string representation.
            @gid_blob: binary schemaIDGUID
        %s)   rd   rd   rd      r   r   Z0xN0rd   rR    -)rO   hexordr3   strip)
r9   Z	guid_blobZblobZstopsindexrF   rL   tmpycr>   r>   r?   guid_as_string   s(    


zLDAPBase.guid_as_stringc              	   C   sp   i | _ | jj| jdtddgd}|D ]F}z.t|d d | j dttj|d d  < W q$ t	yh   Y q$0 q$dS )za Build dictionary that maps GUID to 'name' attribute found in Schema or Extended-Rights.
        z(objectSid=*)rB   sAMAccountName)r<   rA   r=   rH   r   rt   N)
sid_mapr   rC   r)   r   r(   r   r   rD   KeyError)r9   rF   itemr>   r>   r?   r7      s    

.zLDAPBase.get_sid_mapN)__name__
__module____qualname__sysstdoutstderrr@   r5   r/   r-   rW   rZ   r`   rm   rr   rs   r   r7   r>   r>   r>   r?   r   +   s   


54r   c                   @   s>   e Zd ZejejfddZdd Zdd Zdd Z	d	d
 Z
dS )
Descriptorc                 C   sH   || _ || _|| _|| _| j| j| _|  | _| jjrD| j	  d S N)
r   r   conrb   rs   sddlextract_dacl	dacl_listr#   sort)r9   
connectionrb   r   r   r>   r>   r?   r@     s    
zDescriptor.__init__c                 C   s\   z8d| j v r"td| j d}ntd| j d}W n tyN   g  Y S 0 td|S )zG Extracts the DACL as a list of ACE string (with the brakets).
        zS:zD:(.*?)(\(.*?\))S:rd   zD:(.*?)(\(.*\))z	(\(.*?\)))r   r1   rC   r]   AttributeErrorfindallrE   r>   r>   r?   r     s    

zDescriptor.extract_daclc              	   C   sb   d| }t d|}t|dkr$|S |D ]4}z| jj| }|||}W q( tyZ   Y q(0 q(|S )Nrt   z	S-[-0-9]+r   )r1   r   rO   r   r   r3   r   )r9   acerF   ZsidsZsidrq   r>   r>   r?   fix_sid  s    zDescriptor.fix_sidc           	      C   s&  d}t | jt |jkrL|d7 }|ddt | j  7 }|ddt |j  7 }d}d}d }d }zd| j|  }W n ty   d}Y n0 zd|j|  }W n ty   d}Y n0 t |t | dkrȐqd| | }d|| }||kr|d||f 7 }d	}n|d
||f 7 }|d7 }qT||fS )Nr       Difference in ACE count:
        => %s
r   Trt   z
%60s * %s
Fz
%60s | %s
rR   )rO   r   
IndexErrorr   )	r9   otherrF   iflagZself_aceZ	other_aceZself_ace_fixedZother_ace_fixedr>   r>   r?   diff_1+  s6    



zDescriptor.diff_1c           	   	      s  d}t jt  jkrL|d7 }|ddt j  7 }|ddt  j  7 }g }g }g }fddjD } fdd jD }|D ]:}z|| W n ty   || Y q0 || qt|}t |dkr|d	d
jj  7 }|D ]}|d| d 7 }q|D ]>}z|| W n ty8   || Y n0 || qt|}t |dkr|d	d
 jj  7 }|D ]}|d| d 7 }qvttt	|}jj
r|d7 }|D ]}|d| d 7 }q|g ko|g k|fS )Nr   r   r   r   c                    s   g | ]}  |qS r>   r   rK   r   r9   r>   r?   rM   V  rN   z%Descriptor.diff_2.<locals>.<listcomp>c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   W  rN   r   r   zACEs found only in %s:

z    ACEs found in both:
)rO   r   r}   
ValueErrorappendro   r   r&   rg   setr%   )	r9   r   rF   Zcommon_acesZ	self_acesZ
other_acesZself_dacl_list_fixedZother_dacl_list_fixedr   r>   r   r9   r?   diff_2L  sL    
zDescriptor.diff_2N)r   r   r   r   r   r   r@   r   r   r   r   r>   r>   r>   r?   r     s
   
!r   c                   @   s^   e Zd ZejejfddZdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd ZdS )
LDAPObjectc                 C   s  || _ || _|| _| jj| _| jj| _| jj| _|| _|d| jj| _	| j	dd| jj
 | _	| jjD ]}| j	dd| | _	qh| j| j	| _g d| _| j| _|  jdg7  _|r|  j|7  _g | _g | _g | _g | _g | _| jr|  jg d7  _g d| _d	d
 | jD | _g d| _dd
 | jD | _g d| _dd
 | jD | _g d| _dd
 | jD | _ddg| _dd
 | jD | _tdd
 | jD | _d S )N${DOMAIN_DN}CN=${DOMAIN_NETBIOS}CN=%sCN=${SERVER_NAME}) ZbadPasswordTimebadPwdCountZdSCorePropagationDataZ
lastLogoffZ	lastLogonZ
logonCountmodifiedCountzmsDS-Cached-Membershipz!msDS-Cached-Membership-Time-StampzmsDS-EnabledFeatureBLzmsDS-ExecuteScriptPasswordzmsDS-NcTypezmsDS-ReplicationEpochzmsDS-RetiredReplNCSignatureszmsDS-USNLastSyncSuccessZpartialAttributeDeletionListZpartialAttributeSetZpekListZ	prefixMapZreplPropertyMetaDataZreplUpToDateVectorZrepsFromZrepsToZ
rIDNextRIDZrIDPreviousAllocationPoolZschemaUpdateZserverStatesubRefsZ
uSNChanged
uSNCreatedZuSNLastObjRemwhenChangedZmsExchServer1HighestUSN)#ZobjectCategoryZ
objectGUIDrB   ZwhenCreatedr   Z
pwdLastSetr   ZcreationTimer   ZpriorSetTimeZrIDManagerReferenceZgPLinkZipsecNFAReferenceZfRSPrimaryMemberZfSMORoleOwnerZ
masteredByZipsecOwnersReferenceZwellKnownObjectsZotherWellKnownObjectsr   ZipsecISAKMPReferenceZipsecFilterReferencezmsDs-masteredByZlastSetTimeZipsecNegotiationPolicyReferencer   ZgPCFileSysPathZaccountExpiresZinvocationIdZoperatingSystemVersionZoEMInformationZ
schemaInfoZtargetAddressZmsExchMailboxGuidZsiteFolderGUID)&distinguishedNameZdefaultObjectCategorymemberZmemberOfZsiteListZnCNameZhomeMDBZhomeMTAinterSiteTopologyGeneratorserverReferencezmsDS-HasInstantiatedNCsZhasMasterNCszmsDS-hasMasterNCszmsDS-HasDomainNCsZdMDLocationmsDS-IsDomainForrIDSetReferencesserverReferenceBLZmsExchHomeRoutingGroupZmsExchResponsibleMTAServerZsiteFolderServerZmsExchRoutingMasterDNZmsExchRoutingGroupMembersBLZ	homeMDBBLZmsExchHomePublicMDBZmsExchOwningServerZtemplateRootsZaddressBookRootsZmsExchPolicyRootsZglobalAddressListZmsExchOwningPFTreeZmsExchResponsibleMTAServerBLZmsExchOwningPFTreeBLz$msDS-MembersOfResourcePropertyListBLzmsDS-ValueTypeReferencez"msDS-MembersOfResourcePropertyListzmsDS-ValueTypeReferenceBLzmsDS-ClaimTypeAppliesToClassc                 S   s   g | ]}|  qS r>   upperrJ   r>   r>   r?   rM     rN   z'LDAPObject.__init__.<locals>.<listcomp>)ZproxyAddressesZmailZuserPrincipalNameZ"msExchSmtpFullyQualifiedDomainNameZdnsHostNameZnetworkAddressZdnsRootservicePrincipalNamec                 S   s   g | ]}|  qS r>   r   rJ   r>   r>   r?   rM     rN   )r   rq   CNr   ZdNSHostNamer   r   r   r   r   r   c                 S   s   g | ]}|  qS r>   r   rJ   r>   r>   r?   rM     rN   )r   r   r   rP   rq   c                 S   s   g | ]}|  qS r>   r   rJ   r>   r>   r?   rM     rN   rq   ZDCc                 S   s   g | ]}|  qS r>   r   rJ   r>   r>   r?   rM     rN   c                 S   s   g | ]}|  qS r>   r   rJ   r>   r>   r?   rM     rN   )r   r   r   r    r!   r%   summaryr3   r)   rb   r.   r0   rr   rp   Znon_replicated_attributesignore_attributesdn_attributesdomain_attributesservername_attributesnetbios_attributesother_attributesr   )r9   r   rb   r   filter_listr   r   rL   r>   r>   r?   r@   {  sF    



$




zLDAPObject.__init__c                 C   s   | j s| j|d  dS zE
        Log on the screen if there is no --quiet option set
        r   Nr!   r   r8   r9   msgr>   r>   r?   log  s    zLDAPObject.logc                 C   sL   d| }| j s|S | | jj rH|d t|t| jj  d }|S )Nrt   r   )r    r   endswithr   r)   rO   r9   srF   r>   r>   r?   fix_dn  s     zLDAPObject.fix_dnc                 C   sF   d| }| j s|S || jj | jj }|| jj d}|S )Nrt   z${DOMAIN_NAME})r    r3   r   r4   r   r   r   r>   r>   r?   fix_domain_name
  s    zLDAPObject.fix_domain_namec                 C   sF   d| }| j s|S || jj | jj }|| jj d}|S )Nrt   z${DOMAIN_NETBIOS})r    r3   r   r.   r   r   r   r>   r>   r?   fix_domain_netbios  s    zLDAPObject.fix_domain_netbiosc                 C   sD   d| }| j rt| jjdkr"|S | jjD ]}| |d}q*|S )Nrt   rR   z${SERVER_NAME})r    rO   r   r0   r   r3   )r9   r   rF   rL   r>   r>   r?   fix_server_name  s    zLDAPObject.fix_server_namec                 C   s   | j jr| |S | |S r   )r   r"   cmp_desc	cmp_attrs)r9   r   r>   r>   r?   __eq__"  s    
zLDAPObject.__eq__c                 C   s   t | j| j| j| jd}t |j|j| j| jd}| jjdkrH||}n | jjdkr`||}ntd|d | _	|d |_	|d S )N)r   r   r   	collisionzUnknown --view option value.rR   r   )
r   r   rb   r   r   r$   r   r   	Exceptionscreen_output)r9   r   Zd1Zd2rF   r>   r>   r?   r   '  s    

zLDAPObject.cmp_descc                    s6  d}g _ tdd jD }tdd  jD }||  j }|rr|ddjj  7 }|D ]}|d| d 7 }q\|| j }|r|dd jj  7 }|D ]}|d| d 7 }q||@ }d	}	jD ]}| jv s| |v rqtj| tr2t j| tr2t	j| j|< t	 j|  j|< j|  j| krd }
d }d }d }| j
v rfd
dj| D }
 fdd j| D }|
|krqnh| jv r|
}|}|
s|s܈j| } j| }fdd|D }
 fdd|D }|
|krq| jv rt|
}|}|
sD|sDj| } j| }fdd|D }
 fdd|D }|
|krtq| jv r|
}|}|
s|sj| } j| }fdd|D }
 fdd|D }|
|krq| jv rD|
}|}|
s|sj| } j| }fdd|D }
 fdd|D }|
|krDq|	rZ||	d 7 }d }	|
r|r|d| d|
|f  d 7 }n(|d| dj|  j| f  d 7 }j | q|r||ksJ jd  t|7  < jd  j 7  <  jd  t|7  <  jd  j 7  < |_| _|dkS )Nr   c                 S   s   g | ]}|  qS r>   r   rK   rj   r>   r>   r?   rM   :  rN   z(LDAPObject.cmp_attrs.<locals>.<listcomp>c                 S   s   g | ]}|  qS r>   r   r   r>   r>   r?   rM   ;  rN   r   zAttributes found only in %s:r   r   z#    Difference in attribute values:c                    s"   g | ]} j jd d |kqS r   r   r   r4   splitrK   jr   r>   r?   rM   Y  rN   c                    s"   g | ]} j jd d |kqS r   r   r   r   r>   r?   rM   Z  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   d  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   e  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   o  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   p  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   {  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM   |  rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM     rN   c                    s   g | ]}  |qS r>   r   r   r   r>   r?   rM     rN   z
 => 
%s
%sunique_attrsdf_value_attrs)r   r   rp   r   r   r&   r   
isinstancerg   ro   r   r   r   r   r   r   r   r   )r9   r   rF   Z
self_attrsZother_attrsZself_unique_attrsrL   Zother_unique_attrsZmissing_attrstitlepqr_   rl   r>   r   r?   r   6  s    $












(zLDAPObject.cmp_attrsN)r   r   r   r   r   r   r@   r   r   r   r   r   r   r   r   r>   r>   r>   r?   r   z  s   
 r   c                   @   sJ   e Zd ZddejejfddZdd Zdd Zdd	 Z	d
d Z
dd ZdS )
LDAPBundleNc           
      C   s  || _ || _|| _| 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|| _n,| dv r| | _| || _ntdd}|t| jk rZ| jrZ| j| }|d t|t| jj  d }|d	| jj d
}t| jjdkrF| jjD ]}	|d	|	 d}q.|| j|< |d7 }qtt| j| _t| j| _t| j| _d S )Nr   r   Zknown_ignored_dnZabnormal_ignored_dnDOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFORESTz-Unknown initialization data for LDAPBundle().r   r   r   r   rR   r   )r   r   r   r    r!   r%   r   r   r'   r   r   dn_listr   contextget_dn_listr   rO   r)   r3   r.   r0   rg   r   ro   size)
r9   r   r   r   r   r   r   Zcounterr~   rL   r>   r>   r?   r@     sD    











 

zLDAPBundle.__init__c                 C   s   | j s| j|d  dS r   r   r   r>   r>   r?   r     s    zLDAPBundle.logc                 C   s   t | j| _t| j| _d S r   )rO   r   r   ro   r   r>   r>   r?   update_size  s    zLDAPBundle.update_sizec                 C   s  d}| j |j kr0| d| j |j f  | js0d}tdd | jD }tdd |jD }| jtkr| js|| }|rd}| d| jj  t	|D ]}| d|  q|| }|rd}| d|jj  t	|D ]}| d|  q||@ }| d	t
|  |D ]}	z"t| j|	| j| j| j| jd
}
W nF typ } z,| d|	|f  W Y d }~qW Y d }~n
d }~0 0 z"t|j|	|j| j| j| jd
}W nF ty } z,| d|	|f  W Y d }~qW Y d }~n
d }~0 0 |
|kr6| jjr| d | d|
j|
jjf  | d|j|jjf  | d nT| d | d|
j|
jjf  | d|j|jjf  | |
j | d d}|
j| _|j|_q|S )NTz)
* DN lists have different size: %s != %sFc                 S   s   g | ]}|  qS r>   r   rK   r   r>   r>   r?   rM     rN   z#LDAPBundle.diff.<locals>.<listcomp>c                 S   s   g | ]}|  qS r>   r   r   r>   r>   r?   rM     rN   z
* DNs found only in %s:r   z
* Objects to be compared: %d)r   rb   r   r   r   r   zLdbError for dn %s: %sz
Comparing:z	'%s' [%s]z    OKz
    FAILED)r   r   r'   r   r   r   r   r   r&   ro   rO   r   r   r   r   r   r	   r%   rb   r   )r9   r   rF   Zself_dnsZ	other_dnsZ	self_onlyrL   Z
other_onlyZ
common_dnsrb   Zobject1rY   Zobject2r>   r>   r?   diff  st    

$
$




zLDAPBundle.diffc           	   
   C   sT  |  dkr| jj}n^|  dkr,| jj}nH|  dkrB| jj}n2|  dkr\d| jj }n|  dkrtd| jj }g }| js|| _| j  | _| jdkrt| _n,| jd	krt	| _n| jd
krt
| _ntdz| jjj| j| jdgd}W nD ty0 } z*|j\}}| jd| j   W Y d}~n
d}~0 0 |D ]}||d   q6|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, BASErb   rQ   zFailed search of base=%s
N)r   r   r)   r+   r,   r*   r   r   r   r   r   r   r   rC   r	   rS   r   r8   r   Zget_linearized)	r9   r   r   r   rF   Ze3rU   rV   rL   r>   r>   r?   r     s<    






zLDAPBundle.get_dn_listc                 C   s   t t| jd | jd< t t| jd | jd< | jd rl| d| jj  | ddd | jd D  | jd r| d | ddd | jd D  g | jd< d S )	Nr   r   z
Attributes found only in %s:r   c                 S   s   g | ]}t d | qS z
    rI   rJ   r>   r>   r?   rM   J  rN   z,LDAPBundle.print_summary.<locals>.<listcomp>z"
Attributes with different values:c                 S   s   g | ]}t d | qS r   rI   rJ   r>   r>   r?   rM   N  rN   )rg   r   r   r   r   r&   joinr   r>   r>   r?   print_summaryD  s    
 

 zLDAPBundle.print_summary)r   r   r   r   r   r   r@   r   r   r   r   r   r>   r>   r>   r?   r     s   
'I%r   c                   @   s   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
deddddd	dded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gdded d!d"d#d$ed%d&d"d'd$ed(d)d*g d+d,ded-d.d"d/d$ed0d1dd	d2dgZd6d4d5Zd3S )7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--twor;   
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   r   zUDisplay mode for nTSecurityDescriptor results. Possible values: section or collision.)r  r  choicesr  z--baser<   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--scoper=   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           #      C   s  |  }|dp|d}|r0|j|dd}nd }|j|dd}| rP|}n|d |d |rx| sxtdg }|d u r|r|rdg}qg d	}nD|||||fD ]4}|d u rq|	 d	vrtd
| |
|	  q|
r|	rtd|s|s|r|stdt|||||	|||
|||| j| j|d}t|jdksLJ t|||||	|||
|||| j| j|d}t|jdksJ |d}d}|D ]} |	s| jd|   t|| || j| jd}!t|| || j| jd}"|!|"r|	sx| jd|   nt|	st| jd|   |stt|!jd t|"jd ksBJ g |"jd< | jd | jd |!  |"  d}q|dkrtd| d S )NZldapT)Zfallback_machineF)Z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)r;   r!   r"   r#   r%   r$   r<   r=   r   r   r'   r   r   z
* Comparing [%s] context...
)r   r   r   r   z
* Result for [%s]: SUCCESS
z
* Result for [%s]: FAILURE
r   z	
SUMMARY
z
---------
zCompare failed: %d)Zget_loadparmr   Zget_credentialsZget_credentials2Zis_anonymousZ
set_domainZset_workstationZauthentication_requestedr   r   r   r   r   r   rO   r)   r   r8   r   r   r   r   )#r9   r   r  Zcontext1Zcontext2Zcontext3Zcontext4Zcontext5r;   r!   r%   r"   r#   r$   r<   r  r=   r	  r   r   r   r'   r   Z
using_ldapr:   Zcreds2Zcontextsr   Zcon1Zcon2r   Zstatusr   Zb1Zb2r>   r>   r?   runw  s    





"

zcmd_ldapcmp.run)NNNNNFFFFFr   r   r   r   r   NNNF)r   r   r   __doc__Zsynopsisr   ZSambaOptionsZVersionOptionsZCredentialsOptionsDoubleZtakes_optiongroupsZ
takes_argsr   Ztakes_optionsr  r>   r>   r>   r?   r   R  s\   


    r   )r   r1   r   ZsambaZsamba.getoptZgetoptr   r   Z	samba.ndrr   Zsamba.dcerpcr   r   r   r   r   r   r	   Zsamba.netcmdr
   r   r   compiler[   objectr   r   r   r   r   r>   r>   r>   r?   <module>   s&   
 [u  * 1