
    b;              
          d dl Z d dlZd dlm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ddddddddZededed
ed
ediZededededediZg Z G d de          Z G d de          ZdS )    N)	b64encode)sd_utils)
ndr_unpackndr_pack)security)SECINFO_DACL)'get_managed_service_accounts_descriptor)DS_DOMAIN_FUNCTION_2008DS_DOMAIN_FUNCTION_2008_R2DS_DOMAIN_FUNCTION_2012DS_DOMAIN_FUNCTION_2012_R2DS_DOMAIN_FUNCTION_2016K   Q   z$5e1574f6-55df-493e-a671-aaeffca6a100z$d262aae8-41f7-48ed-9f35-56bbb677573dz$82112ba0-7e4c-4a44-89d9-d46c9612bf91z$c3c927a6-cc1d-47c0-966b-be8f9b63d991z$54afcfb9-637a-4251-9f47-4d50e7021211z$f4728883-84dd-483c-9897-274f2ebcf11ez$ff4f9d27-7157-4cb0-80a9-5d6f2b14c8ff)r   L   M   N   O   P   r   J   r   X         	   
      c                       e Zd ZdS )DomainUpdateExceptionN)__name__
__module____qualname__     5/usr/lib/python3/dist-packages/samba/domain_update.pyr   r   J   s        Dr#   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S )DomainUpdatez2Check and update a SAM database for domain updatesFTc                    || _         || _        || _        d| _        | j                                         | _        | j                                         | _        | j                                         | _        t          j
        |          | _	        t          j        |                                          | _        | j                                         | _        | j                            d          st%          d          | j                                         | _        | j                            d          st%          d          dS )z
        :param samdb: LDB database
        :param fix: Apply the update if the container is missing
        :param add_update_container: Add the container at the end of the change
        :raise DomainUpdateException:
        Fz(CN=Operations,CN=DomainUpdates,CN=Systemz+Failed to add domain update container childz3CN=ActiveDirectoryUpdate,CN=DomainUpdates,CN=Systemz#Failed to add revision object childN)samdbfix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get_root_basedndomainupdate_container	add_childr   revision_object)selfr(   r)   r*   s       r$   __init__zDomainUpdate.__init__Q   s    
$8!$)!5577--//5577 (//"*5+?+?+A+ABB&*j&@&@&B&B#*445_`` 	W'(UVVV#z99;;#--.cdd 	O'(MNNN	O 	Or#   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 DomainUpdateException:
        revision)baseattrsscope   r   zERevision is not high enough. Fix is set to False.
Expected: %dGot: %dz9dn: %s
changetype: modify
replace: revision
revision: %d
N)r(   searchr8   ldb
SCOPE_BASEfunctional_level_to_max_update
MIN_UPDATEcheck_updates_rangefunctional_level_to_versionintr)   r   modify_ldifstr)	r9   functional_levelold_functional_levelupdate_revisionresexpected_update
min_updateexpected_versionfound_versions	            r$   check_updates_functional_levelz+DomainUpdate.check_updates_functional_leveln   s?    jT%9'1l#.   J J 99IJ 	$78LMJ!OJJ#J  _===67GHCF:.q122 		5}/???8 W+ -DGWGTGV-V W W W J"" $ 4  "23	$4 5 5 5 5 5		5 		5??r#   c                     |D ]C}|t           k     s|t          k    rt          d           t          | d|z            |           Dd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 DomainUpdateException:
        Update number invalid.operation_%dN)rE   
MAX_UPDATEr   getattr)r9   iteratorops      r$   check_updates_iteratorz#DomainUpdate.check_updates_iterator   sa      	3 	3BJ"z//+,DEEE /GD.2-..r2222	3 	3r#   r   c                     |}|t           k     s||k    s|t          k    rt          d          ||k    r2|t          vr t	          | d|z            |           |dz  }||k    0d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 DomainUpdateException:
        rU   rV   r@   N)rE   rW   r   missing_updatesrX   )r9   startendrZ   s       r$   rF   z DomainUpdate.check_updates_range   s     :j0@0@'(@AAACii((2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))r=   
expressionFr@   )r(   rA   r6   
update_maprB   LdbErrorlen)r9   rZ   rN   s      r$   update_existszDomainUpdate.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)r(   add_ldifrb   rJ   r6   r9   rZ   s     r$   
update_addzDomainUpdate.update_add   sN    
 	
"~~~s4677779 	: 	: 	: 	: 	: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   )r9   dnexisting_sddlaceindexnew_sddls         r$   insert_ace_into_daclz!DomainUpdate.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 |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)r=   r>   rp   r@   r   rl   rm   NFrelax:0ro   T)
r(   rA   rd   rq   rB   Messagers   MessageElementFLAG_MOD_REPLACEmodify)	r9   rs   ru   attrmsgrt   rv   rw   ms	            r$   insert_ace_into_stringz#DomainUpdate.insert_ace_into_string   s    jR'+f*>)?   A A 3xx1}}}}AtQ##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 DomainUpdateException:
        z3Missing operation %d. Fix is currently set to FalseN)r)   r   ri   s     r$   raise_if_not_fixzDomainUpdate.raise_if_not_fix  s0     x 	d'(]`b(bccc	d 	dr#   c                     |                      |          rd S |                     |           | j                            d| j        z  ddg           | j        r|                     |           d S d S )NzVdn: CN=TPM Devices,%s
objectClass: top
objectClass: msTPM-InformationObjectsContainer
r{   provision:0ro   )re   r   r(   rh   r.   r*   rj   ri   s     r$   operation_78zDomainUpdate.operation_78  s    b!! 	Fb!!!
  n '0%?	 	 	A 	A 	A $ 	 OOB	  	 r#   c                    |                      |          rd S |                     |           d}| j                            ddgdg          }|D ]^}t	          t
          j        |d         d                   }|                    | j                  }| 	                    |j
        ||           _| j                            ddgdg          }|D ]^}t	          t
          j        |d         d                   }|                    | j                  }| 	                    |j
        ||           _| j        r|                     |           d S d S )NzY(OA;CIIO;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)(objectClass=samDomain)nTSecurityDescriptorrz   ra   r>   rp   r   (objectClass=domainDNS)re   r   r(   rA   r   r   
descriptoras_sddlr4   rx   rs   r*   rj   r9   rZ   ru   rN   r   existing_sdrt   s          r$   operation_79zDomainUpdate.operation_79  s   b!! 	Fb!!!ij+D'=&>*>)?   A A  	B 	BC$X%8%()?%@%CE EK'//@@M%%cfmSAAAAj+D'=&>*>)?   A A  	B 	BC$X%8%()?%@%CE EK'//@@M%%cfmSAAAA$ 	 OOB	  	 r#   c                     |                      |          rd S |                     |           dt          | j                  z  }| j                            | j        t          j        dgddt          z  g          }|d         }t          t          j        |d         d                   }|                    | j                  }|                     |j        ||           | j        r|                     |           d S d S )Nz5(OA;;CR;3e0f7e18-2c7a-4c10-ba82-4d926db99a3e;;%s-522)r   rz   rn   )r=   r?   r>   rp   r   )re   r   rJ   r4   r(   rA   r.   rB   rC   r   r   r   r   r   rx   rs   r*   rj   r   s          r$   operation_80zDomainUpdate.operation_809  s   b!! 	Fb!!!EDOH\H\\jT^&)n'=&>*>*9L*H*J   K K
 !f !4!$%;!<Q!?A A#++DO<<!!#&-===$ 	 OOB	  	 r#   c                    |                      |          rd S |                     |           d}| j                            ddgdg          }|D ]^}t	          t
          j        |d         d                   }|                    | j                  }| 	                    |j
        ||           _| j                            ddgdg          }|D ]^}t	          t
          j        |d         d                   }|                    | j                  }| 	                    |j
        ||           _| j        r|                     |           d S d S )Nz7(OA;CIOI;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)r   r   rz   r   r   r   r   r   s          r$   operation_81zDomainUpdate.operation_81R  s   b!! 	Fb!!!Gj+D'=&>*>)?   A A  	B 	BC$X%8%()?%@%CE EK'//@@M%%cfmSAAAAj+D'=&>*>)?   A A  	B 	BC$X%8%()?%@%CE EK'//@@M%%cfmSAAAA$ 	 OOB	  	 r#   c                 |   |                      |          rd S |                     |           t          | j                  }t	          |                              d          }dt          | j                  z  }| j        	                    d|d|ddg           | j
        r|                     |           d S d S )Nutf8CN=Managed Service Accounts,%sdn: z
changetype: add
objectClass: container
description: Default container for managed service accounts
showInAdvancedViewOnly: FALSE
nTSecurityDescriptor:: r{   r   ro   )re   r   r	   r4   r   decoderJ   r.   r(   rI   r*   rj   )r9   rZ   r   managedservice_descrmanaged_service_dns        r$   operation_75zDomainUpdate.operation_75v  s    b!! 	Fb!!!<T_MM
(44;;FCC=  	

 !3 2 24H4H J *3M(B 	 	D 	D 	D $ 	 OOB	  	 r#   c                 6   |                      |          rd S |                     |           dt          | j                  z  }| j                            dt          | j                  d|dddg           | j        r|                     |           d S d S )Nr   r   zl
changetype: modify
add: otherWellKnownObjects
otherWellKnownObjects: B:32:1EB93889E40C45DF9F0C64D23BBB6237:
r{   r   ro   )re   r   rJ   r.   r(   rI   r*   rj   )r9   rZ   r   s      r$   operation_76zDomainUpdate.operation_76  s    b!! 	Fb!!!=  	
 4>...	 0 <E;H;J	 	 	K 	K 	K $ 	 OOB	  	 r#   c                     |                      |          rd S |                     |           | j                            dt	          | j                  z  ddg           | j        r|                     |           d S d S )NzFdn: CN=PSPs,CN=System,%s
objectClass: top
objectClass: msImaging-PSPs
r{   r   ro   )re   r   r(   rh   rJ   r.   r*   rj   ri   s     r$   operation_77zDomainUpdate.operation_77  s    b!! 	Fb!!!
  
$. &/$> 	 	@ 	@ 	@
 $ 	 OOB	  	 r#   )FT)NF)r   r   )r   r    r!   __doc__r:   rS   r[   rF   re   rj   rx   r   r   r   r   r   r   r   r   r   r"   r#   r$   r&   r&   N   s2       <<"'&*O O O O< =A7<"5 "5 "5 "5H3 3 3   "  : : :  0! ! !Fd d d          >     2     H     ,     &         r#   r&   )rB   sambabase64r   r   	samba.ndrr   r   samba.dcerpcr   samba.dcerpc.securityr   samba.descriptorr	   
samba.dsdbr
   r   r   r   r   rE   rW   rb   rD   rG   r]   	Exceptionr   objectr&   r"   r#   r$   <module>r      s  & 


              * * * * * * * * ! ! ! ! ! ! . . . . . .                   

 	/...... 
 RRR"  QQR  	 	 	 	 	I 	 	 	\  \  \  \  \ 6 \  \  \  \  \ r#   