a
     ’{a«%  ã                   @   s¾  d dl mZ d dlZd dlZd dlZd dlmZ i Zdddddd	d
ddddddddddœed< ddddddddd	ddddddd dœed< ddied< e d¡ 	d¡e d¡ 	d¡e d ¡ 	d¡e d!¡ 	d¡e d"¡ 	d¡e d#¡ 	d¡e d$¡ 	d¡d%œZ
eg d&¢ƒZd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd<d7d8„Zed9krºd dlZzejd Zejd ZW n6 eyª   ed:ejd   ejd; e d¡ Y n0 eeeeƒƒ dS )=é    )Úprint_functionN)Ústring_typesé   é   é   é   é   é   é   é   é   é   é   é   é   )Z	fATTINDEXZfPDNTATTINDEXZfANRZfPRESERVEONDELETEZfCOPYZfTUPLEINDEXZfSUBTREEATTINDEXZfCONFIDENTIALZfCONFIDENTAILZfNEVERVALUEAUDITZfRODCAttributeZfRODCFilteredAttributeZfRODCFILTEREDATTRIBUTEZfEXTENDEDLINKTRACKINGZ	fBASEONLYZfPARTITIONSECRETZsearchflagsé   é   é   é   é   é   )ZFLAG_ATTR_NOT_REPLICATEDZFLAG_CR_NTDS_NCZ FLAG_ATTR_REQ_PARTIAL_SET_MEMBERZFLAG_CR_NTDS_DOMAINZFLAG_ATTR_IS_CONSTRUCTEDZFLAG_CR_NTDS_NOT_GC_REPLICATEDZFLAG_ATTR_IS_OPERATIONALZFLAG_SCHEMA_BASE_OBJECTZFLAG_ATTR_IS_RDNZFLAG_DISALLOW_MOVE_ON_DELETEZFLAG_DOMAIN_DISALLOW_MOVEZFLAG_DOMAIN_DISALLOW_RENAMEZFLAG_CONFIG_ALLOW_LIMITED_MOVEZFLAG_CONFIG_ALLOW_MOVEZFLAG_CONFIG_ALLOW_RENAMEZFLAG_DISALLOW_DELETEZsystemflagsZFLAG_ATTR_IS_CRITICALZschemaflagsexs	   +‡s …>Úutf8s
   *†H†÷s   Vs
   *†H†÷s	   +‡s …Js	   +‡s …\s
   *†H†÷)z1.3.12.2.1011.28.0.702z1.2.840.113556.1.1.1.12z2.6.6.1.2.5.11.29z1.2.840.113556.1.1.1.11z1.3.12.2.1011.28.0.714z1.3.12.2.1011.28.0.732z1.2.840.113556.1.1.1.6)ZauxiliaryclassZ
maycontainZmustcontainZposssuperiorsZsystemauxiliaryclassZsystemmaycontainZsystemmustcontainZsystemposssuperiorsc                 C   sb   |}|   ¡ }|dd… dkr:|dkr,|dks0J ‚|| }q|dkrR|}|dkrXqZq|}qZq||fS )z- reads a line from an LDIF file, unfolding itNr   ú Ú Ú
)Úreadline)ÚfÚbufferÚlineÚl© r    ú1/usr/lib/python3/dist-packages/samba/ms_schema.pyÚ__read_folded_line[   s    
r"   c                 c   sÀ   ddl }t d¡}d}g }t| |ƒ\}}|dd… dkr:q|dks¢|dkrLq¢| |¡}|r‚|dd… dkrv|dd… }| |¡ qtd	| d
|jd | d¡ qt	|ƒr°|V  |dkrq¼qdS )z)reads an LDIF entry, only unfolding linesr   Nz^([A-Za-z]+[A-Za-z0-9-]*):r   r   ú#r   éÿÿÿÿzInvalid line: %sr   )ÚendÚfile)
ÚsysÚreÚcompiler"   ÚmatchÚappendÚprintÚstderrÚexitÚlen)r   r'   Zattr_type_rer   Úentryr   Úmr    r    r!   Ú__read_raw_entries|   s(    

r2   c                 C   sf   |   d¡dkr2|  dd¡} |  dd¡} |  dd¡S |  d¡rH|  d	d¡S |  d
¡r^|  dd¡S | S dS )z"fix a string DN to use ${SCHEMADN}z<RootDomainDN>r$   ú
 r   r   z)CN=Schema,CN=Configuration,<RootDomainDN>z${SCHEMADN}zDC=XzCN=Schema,CN=Configuration,DC=XzCN=XzCN=Schema,CN=Configuration,CN=XN)ÚfindÚreplaceÚendswith)Údnr    r    r!   Úfix_dn£   s    

r8   c                 C   s‚   t |tƒsJ ‚| dd¡}| dd¡}zt|ƒ}W nF tyx   d}| d¡}|D ] }t|  | }|dd| > B }qRY n0 t|ƒS )z%Evaluate the OR expression in 'value'r3   r   r   r   ú|r   r   )Ú
isinstancer   r5   ÚintÚ
ValueErrorÚsplitÚ	bitFieldsÚstr)ÚkeyÚvalueÚoÚflagsr   Zbitposr    r    r!   Ú__convert_bitfield³   s    
rD   c                 C   s~   g }| D ]j}t |d tƒr&|d g}n|d }|d rR| d|d |d f ¡ q|D ]}| d|d |f ¡ qVqd |¡S )zWrite out entry as LDIFr   r   z%s:: %sr   z%s: %sr   )r:   r   r+   Újoin)r0   Úoutr   ZvlÚvr    r    r!   Ú__write_ldif_oneÇ   s    rH   c                 C   sD  dd„ | D ƒ} d}d } } }}| D ]l}|d   d¡rZ| d¡ |d dd	… |d< n
| d¡ |d
  ¡ }|d  ¡ |d< |d  ¡ |d< |s¤|dkr¤|d }|tv ræ|d  dd¡|d< |d  dd¡|d< |d  d¡|d< |tv rt	||d ƒ|d< |dkr2|d s2t
|d  ¡  |d< d|d< t|d tƒrRt|d ƒ|d< |dkrhd}|d }	|dkrxd}q&|dkrˆd}q&|dkr&d}q&|s J ‚g }
|sÀ|
 dd| dg¡ n|
 d|	dg¡ |sê|
 dd|gdg¡ |s |
 d|dg¡ |s|
 d|dg¡ |
 dtt ¡ ƒdg¡ |
dd„ | D ƒ } | S )z}Perform transformations required to convert the LDIF-like schema
       file entries to LDIF, including Samba-specific stuff.c                 S   s   g | ]}|  d d¡‘qS )ú:r   )r=   )Ú.0r   r    r    r!   Ú
<listcomp>ß   ó    z%__transform_entry.<locals>.<listcomp>r   Fr   z: Tr   Nr   Úcnr3   r   ú,Zomobjectclassr7   ZobjectclassZadmindisplaynameZadmindescriptionzCN=%s,${SCHEMADN}ÚobjectClassÚtopZadminDescriptionZadminDisplayNameZ
objectGUIDc                 S   s(   g | ] }|d    ¡ tg d¢ƒvr|‘qS )r   )r7   Z
changetypeZobjectcategory)ÚlowerÚset)rJ   Úxr    r    r!   rK      rL   )Ú
startswithr+   rQ   ÚlstripÚrstripÚmultivalued_attrsr5   r=   r>   rD   ÚoMObjectClassBERÚstripr:   r   r8   r?   ÚuuidZuuid4)r0   rO   rM   Zskip_dnZskip_objectclassZskip_admin_descriptionZskip_admin_display_namer   r@   r7   Úheaderr    r    r!   Ú__transform_entryÛ   s`    









r\   c                 C   sj   g }ddl m} || ddd2}t|ƒD ]}| tt||ƒƒ¡ q(W d  ƒ n1 sV0    Y  d |¡S )z!Load and transform a schema file.r   )ÚopenÚrzlatin-1)ÚencodingNú

)Úior]   r2   r+   rH   r\   rE   )ÚfilenamerO   rF   r]   r   r0   r    r    r!   Ú__parse_schema_file%  s    4rc   TFc                 C   s4   d}d}|rt | dƒ}|r$t |dƒ}|d | d S )z-Read WSPP documentation-derived schema files.r   ZattributeSchemaZclassSchemar`   )rc   )Ú	attr_fileÚclasses_fileZdump_attributesZdump_classesÚdebugZ	attr_ldifZclasses_ldifr    r    r!   Úread_ms_schema2  s    

rg   Ú__main__z(Usage: %s attr-file.txt classes-file.txt)r&   )TTF)Z
__future__r   r(   Úbase64rZ   Zsamba.compatr   r>   Z	b64encodeÚdecoderX   rR   rW   r"   r2   r8   rD   rH   r\   rc   rg   Ú__name__r'   Úargvrd   re   Ú
IndexErrorr,   r-   r.   r    r    r    r!   Ú<module>   s€   í
ó
ÿù!'J


