
    b$                        d Z ddlZddlZddlZddlmc mZ ddlm	Z	 d Z
d Zd Zd Zd Zeeeeee
d	Zd
 Zd Zd Zd Zd Zd Zd ZddZedk    rddlZdZ eej                  dk    r0 edej        d         z  ej                    ej        d           ej        d         Z  eej                  dk    rej        d         Z ee e           dS dS )z(Generate LDIF from Github documentation.    N)
get_stringc                     d d g d fS N description
attributessds      B/usr/lib/python3/dist-packages/samba/ms_forest_updates_markdown.pynoopr   !   s    $D!!    c                 B    dd g |                                 dk    r|nd fS Nmodifyn/a)lowerr   s      r   parse_grantr   &   s'    dBbhhjjE&9&9tDDr   c                 |    t          |           }d|t          ||          |                                dk    r|nd fS )Naddr   )
extract_dnextract_attribr   )r   r	   r
   dns       r   	parse_addr   +   s?    	K	 	 B2~b*55RXXZZ5=P=PrrVZ[[r   c                 v    dt          |           t          |          |                                dk    r|nd fS r   )extract_dn_or_noneextract_replace_attribr   r   s      r   	parse_setr   1   s>    (55":..((**%%BB41 1r   c                 p    d }d ||           d         dd|z  gd fd ||           d         dd|z  gd fgS )	Nc                     d| v rdS d| v rdS d S )Nz
Sam-Domain)z${DOMAIN_DN}zCN=Sam-Domain,${SCHEMA_DN}z
Domain-DNS)z${...}zCN=Domain-DNS,${SCHEMA_DN}r   texts    r   extract_dn_acez!parse_ace.<locals>.extract_dn_ace;   s)    4AAT!!;;tr   r   r   zreplace: nTSecurityDescriptorz+nTSecurityDescriptor: ${DOMAIN_SCHEMA_SD}%s   z"replace: defaultSecurityDescriptorz,defaultSecurityDescriptor: ${OLD_SAMBA_SD}%sr   )r   r	   r
   r"   s       r   	parse_acer$   9   s}       ~~k2215-;b@BCGI ~~k22152<rACDHJK Kr   )GrantingCreatedSet	Added ACEUpdatedCallc                     |                      dd          } |                      dd          } t          j        d|                               d          }|dk    rdS |S )	zc
    Extract a DN from the textual description
    :param text:
    :return: DN in string form
    z in the Schema partition.z,${SCHEMA_DN}z  in the Configuration partition.z,${CONFIG_DN}z!([CDO][NCU]=.*?,)*([CDO][NCU]=.*)r   zQCN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Servicesz^CN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Services,${CONFIG_DN})replaceresearchgroup)r!   r   s     r   r   r   \   se     <<3_EED<<:OLLD	6	=	=	C	CA	F	FB 
```ooIr   c                 2    	 t          |           S #  Y dS xY w)ze
    Same as above, but returns None if it doesn't work
    :param text:
    :return: DN or None
    N)r   r    s    r   r   r   m   s%    $tts    c                    t           j                            ||           }t          |d          5 }|D ]}|\  }}}}	|                    d|z             |                    d|z             t          |          dk    r+|                    d                    |          dz              |	|                    d|	z             |                    d           	 ddd           dS # 1 swxY w Y   dS )	z
    Save ldif to disk for each updates
    :param filename: filename use ([OPERATION NUM]-{GUID}.ldif)
    :param answers: array of tuples generated with earlier functions
    :param out_folder: folder to prepend
    wdn: %s
changetype: %s
r   
NnTSecurityDescriptor: D:%s
-

)ospathjoinopenwritelen)
filenameanswers
out_folderr9   ldifanswerchanger   attribr
   s
             r   	save_ldifrE   y   s<    7<<
H--D	dC 	 D 	  	 F%+"FBJJzB'''JJ)F23336{{Q

499V,,t3444~

9B>???JJw	 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   B*C))C-0C-c                     d}|D ]V}|\  }}}}|d|z  z  }|d|z  z  }t          |          dk    r|d                    |          dz   z  }||d|z  z  }|dz  }W||| <   dS )	z
    Save ldif to an output dictionary
    :param guid: GUID to store
    :param answers: array of tuples generated with earlier functions
    :param out_dict: output dictionary
     r3   r4   r   r5   Nr6   r7   )r=   r:   )	guidr?   out_dictrA   rB   rC   r   rD   r
   s	            r   
save_arrayrJ      s     D  !'FB
R"V++v;;??DIIf%%,,D>2R77DHTNNNr   c                     d |                     d          D             }d |D             }d |D             }d |D             }|S )z
    Extract the attributes as an array from the attributes column
    :param dn: parsed from markdown
    :param attributes: from markdown
    :return: attribute array (ldif-type format)
    c                 t    g | ]5}|                                 d k    |dk     |                    d          6S r   rG   z- r   lstrip.0xs     r   
<listcomp>z"extract_attrib.<locals>.<listcomp>   s@    aaa!''))uBTBTYZ^`Y`Y`ahhtnnY`Y`Y`r   -   c                 h    g | ]/}|                     d           r|                    d d          n|0S )z: Truez: TRUEendswithr,   rP   s     r   rS   z"extract_attrib.<locals>.<listcomp>   s<    [[[qqzz(/C/CJaii(+++[[[r   c                 h    g | ]/}|                     d           r|                    d d          n|0S )z: Falsez: FALSErV   rP   s     r   rS   z"extract_attrib.<locals>.<listcomp>   s=    ^^^RSI1F1FMaii	9---A^^^r   c                 `    g | ]+}|                                                     d           )|,S )zmsds-claimpossiblevalues)r   
startswithrP   s     r   rS   z"extract_attrib.<locals>.<listcomp>   s4    XXXAqwwyy';';<V'W'WXaXXXr   split)r   r	   rD   s      r   r   r      sf     baj&6&6v&>&>aaaF[[TZ[[[F^^W]^^^FXXXXXFMr   c                 t    d |                      d          D             }d |D             }d |D             }|S )z
    Extract the attributes as an array from the attributes column
    (for replace)
    :param attributes: from markdown
    :return: attribute array (ldif-type format)
    c                 t    g | ]5}|                                 d k    |dk     |                    d          6S rM   rN   rP   s     r   rS   z*extract_replace_attrib.<locals>.<listcomp>   s@    ```eASASXY]_X_X_QXXd^^X_X_X_r   rT   c                 N    g | ]"}d |                     d          d         z  |f#S )zreplace: %s:r   r[   )rQ   lines     r   rS   z*extract_replace_attrib.<locals>.<listcomp>   s1    JJJDmdjjooa00$7JJJr   c                     g | ]	}|D ]}|
S r   r   )rQ   pairra   s      r   rS   z*extract_replace_attrib.<locals>.<listcomp>   s%    555d55T5555r   r[   )r	   liness     r   r   r      sQ     a`Z%5%5f%=%=```EJJEJJJE55e555ELr   c                 h    | j         pdd                    d | D                       z   | j        pdz   S )NrG   c              3   4   K   | ]}t          |          V  d S r   )	innertext)rQ   es     r   	<genexpr>zinnertext.<locals>.<genexpr>   s(      **	!******r   )r!   r:   tail)tags    r   rg   rg      sA    HN
**c*****+	R r   c           	      D   t          |           5 }t          j        t          j        dd|                                          d          }ddd           n# 1 swxY w Y   |                    dd          }t          j        d|z   d	z             }|D ]}|j        r|j        	                    d
          rd t          t          j        |d                                                    D             }|dd         D ]}t          j        d|d                   }	|	rC|	                    d          }
|	                    d                              d          d|
d}d}|d         	                    d          s|d         	                    d          rp|d                             d          d         |d<   t#          |d         |d         |d                   }|r|t%          |||           nt'          |
||           t(          D ]s}|d         	                    |          rVd}t)          |         |d         |d         |d                   }|r|t%          ||g|           nt'          |
|g|            nt|st+          |          
dS )z
    Read Github documentation to produce forest wide udpates
    :param in_file: Forest-Wide-Updates.md
    :param out_folder: output folder
    :param out_dict: output dictionary
    zCN=<forest root domain.*?>z${FOREST_ROOT_DOMAIN}xhtml)output_formatNzCN=Schema,%wsz${SCHEMA_DN}z<root>z</root>z
|Operationc                 h    g | ]/}|d t          |          d z
                               d          0S )r#   |)r=   r\   rP   s     r   rS   z$read_ms_markdown.<locals>.<listcomp>   sJ     R R Raq3q66A:,,S11 R R Rr   r!   )method   zOperation (\d+): {(.*)}r   r#      z-{z}.ldifF   r&   r(   r`   T)r;   markdownr-   subreadr,   ET
fromstringr!   rZ   r   tostring
splitlinesmatchr/   zfillr\   r$   rE   rJ   operation_map	Exception)in_filer@   rI   update_filehtmltreenodeupdatesupdateoutputrH   r>   foundresult	operations                  r   read_ms_markdownr      s     
g 8+ (E(?(3(8(8(:(:"< "< 078 8 88 8 8 8 8 8 8 8 8 8 8 8 8 8 8 <<88D=D9455D *, *,9 )	,--l;; )	,R R!"+d6"B"B"BCCNNPPR R RG!!""+ %, %,";VAYGG Q!<<??D17a1F1Fq1I1I1I1I444PH!9''	22 fQi6J6J;6W6W  !'q	 4 4R 8F1I&vay&)VAYGGF ;J$:!(FJ????"4:::!.  Iay++I66 
 $!.y!9&)VAYPVWXPY!Z!Z# A
(>%h*EEEE&tfXx@@@
  ,#F+++,S*, *,s   =AA A__main__rG   z4Usage: %s <Forest-Wide-Updates.md> [<output folder>])filer#   rr   )NN)!__doc__r-   r8   rv   xml.etree.ElementTreeetreeElementTreery   samba.commonr   r   r   r   r   r$   r   r   r   rE   rJ   r   r   rg   r   __name__sysr@   r=   argvprintstderrexitr   r   r   r   <module>r      s  . / . 				 				  " " " " " " " " " # # # # # #" " "
E E E
\ \ \1 1 1K K K*     "	 	 	     (  *   
 
 
  =, =, =, =,D zJJJJ
s38}}DQRT[^[effffhqkG
s38}}qXa[
Wj))))) r   