
    FcOO                         d dl mZmZm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 d dlZd dlZd dlmZmZmZ d dlZ G d	 d
e          ZddZd Zd Zd Zd Z G d de          Z G d de          ZdS )    )drsuapimiscdrsblobs)Net)
ndr_unpack)dsdb)werror)WERRORErrorN)DRSUAPI_ATTID_name(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8)DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V10c                       e Zd ZdZd Zd ZdS )drsExceptionzBase element for drs errorsc                     || _         d S Nvalue)selfr   s     1/usr/lib/python3/dist-packages/samba/drs_utils.py__init__zdrsException.__init__%   s    


    c                     d| j         z   S )NzdrsException: r   )r   s    r   __str__zdrsException.__str__(   s    $*,,r   N)__name__
__module____qualname____doc__r   r    r   r   r   r   "   s8        %%  - - - - -r   r   c                 &   d}|                                 dk    r|dz  }||d|  z  }d| d| d}n	d| d|d}	 t          j        |||          }t          |          \  }}n'# t          $ r}	t	          d	| d
|	          d}	~	ww xY w|||fS )a  Make a DRSUAPI connection to the server.

    :param server: the name of the server to connect to
    :param lp: a samba line parameter object
    :param creds: credential used for the connection
    :param ip: Forced target server name
    :return: A tuple with the drsuapi bind object, the drsuapi handle
                and the supported extensions.
    :raise drsException: if the connection fails
    seal	   z,printNz,target_hostname=zncacn_ip_tcp:[]zDRS connection to z	 failed: )	log_levelr   
drs_DsBind	Exceptionr   )
serverlpcredsipbinding_optionsbinding_stringdrsuapiBinddrsuapiHandlebindSupportedExtensionses
             r   drsuapi_connectr1   ,   s     O	||~~8# 
~7v777@@@o@@@  39&&///JLonb%@@3=k3J3J0// L L LlJKKKL (?@@s   (A' '
B1BBc                 &   t          j                    }||_        t          j                    }||_        ||_        t          j        |          |_        	 | 	                    |d|           dS # t          $ r}t          d|z            d}~ww xY w)a  Send DS replica sync request.

    :param drsuapiBind: a drsuapi Bind object
    :param drsuapi_handle: a drsuapi handle on the drsuapi connection
    :param source_dsa_guid: the guid of the source dsa for the replication
    :param naming_context: the DN of the naming context to replicate
    :param req_options: replication options for the DsReplicaSync call
    :raise drsException: if any error occur while sending and receiving the
        reply for the dsReplicaSync
       zDsReplicaSync failed %sN)r   DsReplicaObjectIdentifierdnDsReplicaSyncRequest1naming_contextoptionsr   GUIDsource_dsa_guidDsReplicaSyncr&   r   )r-   drsuapi_handler:   r7   
req_optionncreq1estrs           r   sendDsReplicaSyncrA   L   s     
	*	,	,BBE(**DDDL9_55D=!!.!T::::: = = =4t;<<<=s   A/ /
B9BBc                    t          j                    }d|_        t          j                    |_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j	        z  c_        |j        xj        t           j
        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j        z  c_        |j        xj        t           j         z  c_        |j        xj        t           j!        z  c_        | "                    tG          j$        t           j%                  |          \  }}||j        j        fS )z0make a DsBind call, returning the binding handle   )&r   DsBindInfoCtrlengthDsBindInfo28infosupported_extensions DRSUAPI_SUPPORTED_EXTENSION_BASE-DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION%DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI&DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2+DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V14DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION'DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE'DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V24DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V28DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD'DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND)DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO-DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION&DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V011DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP+DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY&DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3,DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6)DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCSr   *DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6,DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7)DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECTDsBindr   r9   DRSUAPI_DS_BIND_GUID)drs	bind_inforG   handles       r   r%   r%   g   s   %''II)++INN''7+SS''N''7+``''N''7+XX''N''7+YY''N''7+^^''N''7+XX''N''7+gg''N''7+ZZ''N''7+ZZ''N''7+gg''N''7+XX''N''7+kk''N''7+ZZ''N''7+\\''N''7+``''N''7+YY''N''7+dd''N''7+^^''N''7+YY''N''7+__''N''7+[[''N''7+\\''N''7+[[''N''7+]]''N''7+]]''N''7+__''N''7+]]''N''7+\\''ZZ	'*F G GSSNT6DI233r   c                    t          j                    }d|_        g }|                                 }|                     |t
          j        dg d          }|D ]}t          |d         d                   }d|v rB|d         d         }t          |          t          j
        j        t          j
        j        z  z  rcd|v r0|d         d         }t          |          t          j
        j        z  r|                     |          }	|                    t          |	                     |                                 ||_        t%          |          |_        |S )	z-get a list of attributes for RODC replicationr3   zobjectClass=attributeSchema)lDAPDisplayNamesystemFlagssearchFlags)basescope
expressionattrsrj   r   rk   rl   )r   DsPartialAttributeSetversionget_schema_basednsearchldbSCOPE_SUBTREEstrintsambar   DS_FLAG_ATTR_NOT_REPLICATEDDS_FLAG_ATTR_IS_CONSTRUCTEDSEARCH_FLAG_RODC_ATTRIBUTEget_attid_from_lDAPDisplayNameappendsortattidslen
num_attids)
samdbpartial_attribute_setr   	schema_dnresrldap_display_namesystem_flagssearch_flagsattids
             r   "drs_get_rodc_partial_attribute_setr      sh   #9;;$%!F
 ''))I
,,IS->"?- - -  . .C
  " ""3 4Q 788A !- 0 3LL!!UZ%K%*Z%K&L M A]+A.LL!!EJ$II 445FGGc%jj!!!! KKMMM+1 '*6{{$  r   c                 N    |j         | _         |j        | _        |j        | _        dS )z
    Copies the highwater mark by value, rather than by object reference. (This
    avoids lingering talloc references to old GetNCChanges reply messages).
    N)tmp_highest_usnreserved_usnhighest_usn)hwmnew_hwms     r   drs_copy_highwater_markr      s(    
 "1C+C)COOOr   c                   `    e Zd ZdZd Zd Zed             Zd Zd Z	de
j        ddd	dd
fdZdS )drs_ReplicatezDRS replication callsc                    t          j         |||          | _        t          | j                  \  | _        | _        t          ||          | _        || _        t          |t          j
                  st          d          |t          j
        d          k    rt          d          | j                            | j        || j        |          | _        d| _        d S )N)r)   r(   z"Must supply GUID for invocation_id$00000000-0000-0000-0000-000000000000zGMust not set GUID 00000000-0000-0000-0000-000000000000 as invocation_idr   )r   rf   r%   
drs_handlesupports_extr   netr   
isinstancer   r9   RuntimeErrorreplicate_initreplication_state
more_flags)r   r,   r(   r)   r   invocation_ids         r   r   zdrs_Replicate.__init__   s    ?>2u==/9$(/C/C,$+Ur***
-33 	ECDDDDI&LMMMMhiii!%!8!8RS`!a!ar   c                 t    | j         }|t          j        k    o!|t          z  o|j        t
          j        z  dk    S Nr   )r   r	   WERR_DS_DRA_RECYCLED_TARGETr   r   r   DRSUAPI_DRS_GET_TGT)r   
error_codereqr   s       r   _should_retry_with_get_tgtz(drs_Replicate._should_retry_with_get_tgt   sD    
 (f@@ DHHD'"==!C	Er   c                 R    | t           j        k    o|j        t          j        z  dk    S r   )r	   WERR_DS_DRA_MISSING_PARENTreplica_flagsr   DRSUAPI_DRS_GET_ANC)r   r   s     r   %_should_calculate_missing_anc_locallyz3drs_Replicate._should_calculate_missing_anc_locally   s.     v@@ G"W%@@QF	Hr   c                    t                      | _        |j        }	 |d S | j                            t	          |j        j        j                             |j        |j        t          j
        d          k    rst	          |j                  | j        vrXt          j        | j        |j        j        j                  }|                                }t!          d| d|j         d           |j        })NTr   zObject z with GUID z) was not sent by the server in this chunk)set
guids_seenfirst_objectaddrw   object
identifierguidparent_object_guidr   r9   ru   Dnr   r5   parentprintnext_object)r   ctrobject_to_checkobj_dn	parent_dns        r   _calculate_missing_anc_locallyz,drs_Replicate._calculate_missing_anc_locally   s   %%
 *	:&OO$:$E$J K KLLL1="5)BCCD D9::$/QQ
O,B,M,PQQ"MMOO	 A	 A A-@A A A B B B .9O!	:r   c                 P    | j                             | j        |||||           dS )5Processes a single chunk of received replication data)schema	req_levelr   N)r   replicate_chunkr   )r   levelr   r   r   r   first_chunks          r   process_chunkzdrs_Replicate.process_chunk   sB     	  !7(.) 	! 	N 	N 	N 	N 	Nr   FNTr   c           	      	   | j         t          z  r%t          j                    }|
| j        z  |_        d}nd}t          j                    }||_        ||_        t          j                    |_	        ||j	        _
        d}t          j                    }d|_        d|_        d|_        |s4| j                            |t"          j        dg          }d|d         v rG|d         d         D ]8}t'          t(          j        |          }|j        j        |k    r|j        j        }9t          j                    }d|_        d|_        d|_        g }t9          j        | j        | j                                                  }|D ]B}t          j                    }|j        |_        |j        |_        |                     |           C||_!        tE          |          |_#        ||_        ||_$        |||_%        n|t          j&        k    rd|_%        n|t          j'        t          j(        z  t          j)        z  t          j*        z  t          j+        z  |_%        |r|xj%        t          j,        z  c_%        n|xj%        t          j-        z  c_%        |	r|xj%        t          j.        z  c_%        d|_/        d	|_0        ||_1        d|_2        d|_3        d|_4        d|j5        _6        d|j5        _7        |s|rtq          | j                  |_3        | j         tr          z  sTd
}t          j:                    }tw          |          D ]-}|d         dk    rty          ||t{          ||                     .|}d}d}d}	 | j>        ?                    | j@        ||          \  }}|jA        "|jB        dk    rt          d|jB        z            	 | D                    ||||||           n# t          $ r}| F                    |jG        d         |          r0t          d           |xj        t          jI        z  c_        d}Y d}~| J                    |jG        d         |          r$t          d           | K                    |           |d}~ww xY wd}||jB        z  }	 ||jL        z  }n# t          $ r Y nw xY w|jN        dk    rnt          |j        |jP                   c||fS )zreplicate a single DN
      Nr   repsFrom)rm   rn   rp   r3   i  i"    _Tz6DsGetNCChanges: NULL first_object with object_count=%uz1Missing target object - retrying with DRS_GET_TGTz;Missing parent object - calculating missing objects locallyF)Qr   r   r   DsGetNCChangesRequest10r   DsGetNCChangesRequest8destination_dsa_guidsource_dsa_invocation_idr4   r7   r5   DsReplicaHighWaterMarkr   r   r   r   rt   ru   
SCOPE_BASEr   r   repsFromToBlobr   highwatermarkDsReplicaCursorCtrExrr   	reserved1	reserved2r   _dsdb_load_udv_v2get_default_basednDsReplicaCursorr~   cursorsr   countuptodateness_vectorr   DRSUAPI_EXOP_REPL_SECRETDRSUAPI_DRS_INIT_SYNCDRSUAPI_DRS_PER_SYNCr   DRSUAPI_DRS_NEVER_SYNCED$DRSUAPI_DRS_GET_ALL_GROUP_MEMBERSHIP%DRSUAPI_DRS_SPECIAL_SECRET_PROCESSINGDRSUAPI_DRS_WRIT_REPDRSUAPI_DRS_SYNC_FORCEDmax_object_countmax_ndr_sizeextended_op	fsmo_infor   partial_attribute_set_exmapping_ctrnum_mappingsmappingsr   r   DsGetNCChangesRequest5dirsetattrgetattrrf   DsGetNCChangesr   r   object_countr   r   r
   r   argsr   r   r   r   linked_attributes_countAttributeError	more_datar   new_highwatermark)r   r5   r   r   r   exoprodcr   	full_syncsync_forcedr   r   r   udvr   r   reps_from_packedreps_from_obj
cursors_v1
cursors_v2	cursor_v2	cursor_v1req5anum_objects	num_linksr   r   r   r0   s                                 r   	replicatezdrs_Replicate.replicate  sK    HH 	3133C(4?:CNIII022C#7 '?$$>@@ " ,.. 	(*##3>+5, $ 8 8CSV##(+Az(: > >$$.x/FHX$Y$YM$(AE]]]+/=.00CCKCMCMJ/
04
0M0M0O0OQ QJ' - -	#355	5>5W	2(1(=	%!!),,,,$CKJCI"%$ -CW555 !C!(!>!(!=">!(!<"= ")!A"B ")!M	"NC
  B!!BD!!! !!W%AA!! 	A!@@"!$(!'+$'($#'  	W$ 	W(J4:(V(VC% #KK 	I133DYY 6 6Q43;;D!WS!__555C	'	N8224?IsSSLUC'C,<,A,A"#[_b_o#pqqq""5#vy#{SSSS   2216!9cBB MNNNNNg&AANN #'KHHHH==afQi>AC C =WXXX77<<<#&  K3++KS88		!    }!! $C$5s7LMMMO'	NR Y''s2   <O 
Q>!AQ92AQ99Q>
R 
R&%R&)r   r   r   r   r   r   staticmethodr   r   r   r   DRSUAPI_EXOP_NONEr  r   r   r   r   r      s        
 
 
	E 	E 	E H H \H: : :6N N N W%>U $%TUK( K( K( K( K( K(r   r   c                   >     e Zd ZdZ fdZd Zd Zd Z fdZ xZ	S )drs_ReplicateRenamerz,Uses DRS replication to rename the entire DBc                     t          t          |                               |||||           || _        || _        t
          j        | _        d S r   )superr  r   old_base_dnnew_base_dnr   r   r   )	r   r,   r(   r)   r   r   r  r  	__class__s	           r   r   zdrs_ReplicateRenamer.__init__  sT    "D))22>2u38-	I 	I 	I&& "5r   c                 H    t          j        d| j        z  | j        |          S )z/Uses string substitution to replace the base DNz%s$)resubr  r  )r   dn_strs     r   	rename_dnzdrs_ReplicateRenamer.rename_dn  s!    ved..0@&IIIr   c                    |j         j        D ]t}|j        t          k    rbt	          j        | j        |j        j                  }|	                                }|
                    d          |j        j        d         _        udS )z3Updates the 'name' attribute for the base DN objectz	utf-16-ler   N)attribute_ctr
attributesr   r   ru   r   r   r   r5   get_rdn_valueencode	value_ctrvaluesblob)r   base_objattrbase_dnnew_names        r   update_name_attrz%drs_ReplicateRenamer.update_name_attr  s|    *5 	M 	MDz///&X-@-CDD"0022080L0L%a(-		M 	Mr   c                    |j         j        }|                     |j         j                  |j         _        t          d|d|j         j                   |j         j        | j        k    r|                     |           dS dS )z1Renames the first/top-level object in a partitionzRenaming partition z --> N)r   r5   r  r   r  r#  )r   	first_objold_dns      r   rename_top_level_objectz,drs_ReplicateRenamer.rename_top_level_object  s    %("&..1E1H"I"I	090D0G0GI 	J 	J 	J
 "d&666!!),,,,, 76r   c                    |j         r)|                     |j         j                  |j         _        |r*|j        dk    r|                     |j        j                   t          t          |           	                    ||||||           dS )r   r   N)
r7   r  r5   r   r'  r   r   r  r  r   )r   r   r   r   r   r   r   r  s          r   r   z"drs_ReplicateRenamer.process_chunk  s    
  	J$(NN33E3H$I$IC!  	B3+q00(()9)@AAA 	"D))77sF8A38C	E 	E 	E 	E 	Er   )
r   r   r   r   r   r  r#  r'  r   __classcell__)r  s   @r   r  r    s        666 6 6 6 6J J JM M M
- 
- 
-E E E E E E E E Er   r  r   )samba.dcerpcr   r   r   	samba.netr   	samba.ndrr   ry   r   r	   r
   ru   samba.dcerpc.drsuapir   r   r   r  r&   r   r1   rA   r%   r   r   r   r   r  r   r   r   <module>r.     s  ( 1 0 0 0 0 0 0 0 0 0                                      



M M M M M M M M M M 
			- - - - -9 - - -A A A A@= = =6#4 #4 #4L#! #! #!L* * *Q( Q( Q( Q( Q(F Q( Q( Q(l8E 8E 8E 8E 8E= 8E 8E 8E 8E 8Er   