a
     {a'                     @   s   d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ i fddZG dd deZdd Zdd ZdddZdS )z(Functions for setting up a Samba Schema.    )	b64encode)read_and_sub_filesubstitute_varcheck_all_substituted)security)read_ms_schema)ndr_pack)SamDB
get_string)dsdb)SCOPE_SUBTREESCOPE_ONELEVELc                 C   s   d}t j|| }t|S )Na  O:SAG:SAD:AI(OA;;CR;e12b56b6-0a95-11d1-adbb-00c04fd8d5cd;;SA)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;BA)(A;CI;RPLCLORC;;;AU)(A;CI;RPWPCRCCLCLORCWOWDSW;;;SA)(A;CI;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;ED)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;ED)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;BA)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;BA)(OA;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;ER)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;ER)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;ER)S:(AU;SA;WPCCDCWOWDSDDTSW;;;WD)(AU;CISA;WP;;;WD)(AU;SA;CR;;;BA)(AU;SA;CR;;;DU)(OU;SA;CR;e12b56b6-0a95-11d1-adbb-00c04fd8d5cd;;WD)(OU;SA;CR;45ec5156-db7e-47bb-b53f-dbeb2d03c40f;;WD))r   Z
descriptorZ	from_sddlr   )
domain_sidZname_mapZsddlZsec r   ./usr/lib/python3/dist-packages/samba/schema.pyget_schema_descriptor$   s    r   c                   @   sd   e Zd ZdddddZdddZed	d
 Zedd Zdd Zdd Z	dd Z
dd Zdd ZdS )Schema)z"MS-AD_Schema_2K8_R2_Attributes.txtzMS-AD_Schema_2K8_R2_Classes.txt/   )z0Attributes_for_AD_DS__Windows_Server_2008_R2.ldfz-Classes_for_AD_DS__Windows_Server_2008_R2.ldfr   )z)AD_DS_Attributes__Windows_Server_2012.ldfz&AD_DS_Classes__Windows_Server_2012.ldf8   )z,AD_DS_Attributes__Windows_Server_2012_R2.ldfz)AD_DS_Classes__Windows_Server_2012_R2.ldfE   )Z2008_R2_oldZ2008_R2Z20122012_R2Nc                    s  ddl m} |d u rt }|| _|| _tddd| _|d urJ| j| t	|dtj
| d  |dtj
| d  | _dd  |d urd	 fd
d|D | _t| jd|i| _t| j tt|}	t|d||	d| _tt|d}
t|d||
d| _|d ur|| _n |d| _|d urT|  jd	dd |D 7  _t| jd| _d| j| jf }| || j| j d S )Nr   )
setup_pathF)Zglobal_schemaZam_rodczad-schema/%s   c                 S   s6   t | d}| W  d    S 1 s(0    Y  d S )Nrb)openread)fileZ	data_filer   r   r   	read_fileq   s    z"Schema.__init__.<locals>.read_file c                 3   s   | ]}t  |V  qd S Nr
   ).0r   r   r   r   	<genexpr>v   s   z"Schema.__init__.<locals>.<genexpr>SCHEMADNz#provision_schema_basedn_modify.ldif)r$   Z
OBJVERSIONutf8zprovision_schema_basedn.ldif)r$   Z
DESCRIPTORzprefixMap.txtc                 s   s   | ]}d | V  qdS )z%s
Nr   )r!   mapr   r   r   r#          zdn: %s
prefixMap:: %s

)Zsamba.provisionr   r   default_base_schemabase_schemaschemadnr	   ldbZset_invocation_idr   base_schemasschema_datajoinr   r   strget_versionr   schema_dn_modifyr   r   decodeschema_dn_addZprefixmap_dataset_from_ldif)selfr   Zinvocationidr*   filesoverride_prefixmapZadditional_prefixmapr)   r   Zschema_versionZdescrZprefixmap_ldifr   r"   r   __init__R   sN    



zSchema.__init__c                   C   s   dS )z&Returns the default base schema to user   r   r   r   r   r   r(      s    zSchema.default_base_schemac                 C   s   t j|  d S )z=Returns the base schema's object version, e.g. 47 for 2008_R2   )r   r,   )r)   r   r   r   r0      s    zSchema.get_versionc                 C   s   t | j||| d S r    )r   Z_dsdb_set_schema_from_ldifr+   )r5   ZpfZdfZdnr   r   r   r4      s    zSchema.set_from_ldifc                 C   s   | j j|d | j   zB| j d | jd }| j | | j | j | j | j W n   | j    Y n0 | j 	  d S )N)Zurlzpdn: @ATTRIBUTES
linkID: INTEGER

dn: @INDEXLIST
@IDXATTR: linkID
@IDXATTR: attributeSyntax
@IDXGUID: objectGUID
z1objectGUID: 24e2ca70-b093-4ae8-84c0-2d7ac652a1b8
)
r+   ZconnectZtransaction_startZadd_ldifr3   Zmodify_ldifr1   r-   Ztransaction_cancelZtransaction_commit)r5   Zschemadb_pathr3   r   r   r   write_to_tmp_ldb   s    
	
zSchema.write_to_tmp_ldbc                 C   s   t | j| jS r    )get_linked_attributesr*   r+   r5   r   r   r   linked_attributes   s    zSchema.linked_attributesc                 C   s   t | j| jS r    )get_dnsyntax_attributesr*   r+   r<   r   r   r   dnsyntax_attributes   s    zSchema.dnsyntax_attributesc                 C   s   t | j||S r    )r   Z _dsdb_convert_schema_to_openldapr+   )r5   targetmappingr   r   r   convert_to_openldap   s    zSchema.convert_to_openldap)NNNNNN)__name__
__module____qualname__r,   r8   staticmethodr(   r0   r4   r:   r=   r?   rB   r   r   r   r   r   @   s$      
C

r   c                 C   s   ddg}|j d| t|d}i }tdt|D ]R}dt|| d d d  }|j| |dtd}|d ur,t||t|| d < q,|S )	NlinkIDlDAPDisplayNamezh(&(linkID=*)(!(linkID:1.2.840.113556.1.4.803:=1))(objectclass=attributeSchema)(attributeSyntax=2.5.5.1))
expressionbasescopeattrsr   zD(&(objectclass=attributeSchema)(linkID=%d)(attributeSyntax=2.5.5.1))r   )ZbasednrJ   Z	attributerL   )searchr   rangelenintZ	searchoner   r/   )r*   	schemaldbrM   res
attributesirJ   r@   r   r   r   r;      s$    r;   c                 C   sH   |j d| tddgd}g }tdt|D ]}|t|| d  q(|S )NzF(&(!(linkID=*))(objectclass=attributeSchema)(attributeSyntax=2.5.5.1))rG   rH   rI   r   )rN   r   rO   rP   appendr/   )r*   rR   rS   rT   rU   r   r   r   r>      s    r>   ,cn=schema,cn=configuration,dc=example,dc=comNc                 C   s*   |du rt  }n
t |}t|| |dS )aO  Load schema for the SamDB from the AD schema files and samba4_schema.ldif

    :param schemadn: DN of the schema
    :param serverdn: DN of the server

    Returns the schema data loaded as an object, with .ldb being a
    new ldb with the schema loaded.  This allows certain tests to
    operate without a remote or local schema.
    N)r*   r7   )r   Z
random_sidZdom_sidr   )r*   Z	domainsidr7   r   r   r   ldb_with_schema   s    

rX   )rW   NN)__doc__base64r   Zsambar   r   r   Zsamba.dcerpcr   Zsamba.ms_schemar   Z	samba.ndrr   Zsamba.samdbr	   Zsamba.compatr   r   r+   r   r   r   objectr   r;   r>   rX   r   r   r   r   <module>   s$       