
    IdR                        d dl Z d dlZd dlmZ d dlmZ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Zd	Zi dd
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*i d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLi dMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdni dodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddēddƓddȓddʓdd̓ddΓddГddғddԓi dd֓ddؓddړddܓddޓdddddddddddddddddddddddddddddddddd dddZededededed	iZededededediZdgZ G d d	e      Z G d
 de      Zy(      N)sd_utils)
ndr_unpackndr_pack)security)SECINFO_DACL)
setup_path)DS_DOMAIN_FUNCTION_2008DS_DOMAIN_FUNCTION_2008_R2DS_DOMAIN_FUNCTION_2012DS_DOMAIN_FUNCTION_2012_R2DS_DOMAIN_FUNCTION_2016      z$27a03717-5963-48fc-ba6f-69faa33e70ed   z$3467dae5-dedd-4648-9066-f48ac186b20a   z$33b7ee33-1386-47cf-baa1-b03e06473253   z$e9ee8d55-c2fb-4723-a333-c80ff4dfbf45   z$ccfae63a-7fb5-454c-83ab-0e8e1214974e   z$ad3c7909-b154-4c16-8bf7-2c3a7870bb3d   z$26ad2ebf-f8f5-44a4-b97c-a616c8b9d09a   z$4444c516-f43a-4c12-9c4b-b5c064941d61   z$436a1a4b-f41a-46e6-ac86-427720ef29f3   z$b2b7fb45-f50d-41bc-a73b-8f580f3b636a   z$1bdf6366-c3db-4d0b-b8cb-f99ba9bce20f   z$63c0f51a-067c-4640-8a4f-044fb33f1049   z$dae441c0-366e-482e-98d9-60a99a1898cc   z$7dd09ca6-f0d6-43bf-b7f8-ef348f435617   z$6b800a81-affe-4a15-8e41-6ea0c7aa89e4   z$dd07182c-3174-4c95-902a-d64fee285bbf   z$ffa5ee3c-1405-476d-b344-7ad37d69cc25   z$099f1587-af70-49c6-ab6c-7b3e82be0fe2   z$1a3f6b15-55f2-4752-ba27-3d38a8232c4d   z$dee21a17-4e8e-4f40-a58c-c0c009b685a7   z$9bd98bb4-4047-4de5-bf4c-7bd1d0f6d21d    z$3fe80fbf-bf39-4773-b5bd-3e5767a30d2d!   z$f02915e2-9141-4f73-b8e7-2804662782da"   z$39902c52-ef24-4b4b-8033-2c9dfdd173a2#   z$20bf09b4-6d0b-4cd1-9c09-4231edf1209b$   z$94f238bb-831c-11d6-977b-00c04f613221%   z$94f238bc-831c-11d6-977b-00c04f613221&   z$94f238bd-831c-11d6-977b-00c04f613221'   z$94f238be-831c-11d6-977b-00c04f613221(   z$94f238bf-831c-11d6-977b-00c04f613221)   z$94f238c0-831c-11d6-977b-00c04f613221*   z$eda27b47-e610-11d6-9793-00c04f613221+   z$eda27b48-e610-11d6-9793-00c04f613221,   z$eda27b49-e610-11d6-9793-00c04f613221-   z$eda27b4a-e610-11d6-9793-00c04f613221.   z$26d9c510-e61a-11d6-9793-00c04f613221/   z$26d9c511-e61a-11d6-9793-00c04f6132210   z$ea08c04c-f474-4212-b19e-5e754f9210d41   z$4c0672a2-437c-4944-b953-5db8f111d6652   z$4c022fd1-adab-4d84-a7f1-9580f03da8563   z$c03b1f37-c240-4910-93c8-1544a452b4b54   z$560cf82d-9572-48a3-9024-6f2b56f1f8665   z$abd97102-88dd-4013-a009-0e2c2f967ff66   z$134428a8-0043-48a6-bcda-63310d9ec4dd7   z$d668ad1f-cedd-4565-ab02-9385926ce4f58   z$8f86b825-c322-4101-adc4-579f12d445db9   z$9fea28ff-387f-4d57-866d-3893c50f373f:   z$782370ce-3d38-438d-8b0c-464220a3039d;   z$002fb291-0d00-4b0c-8c00-fe7f50ce6f8d<   z$dcb3c95d-deb7-4c51-ad13-43a7d5d06fc7=   z$ef010a1e-bd88-48c8-a7af-2affd250d77d>   z$bd3413c0-9559-469b-9f3d-51d7faabd81a?   z$f814097b-3e3d-49ba-8a3a-092c25085f06@   z$6eb8eaf9-3403-4ba5-8b4b-ce349a4680adA   z$07e57d28-ad40-44fc-8334-8a0dc119b3f4B   z$6fd48655-1698-497a-ac8d-8267ce01c80bC   z$10338d31-2423-4dff-b4b5-ef025144b01fD   z$a96e2ed5-7a7c-4d5c-9d5d-965eca0051daE   z$613bd063-e8e9-4a62-8f4c-cda566f7eb6fF   z$2a858903-5696-4364-b4e5-4cac027ca7a6G   z$0fc5a978-0059-4b0a-9dc2-9896e8e389a1H   z$4d753a29-26ac-4d1a-bc80-311f947e4f0aI   z$3b3adbdb-4485-4559-aed8-9811c4bf90e4J   z$56040c71-fe93-4037-8fe9-1a4d1a283009K   z$caa2bfad-0cca-483b-8d00-347f943292a8L   z$2b9e0609-6d75-498a-9727-c9fcc93f0e42M   z$96541a16-910a-4b66-acde-720a0dff03c7N   z$429a6334-1a00-4515-bf48-676deb55954aO   z$21ae657c-6649-43c4-bbb3-7f184fdf58c1P   z$dca8f425-baae-47cd-b424-e3f6c76ed08bQ   z$a662b036-dbbe-4166-b4ba-21abea17f9ccR   z$9d17b863-18c3-497d-9bde-45ddb95fcb65S   z$11c39bed-4bee-45f5-b195-8da0e05b573aT   z$4664e973-cb20-4def-b3d5-559d6fe123e0U   z$2972d92d-a07a-44ac-9cb0-bf243356f345V   z$09a49cb3-6c54-4b83-ab20-8370838ba149W   z$77283e65-ce02-4dc3-8c1e-bf99b22527c2X   z$0afb7f53-96bd-404b-a659-89e65c269420Y   z$c7f717ef-fdbe-4b4b-8dfc-fa8b839fbcfaZ   z$00232167-f3a4-43c6-b503-9acb7a81b01c[   z$73a9515b-511c-44d2-822b-444a33d3bd33\   z$e0c60003-2ed7-4fd3-8659-7655a7e79397]   z$ed0c8cca-80ab-4b6b-ac5a-59b1d317e11f^   z$b6a6c19a-afc9-476b-8994-61f5b14b3f05_   z$defc28cd-6cb6-4479-8bcb-aabfb41e9713`   z$d6bd96d4-e66b-4a38-9c6b-e976ff58c56da   z$bb8efc40-3090-4fa2-8a3f-7cd1d380e695b   z$2d6abe1b-4326-489e-920c-76d5337d2dc5c   z$6b13dfb5-cecc-4fb8-b28d-0505cea24175d   z$92e73422-c68b-46c9-b0d5-b55f9c741410e   z$c0ad80b4-8e84-4cc4-9163-2f84649bcc42f   z$992fe1d0-6591-4f24-a163-c820fcb7f308g   z$ede85f96-7061-47bf-b11b-0c0d999595b5h   z$ee0f3271-eb51-414a-bdac-8f9ba6397a39i   z$587d52e0-507e-440e-9d67-e6129f33bb68j   z$ce24f0f6-237e-43d6-ac04-1e918ab04aack   z$7f77d431-dd6a-434f-ae4d-ce82928e498fl   z$ba14e1f6-7cd1-4739-804f-57d0ea74edf4m   z$156ffa2a-e07c-46fb-a5c4-fbd84a4e5ccen   z$7771d7dd-2231-4470-aa74-84a6f56fc3b6o   z$49b2ae86-839a-4ea0-81fe-9171c1b98e83p   z$1b1de989-57ec-4e96-b933-8279a8119da4q   z$281c63f0-2c9a-4cce-9256-a238c23c0db9r   z$4c47881a-f15a-4f6c-9f49-2742f7a11f4bs   z$2aea2dc6-d1d3-4f0c-9994-66c1da21de0ft   z$ae78240c-43b9-499e-ae65-2b6e0f0e202au   z$261b5bba-3438-4d5c-a3e9-7b871e5f57f0v   z$3fb79c05-8ea1-438c-8c7a-81f213aa61c2w   z$0b2be39a-d463-4c23-8290-32186759d3b1x   z$f0842b44-bc03-46a1-a860-006e8527fccdy   z$93efec15-4dd9-4850-bc86-a1f2c8e2ebb9z   z$9e108d96-672f-40f0-b6bd-69ee1f0b7ac4{   z$1e269508-f862-4c4a-b01f-420d26c4ff8c}   z$e1ab17ed-5efb-4691-ad2d-0424592c5755~   z$0e848bd4-7c70-48f2-b8fc-00fbaa82e360   z$016f23f7-077d-41fa-a356-de7cfdb01797   z$49c140db-2de3-44c2-a99a-bab2e6d2ba81   z$e0b11c80-62c5-47f7-ad0d-3734a71b8312   z$2ada1a2d-b02f-4731-b4fe-59f955e24f71z$b83818c1-01a6-4f39-91b7-a3bb581c3ae3z$bbbb9db0-4009-4368-8c40-6674e980d3c3z$f754861c-3692-4a7b-b2c2-d0fa28ed0b0bz$d32f499f-3026-4af0-a5bd-13fe5a331bd2z$38618886-98ee-4e42-8cf1-d9a2cd9edf8bz$328092fb-16e7-4453-9ab8-7592db56e9c4z$3a1c887f-df0a-489f-b3f2-2d0409095f6ez$232e831f-f988-4444-8e3e-8a352e2fd411z$ddddcf0c-bec9-4a5a-ae86-3cfe6cc6e110z$a0a45aac-5550-42df-bb6a-3cc5c46b52f2z$3e7645f3-3ea5-4567-b35a-87630449c70cz$e634067b-e2c4-4d79-b6e8-73c619324d5e)                                 r   r         |   c                       e Zd Zy)ForestUpdateExceptionN)__name__
__module____qualname__     5/usr/lib/python3/dist-packages/samba/forest_update.pyr   r      s    r   r   c                       e Zd ZdZ	 	 ddZ	 	 ddZd ZddZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)ForestUpdatez2Check and update a SAM database for forest updatesc                 P   ddl m} || _        || _        || _        || _        d| _        | j                  j                         | _        | j                  j                         | _	        | j                  j                         | _        t        j                  |      | _        t        j                  |j!                               | _        | j                  j                         | _        	 | j$                  j'                  d       | j                  j                         | _        	 | j.                  j'                  d       i | _         |t3        d      | j0                  	       y
# t(        j*                  $ r t-        d      w xY w# t(        j*                  $ r t-        d      w xY w)a  
        :param samdb: LDB database
        :param verbose: Show the ldif changes
        :param fix: Apply the update if the container is missing
        :param add_update_container: Add the container at the end of the change
        :raise ForestUpdateException:
        r   )read_ms_markdownFzCN=Operations,CN=ForestUpdatesz+Failed to add forest update container childz)CN=ActiveDirectoryUpdate,CN=ForestUpdatesz#Failed to add revision object childz/adprep/WindowsServerDocs/Forest-Wide-Updates.md)out_dictN) samba.ms_forest_updates_markdownr   samdbfixverboseadd_update_containercheck_update_appliedget_config_basedn	config_dn	domain_dnget_schema_basedn	schema_dnr   SDUtilsr   dom_sidget_domain_sid
domain_sidforestupdate_container	add_childldbLdbErrorr   revision_objectstored_ldifr   )selfr   r   r   r   r   s         r   __init__zForestUpdate.__init__   s`    	F
$8!$)!557--/557 ((/"**5+?+?+AB&*jj&B&B&D#	W''112RS  $zz;;=	O  **+VW
 $UV"&"2"2	4 || 	W'(UVV	W || 	O'(MNN	Os   )E$ $F $FF%Nc                    | j                   j                  | j                  dgt        j                        }t
        |   }|rt
        |   }|dz  }nt        }| j                  ||       t        |   }t        |d   d   d         }|rV||k  rP| j                  st        d||fz        | j                   j                  dt        | j                        |fz         yyy)a  
        Apply all updates for a given old and new functional level
        :param functional_level: constant
        :param old_functional_level: constant
        :param update_revision: modify the stored version
        :raise ForestUpdateException:
        revision)baseattrsscope   r   zERevision is not high enough. Fix is set to False.
Expected: %dGot: %dz:dn: %s
changetype: modify
replace: revision
revision: %d
 N)r   searchr   r   
SCOPE_BASEfunctional_level_to_max_update
MIN_UPDATEcheck_updates_rangefunctional_level_to_versionintr   r   modify_ldifstr)	r   functional_levelold_functional_levelupdate_revisionresexpected_update
min_updateexpected_versionfound_versions	            r   check_updates_functional_levelz+ForestUpdate.check_updates_functional_level   s    jjT%9%9'1l#..   J 99IJ78LMJ!OJ#J  _=67GHCF:.q12}/??88+ -DGWGTGV-V W W JJ"" $ 	D  !#34	$5 6  @?r   c                 v   |D ]  }|t         k  s	|t        kD  rt        d      d|cxk  rdk  rn n| j                  |       @d|cxk  rdk  rn n| j                  |       `d|cxk  rdk  rn n| j                  |       d|cxk  rd	k  rn n| j                  |        t	        | d
|z        |        y)z
        Apply a list of updates which must be within the valid range of updates
        :param iterator: Iterable specifying integer update numbers to apply
        :raise ForestUpdateException:
        Update number invalid.rX   r[   r_   r   r   r   r   r   operation_%dN)r   
MAX_UPDATEr   operation_ldifgetattr)r   iteratorops      r   check_updates_iteratorz#ForestUpdate.check_updates_iterator  s      	7BJ"z/+,DEER~2~##B'rS##B'!c!##B'!c!##B' 3nr1226	7r   c                    |}|t         k  s||kD  s	|t        kD  rt        d      ||k  r|t        v rnd|cxk  rdk  rn n| j	                  |       nud|cxk  rdk  rn n| j	                  |       nUd|cxk  rdk  rn n| j	                  |       n5d|cxk  rd	k  rn n| j	                  |       n t        | d
|z        |       |dz  }||k  ryy)z
        Apply a range of updates which must be within the valid range of updates
        :param start: integer update to begin
        :param end: integer update to end (inclusive)
        :raise ForestUpdateException:
        r   rX   r[   r_   r   r   r   r   r   r   r   N)r   r   r   missing_updatesr   r   )r   startendr   s       r   r   z ForestUpdate.check_updates_range/  s     :j0@'(@AACi_$rR##B'rS##B'!c!##B'!c!##B' 3nr1226!GB Cir   c                 d   dt         |   d| j                  }	 | j                  j                  |t        j
                  g       }t        |      dk(  sJ t        d|t         |   fz         y# t        j                  $ r-}|j                  \  }}|t        j                  k7  r Y d}~yd}~ww xY w)	zd
        :param op: Integer update number
        :return: True if update exists else False
        zCN=,)r   r   r   NFr   zSkip Forest Update %u: %sT)
update_mapr   r   r   r   r   r   argsERR_NO_SUCH_OBJECTlenprint)r   r   	update_dnr   enummsgs          r   update_existszForestUpdate.update_existsJ  s    
 #-R.$2M2MN		**##*-..*, $ .C 3x1}})RB,@@A || 	JS#c,,,		s   ,A/ /B/#B**B/c                     | j                   j                  dt        |   dt        | j                        d       t        d|t        |   fz         y)zo
        Add the corresponding container object for the given update
        :param op: Integer update
        zdn: CN=r   z
objectClass: container
zApplied Forest Update %u: %sN)r   add_ldifr   r   r   r   r   r   s     r   
update_addzForestUpdate.update_add^  sH    
 	

"~s46679 	: 	,JrN/CCDr   c                 j   | j                  |      ryt        |   }|| j                  v r| j                  |   }n|j                         | j                  v r| j                  |j                            }nJ|j	                         | j                  v r| j                  |j	                            }nt        d||fz        t        j                  |t        | j                        t        | j                        t        | j                        d      }| j                  rt        d|z         t        |       	 | j                  j                  |       | j(                  r| j+                  |       y y # t         j"                  $ r.}|j$                  \  }}|t         j&                  k7  r|Y d }~[d }~ww xY w)NTz#OPERATION %d: ldif for %s not found)	CONFIG_DNFOREST_ROOT_DOMAIN	SCHEMA_DNz!UPDATE (LDIF) ------ OPERATION %d)r   r   r   lowerupperr   sambasubstitute_varr   r   r   r   r   r   r   r   r   r   r   ERR_ATTRIBUTE_OR_VALUE_EXISTSr   r   )r   r   guidldifsub_ldifr   r   r   s           r   r   zForestUpdate.operation_ldifh  ss   b!"~4#####D)DZZ\T---##DJJL1DZZ\T---##DJJL1D'(M)+T
)3 4 4 ''/24>>/B/24>>/B/24>>/B/D E <<5:;(O	JJ""8, $$OOB % || 	JS#c777		s   7E1 1F2$F--F2c                 8    | j                   st        d|z        y)z
        Raises an exception if not set to fix.
        :param op: Integer operation
        :raise ForestUpdateException:
        z3Missing operation %d. Fix is currently set to FalseN)r   r   r   s     r   raise_if_not_fixzForestUpdate.raise_if_not_fix  s"     xx'(]`b(bcc r   c                 4   | j                  |      ry | j                  |       d}t        j                  | j                  dt        | j                        z        }| j                  j                  |d|g       | j                  r| j                  |       y y )NY(OA;CIIO;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)CN=Sam-Domain,%sdefaultSecurityDescriptor	sddl_attradd_acesr   r   r   Dnr   r   r   r   update_aces_in_daclr   r   r   r   acer   s       r   operation_88zForestUpdate.operation_88      b!b!iFF4::'9C<O'OP	)))4O475 	* 	: $$OOB %r   c                 4   | j                  |      ry | j                  |       d}t        j                  | j                  dt        | j                        z        }| j                  j                  |d|g       | j                  r| j                  |       y y )Nr   CN=Domain-DNS,%sr   r   r  r  s       r   operation_89zForestUpdate.operation_89  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y Nr   r   r   r   s     r   operation_90zForestUpdate.operation_90  -    $$T-?-?-COOB .D$r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_127zForestUpdate.operation_127  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_128zForestUpdate.operation_128  r  r   c                 4   | j                  |      ry | j                  |       d}t        j                  | j                  dt        | j                        z        }| j                  j                  |d|g       | j                  r| j                  |       y y )N7(OA;CIOI;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)r   r   r   r  r  s       r   operation_129zForestUpdate.operation_129      b!b!GFF4::'9C<O'OP	)))4O475 	* 	: $$OOB %r   c                 4   | j                  |      ry | j                  |       d}t        j                  | j                  dt        | j                        z        }| j                  j                  |d|g       | j                  r| j                  |       y y )Nr  r
  r   r   r  r  s       r   operation_130zForestUpdate.operation_130  r  r   c                     | j                  |      ry | j                  |       | j                  j                  d| j                  z  ddg       | j
                  r| j                  |       y y )Nzdn: CN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Services,%s
changetype: modify
replace: msDS-ClaimIsValueSpaceRestricted
msDS-ClaimIsValueSpaceRestricted: FALSE
zrelax:0zprovision:0)controls)r   r   r   r   r   r   r   r   s     r   operation_135zForestUpdate.operation_135  sr    b!b!

   nn	 
 *3M(B 	 	D $$OOB %r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_11zForestUpdate.operation_11  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_54zForestUpdate.operation_54  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_79zForestUpdate.operation_79  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_80zForestUpdate.operation_80  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_81zForestUpdate.operation_81  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_82zForestUpdate.operation_82  r  r   c                 d    | j                   r$| j                  |      s| j                  |       y y y r  r  r   s     r   operation_83zForestUpdate.operation_83  r  r   )FFT)NF)r   r   )r   r   r   __doc__r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r!  r#  r%  r'  r)  r+  r   r   r   r   r      s    <16&*(4V =A7<"6H7,6(E# Jd , " 
 
 
 " " &       r   r   )r   r   r   	samba.ndrr   r   samba.dcerpcr   samba.dcerpc.securityr   samba.provision.commonr   
samba.dsdbr	   r
   r   r   r   r   r   r   r   r   r   	Exceptionr   objectr   r   r   r   <module>r4     s  &    * ! . -  

I.I .I .	I
 .I .I .I .I .I .I .I .I .I .I .I  .!I" .#I$ .%I& .'I( .)I* .+I, .-I. ./I0 .1I2 .3I4 .5I6 .7I8 .9I: .;I< .=I> .?I@ .AIB .CID .EIF .GIH .IIJ .KIL .MIN .OIP .QIR .SIT .UIV .WIX .YIZ .[I\ .]I^ ._I` .aIb .cId .eIf .gIh .iIj .kIl .mIn .oIp .qIr .sIt .uIv .wIx .yIz .{I| .}I~ .I@ .AIB .CID .EIF .GIH .IIJ .KIN .OIP .QIR .SIT .UIV .WIZ .[I\ .]I^ ._I` .aIb .cId .eIf .gIh .iIj .kIl .mIn .oIp .qIr .sIt .uIv .wIx .yIz 	/{I| 	/}I~ 	/I@ 	/AIB 	/CID 	/EIF 	/GIH 	/IIJ 	/KIL 	/MIN 	/OIP 	/QIR 	/SIT 	/UIV 	/WIX 	/YIZ 	/[I\ 	/]I^ 	/_I` 	/aIb 	/cId 	/eIf 	/gIh 	/iIj 	/kIl 	/mIn 	/oIp 	/qIr 	/sIt 	/uIx 
0	/	/	/	/	/	/	/	/	/	/	/QI
X RSS"  QRR  %	I 	Y 6 Y r   