a
    I_H                     @   s   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m	Z	 d dl
mZmZmZmZmZmZ G dd deZd	d
 ZdddZdd ZdddZdddZdd Zdd ZdS )    N)LdbError)werror)
ndr_unpack)miscdnsp)DNS_TYPE_NS
DNS_TYPE_ADNS_TYPE_AAAADNS_TYPE_CNAMEDNS_TYPE_SRVDNS_TYPE_PTRc                   @   s    e Zd ZdZdd Zdd ZdS )DemoteExceptionzBase element for demote errorsc                 C   s
   || _ d S Nvalue)selfr    r   1/usr/lib/python3/dist-packages/samba/remove_dc.py__init__    s    zDemoteException.__init__c                 C   s
   d| j  S )NzDemoteException: r   )r   r   r   r   __str__#   s    zDemoteException.__str__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c           
      C   s  |   }dd| fD ]}t| |}||  dkrJtd||  f |ddkrdtd| |dd| z|d	|  | 	| W q tj
y } z$|j\}}|tjkrn W Y d }~qd }~0 0 qd
D ]}t| |}||  dkrtd||  f |ddkr,td||f |dd| z|d	|  | 	| W q tj
y }	 z&|	j\}}|tjkrn W Y d }	~	qd }	~	0 0 qd S )Nz3CN=Enterprise,CN=Microsoft System Volumes,CN=Systemz+CN=%s,CN=Microsoft System Volumes,CN=SystemFz+Failed constructing DN %s by adding base %szCN=Xz.Failed constructing DN %s by adding child CN=Xr   CNzRemoving Sysvol reference: %s)zMCN=Domain System Volumes (SYSVOL share),CN=File Replication Service,CN=SystemzDCN=Topology,CN=Domain System Volume,CN=DFSR-GlobalSettings,CN=SystemzAFailed constructing DN %s by adding child CN=X (soon to be CN=%s))domain_dns_nameldbDnadd_baseget_config_basednr   Z	add_childZset_componentinfodeleter   argsERR_NO_SUCH_OBJECTget_default_basedn)
samdbloggerdc_nameZrealmsdneenumestrZe1r   r   r   remove_sysvol_references'   sR    




r-   Fc                    s  j dtjdg dgd}t|dkr(d S | }z|\}W nr ty } zZ|j\}}	|tj	ksp|tj
kr|rt||| W Y d }~d S td||	f W Y d }~n
d }~0 0 |g  j dtjdgd}
t|
d	ksJ |
d d }fd
dtfdd|D }fdd |D ]}z |d|  |\}}W n\ ty } zB|j\}}	|tj	krW Y d }~ d S td||	f W Y d }~n
d }~0 0 t|} fdd|D }t||kr$|d|t||t| f  || q$t||| d S )N z.(&(objectClass=dnsZone)(!(dc=RootDNSServers)))search_options:0:2)basescope
expressionattrscontrolsr   zlookup of %s failed: %sZnamingContextsr1   r3      c                    s   t  |  ddd S )N/r6   r   )r   r   Zcanonical_strsplit)r)   )r%   r   r   dns_name_from_dn   s    z/remove_dns_references.<locals>.dns_name_from_dnc                 3   s   | ]} t |V  qd S r   )str).0r)   )r9   r   r   	<genexpr>       z(remove_dns_references.<locals>.<genexpr>c                    s@   | j tks| j tkr< D ]"}|j | j kr|j| jkr dS qdS NTF)wTyper   r	   data)	dnsRecordZrec)primary_recsr   r   a_rec_to_remove   s
    z.remove_dns_references.<locals>.a_rec_to_removez(checking for DNS records to remove on %sc                    s   g | ]} |s|qS r   r   )r;   r)rC   r   r   
<listcomp>   r=   z)remove_dns_references.<locals>.<listcomp>1updating %s keeping %d values, removing %s values)searchr   SCOPE_SUBTREElenupperZ
dns_lookupRuntimeErrorr"   r   Z"WERR_DNS_ERROR_NAME_DOES_NOT_EXISTZWERR_DNS_ERROR_RCODE_NAME_ERRORremove_hanging_dns_referencesr   Zdns_replace
SCOPE_BASEsetdebugr    )r%   r&   dnsHostNameZignore_no_namezonesdnsHostNameUpperr)   Ze4r+   r,   resZncsZa_names_to_remove_fromZa_nameZa_rec_dnZa_recsZe2Zorig_num_recsr   )rC   r9   rB   r%   r   remove_dns_referencesZ   sb    


&

&rT   c           	   
      s    fdd|D ]}| d|j  | j|jtjddgd}|D ]~}z|d }W n tyf   Y q@Y n0 fdd|D }t|t|kr@|d	|jt|t|t| f  | |j| q@qd S )
Nc                    s`   t tj| }|jtks*|jtks*|jtkr>|j  kr\dS n|jt	kr\|jj
  kr\dS dS r>   )r   r   DnssrvRpcRecordr?   r   r
   r   r@   rJ   r   Z
nameTarget)r   rA   )rR   r   r   	to_remove   s    

z0remove_hanging_dns_references.<locals>.to_removezchecking %sz/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))rA   )r0   r1   r2   r3   c                    s    g | ]} |st tj|qS r   )r   r   rU   )r;   v)rV   r   r   rE      s   
z1remove_hanging_dns_references.<locals>.<listcomp>rF   )	rO   r)   rG   r   rH   KeyErrorrI   r    Zdns_replace_by_dn)	r%   r&   rR   rQ   ZzoneZrecordsrecordZorig_valuesvaluesr   )rR   rV   r   rL      s,    


rL   c                 C   s:  | j dtjdgd}t|dks$J |d d d }	| j |g dtjdd}
|
d }t|d	 d }zt| |d
 d d}W n ty   d }Y n0 zt|d d }W n ty   d }Y n0 |r| |dg |d ur| j |dg dtjd}d|d v r4t|d d d }|	d|  | | d|d v rnt|d d d }|	d|  | | |r|	d|  | |dg d|v rt|d d }|r| j dt
||f g tj|  d}t|dkr|	d|d j  | |d j |d ur$|r$t| || |r6t| || d S )Nr.   dsServiceNamer5   r6   r   )serverReferencecnrP   z(objectClass=server)r0   r3   r1   r2   r]   r\   utf8rP   tree_delete:0zobjectclass=computer)msDS-KrbTgtLinkrIDSetReferencesr]   r0   r2   r3   r1   rb   zRemoving RID Set: %sra   zRemoving RODC KDC account: %sz5Removing computer account: %s (and any child objects)z=(&(objectclass=user)(cn=dns-%s)(servicePrincipalName=DNS/%s)))r2   r3   r1   r0   z/Removing Samba-specific DNS service account: %s)rG   r   rM   rI   r:   r   decoderX   r!   r    binary_encoderH   r$   r)   rT   r-   )r%   r&   	server_dnremove_computer_objremove_server_objremove_sysvol_objremove_dns_namesremove_dns_accountrS   my_serviceNamemsgsmsgr'   Zcomputer_dnrP   Zcomputer_msgsZ
rid_set_dnZkrbtgt_link_dnr   r   r   offline_remove_server   sn    





ro   c
              
   C   s^  | j dtjdgd}
t|
dks$J t| |
d d d d}| }||kr^td| z| j |dd	gtjd
}W nH ty } z0|j	\}}|tj
krtd| n W Y d }~n
d }~0 0 t|dkrtd||  f |d }|j dks
|j dkrtd| ttj|d	 d }|rn| j |  d| d}|D ]"}|d|j  | |j qJ|r| j dtjd| dgd}|D ]P}t|}t }|j|_t|tjd|d< |d|j|f  | | qz |d|  | |dg W n< ty@ } z"|j	\}}td| W Y d }~n
d }~0 0 t| |||||||	d d S )Nr.   r[   r5   r6   r   r_   z#Refusing to demote our own DSA: %s zobjectClass=ntdsDSAZ
objectGUIDrc   zGiven DN %s doesn't existz%s is not an ntdsda in %sr   zNTDS Settingsz)Given DN (%s) wasn't the NTDS Settings DNz5(&(objectclass=nTDSConnection)(fromServer=<GUID=%s>)))r0   r2   zRemoving nTDSConnection: %sz(fsmoRoleOwner=<GUID=%s>))r/   )r0   r1   r2   r4   ZfsmoRoleOwnerr   z*Seizing FSMO role on: %s (now owned by %s)z'Removing nTDSDSA: %s (and any children)r`   z,Failed to remove the DCs NTDS DSA object: %srg   rh   ri   rj   rk   )rG   r   rM   rI   r   rd   parentr   r   r"   r#   r   r)   Zget_rdn_nameZget_rdn_valuer   r   ZGUIDr   r    r!   rH   r:   ZMessageZMessageElementZFLAG_MOD_REPLACEZwarningZmodifyro   )r%   r&   ntds_dnrg   rh   remove_connection_objseize_stale_fsmori   rj   rk   rS   rl   rf   rm   Ze5r+   r,   rn   	ntds_guidZstale_connectionsZconnZstale_fsmo_rolesZrolevalmZe6r   r   r   offline_remove_ntds_dc!  s    








rx   c                 C   s  |    d }ztj|d}d| }W n ty   z"| j|  g dt| d}W nD ty } z,|j	\}}	t
d||  |	f W Y d }~n
d }~0 0 t|dkr|   t
d||  f |d j}t| d}|| Y n0 z| j|g tjd	d
}
W n` ty` } zF|j	\}}	|tjkr.g }
n|   t
d||  |	f W Y d }~n
d }~0 0 t|
dkr|d u r|   t
d||  f t| ||dddddd n"t| ||
d jdddddddd
 |   d S )N)hexz	<GUID=%s>z(&(objectClass=server)(cn=%s)))r0   r3   r2   z4Failure checking if %s is an server object in %s: %sr   z%s is not an AD DC in %szCN=NTDS Settingsz(objectClass=ntdsdsa)r^   z/Failure checking if %s is an NTDS DSA in %s: %sTrp   )rg   rh   rs   rt   ri   rj   rk   )Ztransaction_startuuidZUUID
ValueErrorrG   r   r   re   r   r"   r   r   rI   Ztransaction_cancelr)   r   r   rM   r#   ro   rx   Ztransaction_commit)r%   r&   r'   rf   ru   rr   Zserver_msgsZe3r+   r,   Z	ntds_msgsZe7r   r   r   	remove_dcv  s    










r|   c                 C   s    |    t| |d  |   d S r   )Zstart_transactionrx   Zcommit_transaction)r%   rr   r   r   r    offline_remove_dc_RemoveDsServer  s    r}   )F)FFFFF)FFFFFFF)rz   r   r   Zsambar   Z	samba.ndrr   Zsamba.dcerpcr   r   Zsamba.dcerpc.dnspr   r   r	   r
   r   r   	Exceptionr   r-   rT   rL   ro   rx   r|   r}   r   r   r   r   <module>   s4    
3
P-     
O       
UP