
    bH                         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e          Zd	 ZddZd Z	 	 	 	 	 ddZ	 	 	 	 	 	 	 ddZd Z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                       e Zd ZdZd Zd ZdS )DemoteExceptionzBase element for demote errorsc                     || _         d S Nvalue)selfr   s     1/usr/lib/python3/dist-packages/samba/remove_dc.py__init__zDemoteException.__init__    s    


    c                     d| j         z   S )NzDemoteException: r   )r   s    r   __str__zDemoteException.__str__#   s    "TZ//r   N)__name__
__module____qualname____doc__r   r    r   r   r   r      s8        ((  0 0 0 0 0r   r   c                    |                                  }dd|z  fD ]}t          j        | |          }|                    |                                           dk    r't          d|d|                                           |                    d          dk    rt          d|z            |                    dd	|           	 |                    d
|z             | 	                    |           # t          j
        $ r'}|j        \  }}|t          j        k    rn Y d }~d }~ww xY wdD ]}t          j        | |          }|                    |                                           dk    r't          d|d|                                           |                    d          dk    rt          d|d|d          |                    dd	|           	 |                    d
|z             | 	                    |           # t          j
        $ r'}	|	j        \  }}|t          j        k    rn Y d }	~	d }	~	ww xY wd S )Nz3CN=Enterprise,CN=Microsoft System Volumes,CN=Systemz+CN=%s,CN=Microsoft System Volumes,CN=SystemFzFailed constructing DN z by adding base z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=Systemz% by adding child CN=X (soon to be CN=))domain_dns_nameldbDnadd_baseget_config_basednr   	add_childset_componentinfodeleter   argsERR_NO_SUCH_OBJECTget_default_basedn)
samdbloggerdc_namerealmsdneenumestre1s
             r   remove_sysvol_referencesr8   '   s   !!##EC;eCE  VE1 ;;u..0011U::!/%'RR)@)@)B)B)B#D E E E<<5((!"R%'#) * * *
D'***	KK7"<===LL| 	 	 	6LT4s--- 	V   VE1;;u//1122e;;!/%'RR)A)A)C)C)C#E F F F<<5((!/?Arr777#L M M M
D'***	KK7"<===LL| 	 	 	7LT4s--- 	! s0   	-C77D-D((D-#-HI IIFc           
                                dt          j        dg dg          }t          |          dk    rd S |                                }	                      |          \  }nk# t          $ r^}|j        \  }}	|t          j	        k    s|t          j
        k    r|rt           |||           Y d }~d S t          d|d|	          d }~ww xY w                     |g                                  dt          j        dg	          }
t          |
          d
k    sJ |
d         d         } fdt          fd|D                       }fd|D ]}	 |                    d|z                                  |          \  }}nH# t          $ r;}|j        \  }}	|t          j	        k    rY d }~ d S t          d|d|	          d }~ww xY wt          |          }fd|D             }t          |          |k    rN|                    d|t          |          |t          |          z
  fz                                  ||           t           |||           d S )N z.(&(objectClass=dnsZone)(!(dc=RootDNSServers)))search_options:0:2)basescope
expressionattrscontrolsr   z
lookup of z	 failed: namingContextsr=   r?      c                     t          j        |                                                               dd          d         S )N/rC   r   )r#   r$   canonical_strsplit)r3   r.   s    r   dns_name_from_dnz/remove_dns_references.<locals>.dns_name_from_dn   s8     veR  ..0066sA>>qAAr   c              3   H   K   | ]} t          |                    V  d S r   )str).0r3   rH   s     r   	<genexpr>z(remove_dns_references.<locals>.<genexpr>   s5      66Bs2ww''666666r   c                     | j         t          k    s| j         t          k    r(D ]%}|j         | j         k    r|j        | j        k    r dS &dS NTF)wTyper	   r
   data)	dnsRecordrecprimary_recss     r   a_rec_to_removez.remove_dns_references.<locals>.a_rec_to_remove   sU    ?j((IO},L,L#    9	//CH	4N4N44ur   z(checking for DNS records to remove on %sc                 *    g | ]} |          |S r   r   )rK   rrT   s     r   
<listcomp>z)remove_dns_references.<locals>.<listcomp>   s(    >>>??1+=+=>!>>>r   1updating %s keeping %d values, removing %s values)searchr#   SCOPE_SUBTREElenupper
dns_lookupRuntimeErrorr+   r   "WERR_DNS_ERROR_NAME_DOES_NOT_EXISTWERR_DNS_ERROR_RCODE_NAME_ERRORremove_hanging_dns_referencesr   dns_replace
SCOPE_BASEsetdebugr)   )r.   r/   dnsHostNameignore_no_namezonesdnsHostNameUpperr3   e4r5   r6   resncsa_names_to_remove_froma_namea_rec_dna_recse2orig_num_recsrT   rH   rS   s   `                 @@@r   remove_dns_referencesrs   Z   s'    LLb(9$T!#7"8  : :E 5zzQ"((**O"--k::\\ 	O 	O 	OwtF===F::: 5-eV.>.35 5 5 FFFFFo;;;MNNN	O 
k2&&&
,,r ^4D3E  G GCs88q====
a&!
"CB B B B B 6666#666
6
6      ) . .	NLLCfLMMM!&!1!1&!9!9Xvv 	N 	N 	N7LT4v@@@!/vvvtt"LMMM		N F>>>>V>>>v;;-''KKKVmc&kk.IJK L L Lff---!%1A5IIIIIs<   A- -
C7>C;CC0F
GG:GGc                   	 fd	|D ]}|                     d|j        z             |                     |j        t          j        ddg          }|D ]}	 |d         }n# t
          $ r Y w xY w	fd|D             }t          |          t          |          k    re|                    d|j        t          |          t          |          t          |          z
  fz             |                     |j        |           d S )Nc                 D   t          t          j        |           }|j        t          k    s |j        t
          k    s|j        t          k    r |j                                        k    rdS n4|j        t          k    r$|j        j
                                        k    rdS dS rN   )r   r   DnssrvRpcRecordrO   r   r   r   rP   r\   r   
nameTarget)r   rQ   ri   s     r   	to_removez0remove_hanging_dns_references.<locals>.to_remove   s    t3U;;	?k))o//o--~##%%)999t :_,,~(..004DDDtur   zchecking %sz/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))rQ   )r<   r=   r>   r?   c                 Z    g | ]'} |          t          t          j        |          (S r   )r   r   rv   )rK   vrx   s     r   rW   z1remove_hanging_dns_references.<locals>.<listcomp>   sI     @ @ @))A,,@j!5q99 @ @ @r   rX   )	re   r3   rY   r#   rZ   KeyErrorr[   r)   dns_replace_by_dn)
r.   r/   ri   rh   zonerecordsrecordorig_valuesvaluesrx   s
     `      @r   ra   ra      sq   

 
 
 
 
  ; ;]TW,---,,DG33D+:&1]  4 4  	; 	;F$[1   @ @ @ @*@ @ @F 6{{c+....O%y#f++";//#f++=?? @ @ @ ''	6:::#	;; ;s   A  
A-,A-c                 >   |                      dt          j        dg          }t          |          dk    sJ |d         d         d         }	|                      |g dt          j        d          }
|
d         }t	          |d	         d                   }	 t          j        | |d
         d                             d                    }n# t          $ r d }Y nw xY w	 t	          |d         d                   }n# t          $ r d }Y nw xY w|r|                     |dg           |%|                      |dg dt          j                  }d|d         v rNt	          |d         d         d                   }|	                    d|z             |                     |           d|d         v rNt	          |d         d         d                   }|	                    d|z             |                     |           |r/|	                    d|z             |                     |dg           d|v rt	          |d         d                   }|r|                      dt          j
        |          d|dg t          j        |                                           }t          |          dk    rC|	                    d|d         j        z             |                     |d         j                   ||rt          | ||           |rt          | ||           d S d S )Nr:   dsServiceNamerB   rC   r   )serverReferencecnrf   z(objectClass=server)r<   r?   r=   r>   r   r   utf8rf   tree_delete:0zobjectclass=computer)msDS-KrbTgtLinkrIDSetReferencesr   r<   r>   r?   r=   r   zRemoving RID Set: %sr   zRemoving RODC KDC account: %sz5Removing computer account: %s (and any child objects)z(&(objectclass=user)(cn=dns-z)(servicePrincipalName=DNS/z)))r>   r?   r=   r<   z/Removing Samba-specific DNS service account: %s)rY   r#   rc   r[   rJ   r$   decoder{   r*   r)   binary_encoderZ   r-   r3   rs   r8   )r.   r/   	server_dnremove_computer_objremove_server_objremove_sysvol_objremove_dns_namesremove_dns_accountrk   my_serviceNamemsgsmsgr0   computer_dnrf   computer_msgs
rid_set_dnkrbtgt_link_dns                     r   offline_remove_serverr      s    ,,r ^O3D  F FCs88q====VO,Q/N <<Y. . .!n#9	  ; ;D
 q'C#d)A,GfUC(9$:1$=$D$DV$L$LMM   #m,Q/00     3 	Y 1222+0F,2 ,2 ,2 ,/> % ; ; q!111]1-.@A!DEEJKK.;<<<LL$$$a 000 q!12C!DQ!GHHNKK7.HIIILL((( 	9KKOR]]^^^LL&7888Cc-0344K $lll-g6666'E!#3+< % 8 8 : :  < < s88q==KKICPQFIUVVVLLQ####3eV[999 9 888889 9s$   4C CCC: :D	D	c
           
         |                      dt          j        dg          }
t          |
          dk    sJ t          j        | |
d         d         d                             d                    }|                                }||k    rt          d|z            	 |                      |dd	gt          j        
          }n?# t          $ r2}|j	        \  }}|t          j
        k    rt          d|z             d }~ww xY wt          |          dk    r&t          |d|                                           |d         }|j                                        dk    s|j                                        dk    rt          d|z            t          t           j        |d	         d                   }|rh|                      |                                 d|z            }|D ]9}|                    d|j        z             |                     |j                   :|r|                      dt          j        d|z  dg          }|D ]}t-          |          }t          j                    }|j        |_        t          j        |t          j        d          |d<   |                    d|j        d|d           |                     |           	 |                    d|z             |                     |dg           n.# t          $ r!}|j	        \  }}t          d|z            d }~ww xY wt9          | |||||||	           d S )Nr:   r   rB   rC   r   r   z#Refusing to demote our own DSA: %s zobjectClass=ntdsDSA
objectGUIDr   zGiven DN %s doesn't existz is not an ntdsda in r    zNTDS Settingsz)Given DN (%s) wasn't the NTDS Settings DNz5(&(objectclass=nTDSConnection)(fromServer=<GUID=%s>)))r<   r>   zRemoving nTDSConnection: %sz(fsmoRoleOwner=<GUID=%s>))r;   )r<   r=   r>   r@   fsmoRoleOwnerr   zSeizing FSMO role on: z (now owned by r!   z'Removing nTDSDSA: %s (and any children)r   z,Failed to remove the DCs NTDS DSA object: %sr   r   r   r   r   )rY   r#   rc   r[   r$   r   parentr   r   r+   r,   r"   r3   get_rdn_nameget_rdn_valuer   r   GUIDr&   r)   r*   rZ   rJ   MessageMessageElementFLAG_MOD_REPLACEwarningmodifyr   )r.   r/   ntds_dnr   r   remove_connection_objseize_stale_fsmor   r   r   rk   r   r   r   e5r5   r6   r   	ntds_guidstale_connectionsconnstale_fsmo_rolesrolevalme6s                             r   offline_remove_ntds_dcr   !  s    ,,r ^O3D  F FCs88q====VE3q6/#:1#=#D#DV#L#LMMN  I  CnTUUU||5J#/.  H H   wt3)))!"="GHHH 	D		Q!(%*?*?*A*A*AC D D 	D q'C%%/11I%& ' ' 	' 49c,&7&:;;I 	" "LLe.E.E.G.G5CEN5O ) P P & 	" 	"DKK5?@@@LL!!!!  <<Rs7H3O*3442F1G ( I I % 	 	Dn%%CA7AD+C1E,;= =AgJNNN"ggg~~~7 8 8 8LLOOOO&=GHHHW/0000 & & &wtL $% & & 	&&
 %.A,=,=+;-?A A A A A As0    $C 
D-C<<D/L 
L2L--L2c                    |                                   d }	 t          j        |          }d|z  }n# t          $ r 	 |                     |                                 g dt          j        |          z            }nF# t          $ r9}|j	        \  }}	t          d|d|                                 d|	          d }~ww xY wt          |          dk    r:|                                  t          |d	|                                           |d         j        }t          j        | d
          }|                    |           Y nw xY w	 |                     |g t          j        d          }
nr# t          $ re}|j	        \  }}	|t          j        k    rg }
n>|                                  t          d|d|                                 d|	          Y d }~nd }~ww xY wt          |
          dk    rT|:|                                  t          |d	|                                           t'          | ||ddddd           n$t)          | ||
d         j        ddddddd
  
         |                                  d S )N)hexz	<GUID=%s>z(&(objectClass=server)(cn=%s)))r<   r?   r>   zFailure checking if z is an server object in z: r   z is not an AD DC in zCN=NTDS Settingsz(objectClass=ntdsdsa)r   z is an NTDS DSA in Tr   )r   r   r   r   r   r   r   )transaction_startuuidUUID
ValueErrorrY   r&   r#   r   r   r+   r   r"   r[   transaction_cancelr3   r$   r%   rc   r,   r   r   transaction_commit)r.   r/   r0   r   r   r   server_msgse3r5   r6   	ntds_msgse7s               r   	remove_dcr   v  sL   
 
I$I'***		) $ $ $
	N,,E,C,C,E,E-/32),):7)C)C3D ' E EKK
  	N 	N 	N7LT4!/%,WWe.C.C.E.E.E.Ett#M N N N	N !!$$&&&!%,WWe.C.C.E.E.E#G H H HN%	& 233#####)$.:LLgRs~,C ! E E		 : : :wt3)))II$$&&&!/%//1111449: : : IIII: 	I!$$&&&!%,WWe.C.C.E.E.E#G H H H 	eV'260404/315	7 	7 	7 	7 	7 	uf(|37155904150426	8 	8 	8 	8 
sM   4 E ?B ?E 
C
4B>>CBEE#E5 5
G$?AGG$c                 x    |                                   t          | |d            |                                  d S r   )start_transactionr   commit_transaction)r.   r   s     r    offline_remove_dc_RemoveDsServerr     s>    	5'4000	r   )F)FFFFF)FFFFFFF)r   r#   r   sambar   	samba.ndrr   samba.dcerpcr   r   samba.dcerpc.dnspr   r	   r
   r   r   r   	Exceptionr   r8   rs   ra   r   r   r   r   r   r   r   <module>r      s  &  



                         # # # # # # # #/ / / / / / / / / / / / / / / /0 0 0 0 0i 0 0 00 0 0fMJ MJ MJ MJ`(; (; (;Z /4,1,1+0-2I9 I9 I9 I9^ 05-216,1-2,1.3RA RA RA RAjK K K\    r   