
    gyN                         S SK JrJrJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S SKJr  S SKrS SKrS SKJrJrJr  S SKr " S	 S
\5      rSS jrS rS rS rS r " S S\5      r " S S\5      rg)    )drsuapimiscdrsblobs)Net)
ndr_unpack)dsdb)werror)WERRORErrorN)DRSUAPI_ATTID_name(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8)DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V10c                   $    \ rS rSrSrS rS rSrg)drsException"   zBase element for drs errorsc                     Xl         g Nvalue)selfr   s     1/usr/lib/python3/dist-packages/samba/drs_utils.py__init__drsException.__init__%   s    
    c                      SU R                   -   $ )NzdrsException: r   )r   s    r   __str__drsException.__str__(   s    $**,,r   r   N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__ r   r   r   r   "   s    %-r   r   c                    SnUR                  5       S:  a  US-  nUb  USU  3-  nSU SU S3nOSU < SU< S3n [        R                  " XQU5      n[        U5      u  pxXgU4$ ! [         a  n	[	        S	U < S
U	< 35      eSn	A	ff = f)av  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_connectr6   ,   s     O	||~8# 
~.vh77(Ao->a@  39/JLoon%@3=k3J0 (?@@  LJKKLs   $A% %
B/BBc                    [         R                  " 5       nX5l        [         R                  " 5       nXVl        XFl        [        R                  " U5      Ul         U R                  USU5        g! [         a  n[        SU-  5      eSnAff = f)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   )r2   drsuapi_handler?   r<   
req_optionncreq1estrs           r   sendDsReplicaSyncrF   L   sy     
	*	*	,BE((*DL99_5D=!!.!T: =4t;<<=s   A- -
B
7BB
c                 
   [         R                  " 5       nSUl        [         R                  " 5       Ul        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                  -  sl        UR                  =R
                  [         R                   -  sl        UR                  =R
                  [         R"                  -  sl        UR                  =R
                  [         R$                  -  sl        UR                  =R
                  [         R&                  -  sl        UR                  =R
                  [         R(                  -  sl        UR                  =R
                  [         R*                  -  sl        UR                  =R
                  [         R,                  -  sl        UR                  =R
                  [         R.                  -  sl        UR                  =R
                  [         R0                  -  sl        UR                  =R
                  [         R2                  -  sl        UR                  =R
                  [         R4                  -  sl        UR                  =R
                  [         R6                  -  sl        UR                  =R
                  [         R8                  -  sl        UR                  =R
                  [         R:                  -  sl        UR                  =R
                  [         R<                  -  sl        UR                  =R
                  [         R>                  -  sl        UR                  =R
                  [         R@                  -  sl        UR                  =R
                  [         RB                  -  sl        U RE                  [F        RH                  " [         RJ                  5      U5      u  p#X2R                  R
                  4$ )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   r>   DRSUAPI_DS_BIND_GUID)drs	bind_inforL   handles       r   r*   r*   g   sP   %%'II))+INNN''7+S+SS'NN''7+`+``'NN''7+X+XX'NN''7+Y+YY'NN''7+^+^^'NN''7+X+XX'NN''7+g+gg'NN''7+Z+ZZ'NN''7+Z+ZZ'NN''7+g+gg'NN''7+X+XX'NN''7+k+kk'NN''7+Z+ZZ'NN''7+\+\\'NN''7+`+``'NN''7+Y+YY'NN''7+d+dd'NN''7+^+^^'NN''7+Y+YY'NN''7+_+__'NN''7+[+[['NN''7+\+\\'NN''7+[+[['NN''7+]+]]'NN''7+]+]]'NN''7+_+__'NN''7+]+]]'NN''7+\+\\'ZZ		'*F*F GSNTII2233r   c                    [         R                  " 5       nSUl        / nU R                  5       nU R	                  U[
        R                  S/ SQS9nU H  n[        US   S   5      nSU;   aP  US   S   n[        U5      [        R                  R                  [        R                  R                  -  -  (       a  Mj  SU;   a5  US   S   n[        U5      [        R                  R                  -  (       a  M  U R                  U5      n	UR                  [        U	5      5        M     UR!                  5         X!l        [%        U5      Ul        U$ )	z-get a list of attributes for RODC replicationr8   zobjectClass=attributeSchema)lDAPDisplayNamesystemFlagssearchFlags)basescope
expressionattrsro   r   rp   rq   )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      s3   #99;$%!F
 '')I
,,IS->->"?-  .C
 "3 4Q 78A !- 0 3LL!UZZ%K%K%*ZZ%K%K&L MA]+A.LL!EJJ$I$II445FGc%j!   KKM+1 '*6{$  r   c                 j    UR                   U l         UR                  U l        UR                  U l        g)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-    
 "11C++C))COr   c                   l    \ rS rSrSrS rS r\S 5       rS r	S r
S\R                  SS	S
SS4S jrSrg	)drs_Replicate   zDRS replication callsc                    [         R                   " XU5      U l        [        U R                  5      u  U l        U l        [        X2S9U l        X@l        [        U[        R                  5      (       d  [        S5      eU[        R                  " S5      :X  a  [        S5      eU R                  R                  U R                  X R                  U5      U l        SU l        g )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   rk   r*   
drs_handlesupports_extr   netr   
isinstancer   r>   RuntimeErrorreplicate_initreplication_state
more_flags)r   r1   r-   r.   r   invocation_ids         r   r   drs_Replicate.__init__   s    ??>u=/9$((/C,$+U*
-33CDDDII&LMMhii!%!8!8RS`!ar   c                     U R                   nU[        R                  :H  =(       a0    U[        -  =(       a     UR                  [
        R                  -  S:H  $ Nr   )r   r	   WERR_DS_DRA_RECYCLED_TARGETr   r   r   DRSUAPI_DRS_GET_TGT)r   
error_codereqr   s       r   _should_retry_with_get_tgt(drs_Replicate._should_retry_with_get_tgt   sO    
 ((f@@@ DHHD'"="==!C	Er   c                 v    U [         R                  :H  =(       a     UR                  [        R                  -  S:g  $ r   )r	   WERR_DS_DRA_MISSING_PARENTreplica_flagsr   DRSUAPI_DRS_GET_ANC)r   r   s     r   %_should_calculate_missing_anc_locally3drs_Replicate._should_calculate_missing_anc_locally   s7     v@@@ G""W%@%@@QF	Hr   c                 b   [        5       U l        UR                  n Uc  g U R                  R                  [	        UR
                  R                  R                  5      5        UR                  b  UR                  [        R                  " S5      :w  a  [	        UR                  5      U R                  ;  ak  [        R                  " U R                  UR
                  R                  R                  5      nUR                  5       n[!        SU SUR                   S35        UR"                  nGM  )Nr   zObject z with GUID z) was not sent by the server in this chunk)set
guids_seenfirst_objectaddr|   object
identifierguidparent_object_guidr   r>   rz   Dnr   r:   parentprintnext_object)r   ctrobject_to_checkobj_dn	parent_dns        r   _calculate_missing_anc_locally,drs_Replicate._calculate_missing_anc_locally   s    %
 **&OOO$:$:$E$E$J$J KL11="55))BCD99:$//Q

O,B,B,M,M,P,PQ"MMO		{ +-@@A BAA B .99O! r   c           	      P    U R                   R                  U R                  XX4US9  g)5Processes a single chunk of received replication data)schema	req_levelr   N)r   replicate_chunkr   )r   levelr   r   r   r   first_chunks          r   process_chunkdrs_Replicate.process_chunk   s+     	  !7!7(. 	! 	Nr   FNTr   c           	         U R                   [        -  (       a+  [        R                  " 5       nXR                  -  Ul        SnOSn[        R
                  " 5       nX;l        X+l        [        R                  " 5       Ul	        XR                  l
        Sn[        R                  " 5       nSUl        SUl        SUl        U(       Gd[  U R                  R!                  U["        R$                  S/S9nSUS   ;   a[  US   S    HO  n['        [(        R*                  U5      nUR,                  R                  U:X  d  M9  UR,                  R.                  nMQ     [        R0                  " 5       nSUl        SUl        SUl        / n[8        R:                  " U R                  U R                  R=                  5       5      nU HK  n[        R>                  " 5       nUR                  Ul        UR                  Ul        URA                  U5        MM     UUl!        [E        U5      Ul#        Xl        Xl$        Ub  X{l%        OU[        RL                  :X  a  SUl%        O[        RN                  [        RP                  -  [        RR                  -  [        RT                  -  [        RV                  -  Ul%        U(       a$  U=RJ                  [        RX                  -  sl%        O#U=RJ                  [        RZ                  -  sl%        U	(       a#  U=RJ                  [        R\                  -  sl%        SUl/        S	Ul0        X[l1        SUl2        SUl3        SUl4        SURj                  l6        SURj                  l7        U(       d!  U(       a  [q        U R                  5      Ul3        U R                   [r        -  (       dM  S
n[        Rt                  " 5       n[w        U5       H%  nUS   S:w  d  M  [y        UU[{        UU5      5        M'     UnSnSnSn U R|                  R                  U R                  X5      u  nnUR                  c(  UR                  S:w  a  [        SUR                  -  5      e U R                  UUXLUU5        SnUUR                  -  n UUR                  -  nUR                  S:X  a   UU4$ [        UR.                  UR                  5        M  ! [         a  nU R                  UR                  S   U5      (       a7  [        S5        U=R                  [        R                  -  sl        Sn SnAGM2  U R                  UR                  S   U5      (       a  [        S5        U R                  U5        UeSnAff = f! [         a     Nf = f)zreplicate a single DN
      Nr   repsFrom)rr   rs   ru   r8   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_idr9   r<   r:   DsReplicaHighWaterMarkr   r   r   r   ry   rz   
SCOPE_BASEr   r   repsFromToBlobr   highwatermarkDsReplicaCursorCtrExrw   	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getattrrk   DsGetNCChangesr   r   object_countr   r   r
   r   argsr   r   r   r   linked_attributes_countAttributeError	more_datar   new_highwatermark)r   r:   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   r5   s                                 r   	replicatedrs_Replicate.replicate  s    HH113C(??:CNII002C#7 '?$$>>@ " ,,.**##3>>+5, $ 8CSV#(+Az(:$$.x/F/FHX$YM$((AAE]]+//== );
 ..0CCKCMCMJ//

04

0M0M0OQJ'	#335	5>5W5W	2(1(=(=	%!!),	 ( %CKJCI"%$ -W555 !C!(!>!>!(!=!=">!(!<!<"= ")!A!A"B ")!M!M	"NC
 !!BBD! !!W%A%AA!!@!@@"!$(!'+$'($#' $(J4::(VC%  #KKI113DYQ43;D!WS!_5  C	88224??ISLUC'C,<,<,A"#[_b_o_o#pqq""5#v#{S(  K3+++KS888	 }}!
 Y'' $C$5$5s7L7LMO   22166!9cBBMNNNg&A&AAN #'K==affQi>AC CWX77<#2 " s2   !S U= 
U:AU53AU55U:=
V
	V
)rk   r   r   r   r   r   r   r   )r   r   r   r    r!   r   r   staticmethodr   r   r   r   DRSUAPI_EXOP_NONEr  r"   r#   r   r   r   r      sP    
	E H H:6N W%>%>U $%TUK(r   r   c                   J   ^  \ rS rSrSrU 4S jrS rS rS rU 4S jr	Sr
U =r$ )	drs_ReplicateRenameri  z,Uses DRS replication to rename the entire DBc                 j   > [         TU ]  XX4U5        X`l        Xpl        [        R
                  U l        g r   )superr   old_base_dnnew_base_dnr   r   r   )	r   r1   r-   r.   r   r   r  r  	__class__s	           r   r   drs_ReplicateRenamer.__init__  s/    U=I&& "55r   c                 `    [         R                  " SU R                  -  U R                  U5      $ )z/Uses string substitution to replace the base DNz%s$)resubr  r  )r   dn_strs     r   	rename_dndrs_ReplicateRenamer.rename_dn  s&    vved...0@0@&IIr   c                 N   UR                   R                   H  nUR                  [        :X  d  M  [        R
                  " U R                  UR                  R                  5      nUR                  5       nUR                  S5      UR                  R                  S   l        M     g)z3Updates the 'name' attribute for the base DN objectz	utf-16-ler   N)attribute_ctr
attributesr   r   rz   r   r   r   r:   get_rdn_valueencode	value_ctrvaluesblob)r   base_objattrbase_dnnew_names        r   update_name_attr%drs_ReplicateRenamer.update_name_attr  ss    **55Dzz//&&X-@-@-C-CD"002080L%%a(-	 6r   c                 R   UR                   R                  nU R                  UR                   R                  5      UR                   l        [        SU< SUR                   R                  < 35        UR                   R                  U R                  :X  a  U R                  U5        gg)z1Renames the first/top-level object in a partitionzRenaming partition z --> N)r   r:   r#  r   r  r1  )r   	first_objold_dns      r   rename_top_level_object,drs_ReplicateRenamer.rename_top_level_object  s    %%(("&..1E1E1H1H"I	090D0D0G0GI 	J
 ""d&6&66!!), 7r   c                 *  > UR                   (       a4  U R                  UR                   R                  5      UR                   l        U(       a5  UR                  S:w  a%  U R	                  UR
                  R                  5        [        TU ]!  XX4XV5        g)r   r   N)	r<   r#  r:   r   r6  r   r   r  r   )r   r   r   r   r   r   r   r  s          r   r   "drs_ReplicateRenamer.process_chunk  sp    
 $(NN33E3E3H3H$IC! 3++q0(()9)9)@)@A 	e&SNr   )r   r  r  )r   r   r   r    r!   r   r#  r1  r6  r   r"   __classcell__)r  s   @r   r  r    s(    6
6JM
-O Or   r  r   )samba.dcerpcr   r   r   	samba.netr   	samba.ndrr   r~   r   r	   r
   rz   samba.dcerpc.drsuapir   r   r   r   r+   r   r6   rF   r*   r   r   r   r   r  r#   r   r   <module>r?     sy   ( 1 0        
M M 
-9 -A@=6#4L#!L*Q(F Q(l5O= 5Or   