
    bO                     F   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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMi dNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}Zed~ededed	ediZededededediZdgZ G d de          Z G d de          ZdS )    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-      5   z$134428a8-0043-48a6-bcda-63310d9ec4ddO   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-3734a71b8312z$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                        N   rC   rN                  |   c                       e Zd ZdS )ForestUpdateExceptionN)__name__
__module____qualname__     5/usr/lib/python3/dist-packages/samba/forest_update.pyrW   rW      s        Dr\   rW   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d ZdS )!ForestUpdatez2Check and update a SAM database for forest updatesFTc                    ddl m} || _        || _        || _        || _        d| _        | j                                        | _        | j        	                                | _	        | j        
                                | _        t          j        |          | _        t          j        |                                          | _        | j                                        | _        | j                            d          st)          d          | j                                        | _        | j                            d          st)          d          i | _         |t/          d          | j        	           d
S )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_markdownra   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_childrW   revision_objectstored_ldifr   )selfrd   rf   re   rg   ra   s         r]   __init__zForestUpdate.__init__   sj    	FEEEEE
$8!$)!5577--//5577 (//"*5+?+?+A+ABB&*j&B&B&D&D#*445UVV 	W'(UVVV#z;;==#--.YZZ 	O'(MNNN $UVV"&"2	4 	4 	4 	4 	4 	4r\   Nc                    | j                             | j        dgt          j                  }t
          |         }|rt
          |         }|dz  }nt          }|                     ||           t          |         }t          |d         d         d                   }|rT||k     rP| j
        st          d||fz            | j                             dt          | j                  |fz             dS dS dS )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)rd   searchrt   ldb
SCOPE_BASEfunctional_level_to_max_update
MIN_UPDATEcheck_updates_rangefunctional_level_to_versionintre   rW   modify_ldifstr)	rv   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?    jT%9'1l#.   J J 99IJ 	$78LMJ!OJJ#J  _===67GHCF:.q122 		6}/???8 W+ -DGWGTGV-V W W W J"" $ 	D !!#34	$5 6 6 6 6 6		6 		6??r\   c                 v   |D ]}|t           k     s|t          k    rt          d          d|cxk    rdk    rn n|                     |           Md|cxk    rdk    rn n|                     |           sd|cxk    rdk    rn n|                     |            t	          | d|z            |           d	S )
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.r   r   r   r?   rD   rG   operation_%dN)r   
MAX_UPDATErW   operation_ldifgetattr)rv   iteratorops      r]   check_updates_iteratorz#ForestUpdate.check_updates_iterator   s      	7 	7BJ"z//+,DEEER~~~~2~~~~~##B''''rS##B''''!!!!c!!!!!##B'''' 3nr12226666	7 	7r\   r   c                    |}|t           k     s||k    s|t          k    rt          d          ||k    r|t          v rnd|cxk    rdk    rn n|                     |           nhd|cxk    rdk    rn n|                     |           nBd|cxk    rdk    rn n|                     |           n t          | d|z            |           |d	z  }||k    d
S d
S )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   r   r   r   r?   rD   rG   r   r}   N)r   r   rW   missing_updatesr   r   )rv   startendr   s       r]   r   z ForestUpdate.check_updates_range   s"    :j0@0@'(@AAACii_$$rR##B''''rS##B''''!!!!c!!!!!##B'''' 3nr1222666!GB Ciiiiiir\   c                     	 | j                             | j        dt          |         z            }n# t          j        $ r Y dS w xY wt          |          dk    S )zd
        :param op: Integer update number
        :return: True if update exists else False
        z(CN=%s))rz   
expressionFr}   )rd   r~   rr   
update_mapr   LdbErrorlen)rv   r   r   s      r]   update_existszForestUpdate.update_exists   sn    
	*##)D/8:b>/I $ K KCC| 	 	 	55	 3xx1}s   /2 AAc                     | j                             dt          |         dt          | j                  d           dS )zo
        Add the corresponding container object for the given update
        :param op: Integer update
        zdn: CN=,z
objectClass: container
N)rd   add_ldifr   r   rr   rv   r   s     r]   
update_addzForestUpdate.update_add  sN    
 	
"~~~s4677779 	: 	: 	: 	: 	:r\   c                    |                      |          rdS | j        t          |                  }t          j        |t          | j                  t          | j                  t          | j                  d          }| j	        r!t          d|z             t          |           | j                            |           | j        r|                     |           d S d S )NT)	CONFIG_DNFOREST_ROOT_DOMAIN	SCHEMA_DNz!UPDATE (LDIF) ------ OPERATION %d)r   ru   r   sambasubstitute_varr   rj   rk   rm   rf   printrd   r   rg   r   )rv   r   ldifsub_ldifs       r]   r   zForestUpdate.operation_ldif  s    b!! 	4
2/'/24>/B/B/24>/B/B/24>/B/B/D /D E E < 	5:;;;(OOO
x((($ 	 OOB	  	 r\   c                     |                     d          }|dk    r|d|         |z   ||d         z   }n||z   }||v rdS | j                            ||dt          z  g           dS )a  
        Add an ACE to a DACL, checking if it already exists with a simple string search.

        :param dn: DN to modify
        :param existing_sddl: existing sddl as string
        :param ace: string ace to insert
        :return: True if modified else False
        S:NFsd_flags:1:%dcontrolsT)rfindr   modify_sd_on_dnr   )rv   dnexisting_sddlaceindexnew_sddls         r]   insert_ace_into_daclz!ForestUpdate.insert_ace_into_dacl)  s     ##D))B;;$VeV,s2]5665JJHH %s*H-5%%b(0?,0N/O 	& 	Q 	Q 	Q tr\   c                    | j                             ||gdg          }t          |          dk    sJ t          |d         |         d                   }|                    d          }|dk    r|d|         |z   ||d         z   }n||z   }||v rdS t          j                    }||_        t          j        |t
          j	        |          ||<   | j         
                    |d	g
           dS )aC  
        Insert an ACE into a string attribute like defaultSecurityDescriptor.
        This also checks if it already exists using a simple string search.

        :param dn: DN to modify
        :param ace: string ace to insert
        :param attr: attribute to modify
        :return: True if modified else False
        search_options:1:2)rz   r{   r   r}   r   r   r   NFrelax:0r   T)rd   r~   r   r   r   r   Messager   MessageElementFLAG_MOD_REPLACEmodify)	rv   r   r   attrmsgr   r   r   ms	            r]   insert_ace_into_stringz#ForestUpdate.insert_ace_into_stringA  s    jR'+f*>)?   A A 3xx1}}}}CF4LO,,##D))B;;$VeV,s2]5665JJHH %s*H-5KMM$Xs/C%)+ +$ 	
!yk222tr\   c                 8    | j         st          d|z            dS )z
        Raises an exception if not set to fix.
        :param op: Integer operation
        :raise ForestUpdateException:
        z3Missing operation %d. Fix is currently set to FalseN)re   rW   r   s     r]   raise_if_not_fixzForestUpdate.raise_if_not_fixd  s0     x 	d'(]`b(bccc	d 	dr\   c                 ,   |                      |          rd S |                     |           d}t          j        | j        dt          | j                  z            }|                     ||d           | j                            ddgdg          }|D ]^}t          t          j        |d         d	                   }|                    | j                  }|                     |j        ||           _| j        r|                     |           d S d S )
NY(OA;CIIO;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)CN=Sam-Domain,%sdefaultSecurityDescriptorr   (objectClass=samDomain)nTSecurityDescriptorr   r   r{   r   r   r   r   r   Dnrd   r   rm   r   r~   r   r   
descriptoras_sddlrq   r   r   rg   r   rv   r   r   rm   r   r   existing_sdr   s           r]   operation_88zForestUpdate.operation_88s  s?   b!! 	Fb!!!iF4:'9C<O<O'OPP	##Is)D 	$ 	F 	F 	F j+D'=&>*>)?   A A  	B 	BC$X%8#>T:UVW:XYYK'//@@M%%cfmSAAAA$ 	 OOB	  	 r\   c                 >   |                      |          rd S |                     |           d}t          j        | j        dt          | j                  z            }|                     ||d           | j                            ddgddt          z  g	          }|D ]^}t          t          j        |d         d
                   }|                    | j                  }|                     |j        ||           _| j        r|                     |           d S d S )Nr   CN=Domain-DNS,%sr   r   (objectClass=domainDNS)r   r   r   r   r   )r   r   r   r   rd   r   rm   r   r~   r   r   r   r   r   rq   r   r   rg   r   r   s           r]   operation_89zForestUpdate.operation_89  sJ   b!! 	Fb!!!iF4:'9C<O<O'OPP	##Is)D 	$ 	F 	F 	F j+D'=&>*>*9L*H*J   K K
  	B 	BC$X%8#>T:UVW:XYYK'//@@M%%cfmSAAAA$ 	 OOB	  	 r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S Nrg   r   r   r   s     r]   operation_90zForestUpdate.operation_90  N    $ 	 T-?-?-C-C 	 OOB	  	  	  	 r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_127zForestUpdate.operation_127  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_128zForestUpdate.operation_128  r   r\   c                 ,   |                      |          rd S |                     |           d}t          j        | j        dt          | j                  z            }|                     ||d           | j                            ddgdg          }|D ]^}t          t          j        |d         d	                   }|                    | j                  }|                     |j        ||           _| j        r|                     |           d S d S )
N7(OA;CIOI;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)r   r   r   r   r   r   r   r   r   r   s           r]   operation_129zForestUpdate.operation_129  s?   b!! 	Fb!!!GF4:'9C<O<O'OPP	##Is)D 	$ 	F 	F 	F j+D'=&>*>)?   A A  	B 	BC$X%8#>T:UVW:XYYK'//@@M%%cfmSAAAA$ 	 OOB	  	 r\   c                 ,   |                      |          rd S |                     |           d}t          j        | j        dt          | j                  z            }|                     ||d           | j                            ddgdg          }|D ]^}t          t          j        |d         d	                   }|                    | j                  }|                     |j        ||           _| j        r|                     |           d S d S )
Nr   r   r   r   r   r   r   r   r   r   r   s           r]   operation_130zForestUpdate.operation_130  s?   b!! 	Fb!!!GF4:'9C<O<O'OPP	##Is)D 	$ 	F 	F 	F j+D'=&>*>)?   A A  	B 	BC$X%8#>T:UVW:XYYK'//@@M%%cfmSAAAA$ 	 OOB	  	 r\   c                     |                      |          rd S |                     |           | j                            d| j        z  ddg           | j        r|                     |           d S d S )Nzdn: CN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Services,%s
changetype: modify
replace: msDS-ClaimIsValueSpaceRestricted
msDS-ClaimIsValueSpaceRestricted: FALSE
r   zprovision:0r   )r   r   rd   r   rj   rg   r   r   s     r]   operation_135zForestUpdate.operation_135  s    b!! 	Fb!!!
   n	 
 *3M(B 	 	D 	D 	D $ 	 OOB	  	 r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_53zForestUpdate.operation_53  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_79zForestUpdate.operation_79  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_80zForestUpdate.operation_80  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_81zForestUpdate.operation_81
  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_82zForestUpdate.operation_82  r   r\   c                 p    | j         r,|                     |          s|                     |           d S d S d S r   r   r   s     r]   operation_83zForestUpdate.operation_83  r   r\   )FFT)NF)r   r   )rX   rY   rZ   __doc__rw   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&*$4 $4 $4 $4N =A7<"6 "6 "6 "6H7 7 7(   2  : : :     *  0! ! !Fd d d     <     4     
     
     
     0     2     &                                  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   	ExceptionrW   objectr_   r[   r\   r]   <module>r     s  & 


        * * * * * * * * ! ! ! ! ! ! . . . . . . - - - - - -              

E.E .E .	E
 .E .E .E .E .E .E .E .E .E .E  .!E" .#E$ .%E& .'E E( .)E* .+E, .-E. ./E0 .1E2 	/3E4 	/5E6 	/7E8 	/9E: 	/;E< 	/=E> 	/?E@ 	/AEB 	/CED 	/EEF 	/GEH 	/IE E EJ 	/KEL 	/MEN 	/OEP 	/QER 	/SET 	/UEV 	/WEX 	/YEZ 	/[E\ 	/]E^ 	/_E` 	/aEb 	/cEd 	/eEf 	/gEh 	/iEj 	/kE El 
0	/	/	/	/	/	/	/	/	/	/	/	/IE E E
P RSS"  QRR  %	 	 	 	 	I 	 	 	P  P  P  P  P 6 P  P  P  P  P r\   