
    Idh)                        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j8                        dk(  r6 edej8                  d   z  ej<                          ej>                  d       ej8                  d   Z  eej8                        dkD  rej8                  d   Z ee e       yy)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                     | j                  d      rL| j                  d      r;|r9|j                         dk(  r&|r$|j                         dk(  rdt        |       ddgd fS dd g |j                         dk7  r|fS d fS )NzGranting the zto gMSA accounts.n/amodifyzadd: appliesToz/appliesTo: 7b8b558a-93a5-4af7-adca-c017e67f1057)
startswithendswithlowerextract_dn_or_noner   s      r   parse_grantr   &   s    /01	
((*e3	
e#,[9!#TU 	 dBbhhjE&9DDtDDr   c                 d    t        |       }d|t        ||      |j                         dk7  r|fS d fS )Naddr   )
extract_dnextract_attribr   )r   r	   r
   dns       r   	parse_addr   4   s8    	K	 B2~b*5RXXZ5=Pr[[VZ[[r   c                 ^    dt        |       t        |      |j                         dk7  r|fS d fS )Nr   r   )r   extract_replace_attribr   r   s      r   	parse_setr   :   s<    (5":.((*%B1 1+/1 1r   c                 X    d }d ||       d   dd|z  gd fd ||       d   dd|z  gd fgS )	Nc                     d| v ryd| v ryy )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_aceD   s    4AT!;r   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%   B   si     ~k215-;b@BCGI ~k2152<rACDHJK Kr   )GrantingCreatedSet	Added ACEUpdatedCallc                     | j                  dd      } | j                  dd      } t        j                  d|       j                  d      }|dk(  ry|j	                  d	      r|j                  d
d      }|dz   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}z&,CN=Extended-Rights" to gMSA accounts.z" to gMSA accounts. )replaceresearchgroupr   )r"   r   s     r   r   r   e   s     <<3_ED<<:OLD	6	=	C	CA	FB 
``o 
{{;<ZZ-r2O##Ir   c                 (    	 t        |       S #  Y y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   {   s    $s   
 c                    t         j                  j                  ||       }t        |d      5 }|D ]  }|\  }}}}	|j	                  d|z         |j	                  d|z         t        |      dkD  r#|j	                  dj                  |      dz          |	|j	                  d|	z         |j	                  d        	 ddd       y# 1 sw Y   yxY w)	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_folderr;   ldifanswerchanger   attribr
   s
             r   	save_ldifrG      s     77<<
H-D	dC 	 D 	 F%+"FBJJzB'JJ)F236{Q

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

9B>?JJw	 	  	  	 s   BCCc                     d}|D ]M  }|\  }}}}|d|z  z  }|d|z  z  }t        |      dkD  r|dj                  |      dz   z  }||d|z  z  }|dz  }O ||| <   y)	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
    r-   r5   r6   r   r7   Nr8   r9   )r?   r<   )	guidrA   out_dictrC   rD   rE   r   rF   r
   s	            r   
save_arrayrK      s     D !'FB
R"V++v;?DIIf%,,D>2R77D HTNr   c                    |j                  d      D cg c]-  }|j                         dk7  s|dk7  s|j                  d      / }}|D cg c]'  }|j                  d      r|j	                  dd      n|) }}|D cg c]'  }|j                  d      r|j	                  dd      n|) }}|D cg c]$  }|j                         j                  d	      r#|& }}|S c c}w c c}w c c}w c c}w )
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)
    -   r   r-   - z: Truez: TRUEz: Falsez: FALSEzmsds-claimpossiblevalues)splitr   lstripr   r.   r   )r   r	   xrF   s       r   r   r      s     '1&6&6v&>a!'')uBTYZ^`Y`ahhtnaFaTZ[qqzz(/Caii(+J[F[W]^RSI1Faii	9-AM^F^XAqwwy';';<V'WaXFXM b[^Xs'   CCC,C">,C'0$C,C,c                 0   | j                  d      D cg c]-  }|j                         dk7  s|dk7  s|j                  d      / }}|D cg c]  }d|j                  d      d   z  |f }}|D cg c]  }|D ]  }|  }}}|S c c}w c c}w c c}}w )z
    Extract the attributes as an array from the attributes column
    (for replace)
    :param attributes: from markdown
    :return: attribute array (ldif-type format)
    rM   r   r-   rN   zreplace: %s:r   )rO   r   rP   )r	   rQ   lineslinepairs        r   r   r      s     &0%5%5f%=`eASXY]_X_QXXd^`E`DIJDmdjjoa00$7JEJ#5d5T5T5E5L aJ5s   BBB B3Bc                 v    | j                   xs ddj                  d | D              z   | j                  xs dz   S )Nr-   c              3   2   K   | ]  }t        |        y wr   )	innertext).0es     r   	<genexpr>zinnertext.<locals>.<genexpr>   s     *	!*s   )r"   r<   tail)tags    r   rY   rY      s9    HHN
*c**+	R r   c           	         t        |       5 }|j                         }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t	        j                  |d      }d	d	d	       j                  d
d      }t        j                  d|z   dz         }|D ]@  }|j                  sd	}|j                  j                  d      rZt        t        j                  |d            j                         D 	cg c]"  }	|	dt        |	      dz
   j                  d      $ }}	nt|j                  j                  d      rYt        t        j                  |d            j                         D 	cg c]"  }	|	dt        |	      dz
   j                  d      $ }}	|s|dd	 D ]9  }
t        j                  d|
d         }|r7|j!                  d      }|j!                  d      j#                  d      d|d}d}|
d   j                  d      s|
d   j                  d      rP|
d   j                  d      d    |
d<   t%        |
d   |
d   |
d         }r|t'        |||       nt)        ||       t*        D ]T  }|
d   j                  |      sd!}t+        |   |
d   |
d   |
d         }r|t'        ||g|       nt)        |g|        n |r1t-        |
       C y	# 1 sw Y   ~xY wc c}	w c c}	w )"z
    Read Github documentation to produce forest wide updates
    :param in_file: Forest-Wide-Updates.md
    :param out_folder: output folder
    :param out_dict: output dictionary
    z<p>z<br />zCN=\\<forest root domainzCN=<forest root domainzCN=<forest root domain.*?>z${FOREST_ROOT_DOMAIN}xhtml)output_formatNzCN=Schema,%wsz${SCHEMA_DN}z<root>z</root>z
|Operationr"   )methodr$   |z| Operation   z | zOperation (\d+): {(.*)}r      z-{z}.ldifF   r'   r)   rS   T)r=   readr/   submarkdownr.   ET
fromstringr"   r   r   tostring
splitlinesr?   rO   matchr1   zfillr%   rG   rK   operation_map	Exception)in_filerB   rJ   update_filecontenthtmltreenodeupdatesrQ   updateoutputrI   r@   foundresult	operations                    r   read_ms_markdownr      s    
g 8+""$&&! " &&41 " &&60 "   /688$ <<8D==D945D 2,yy99- ""++d6"BCNNPRaq3q6A:,,S1 RG RYY!!-0 ""++d6"BCNNPRq3q6A:,,U3 RG R!!"+ %,"<fQiH!<<?D17a1F1Fq1I4PH!9''	2fQi6J6J;6W !'q	 4R 8F1I&vay&)VAYGFJ$:!(FJ?"4:!. Iay++I6 $!.y!9&)VAYPVWXPY!Z#
(>%h*E&tfXx@ #F++K%,2,-8 88RRs   A-K5'L'L5K?__main__r-   z4Usage: %s <Forest-Wide-Updates.md> [<output folder>])filer$   rd   )NN)!__doc__r/   r:   rj   xml.etree.ElementTreeetreeElementTreerk   samba.commonr   r   r   r   r   r%   rq   r   r   rG   rK   r   r   rY   r   __name__sysrB   r?   argvprintstderrexitrs   r   r   r   <module>r      s  . / 	 	  " " #"

E\1K*  ,	 (* 
P,j zJ
388}DQRT[^[e[efhhqkG
388}qXXa[
Wj) r   