
    Id)                         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 ddZ G d de      Zd Zd Z	 	 	 ddZy)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_ONELEVELNc                 d    |i }d}t         j                  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;;RO)(OA;;CR;1131f6ad-9c07-11d1-f79f-00c04fc2dcd2;;RO)(OA;;CR;89e95b76-444d-4c62-991a-0facbeda640c;;RO)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   
descriptor	from_sddlr	   )
domain_sidname_mapsddlsecs       ./usr/lib/python3/dist-packages/samba/schema.pyget_schema_descriptorr   $   s9    AD. 


'
'j
9CC=    c                   j    e Zd ZdddddddZ	 	 	 dd	Zed
        Zed        Zd Zd Z	d Z
d Zd Zy)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-Attributes_for_AD_DS__Windows_Server_2012.ldfz*Classes_for_AD_DS__Windows_Server_2012.ldf8   )z,AD_DS_Attributes__Windows_Server_2012_R2.ldfz)AD_DS_Classes__Windows_Server_2012_R2.ldfE   )z*AD_DS_Attributes__Windows_Server_v1803.ldfz'AD_DS_Classes__Windows_Server_v1803.ldfW   )z)AD_DS_Attributes_Windows_Server_v1903.ldfz&AD_DS_Classes_Windows_Server_v1903.ldfX   )2008_R2_old2008_R220122012_R220162019Nc                 T   ddl m} 	 |t        j                         }|| _        || _        t        dd      | _        || j                  j                  |       t         |dt        j                  |   d   z         |dt        j                  |   d   z              | _        d |dj                  fd	|D              | _        t        | j                  d
|i      | _        t        | j                         t        t        j!                  |            }	t#         |d      ||	d      | _        t'        t)        |            j+                  d      }
t#         |d      ||
d      | _        ||| _        n  |d            | _        |+| xj.                  dj                  d |D              z  c_        t'        | j.                        j+                  d      | _        d| j
                  d| j.                  d}| j1                  || j                  | j
                         y )Nr   )
setup_pathF)global_schemaam_rodczad-schema/%s   c                 f    t        | d      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nrb)openread)file	data_files     r   	read_filez"Schema.__init__.<locals>.read_filez   s-    dD! (Y ~~'( ( (s   '0 c              3   @   K   | ]  }t         |              y wNr   ).0r0   r2   s     r   	<genexpr>z"Schema.__init__.<locals>.<genexpr>   s"      ':+/ (2)D/'B ':s   SCHEMADNz#provision_schema_basedn_modify.ldif)r8   
OBJVERSIONutf8zprovision_schema_basedn.ldif)r8   
DESCRIPTORzprefixMap.txtc              3   &   K   | ]	  }d |z    yw)z%s
N )r6   maps     r   r7   z"Schema.__init__.<locals>.<genexpr>   s     *XC6C<*Xs   zdn: z
prefixMap:: z

)samba.provisionr(   r   default_base_schemabase_schemaschemadnr
   ldbset_invocation_idr   base_schemasschema_datajoinr   r   strget_versionr   schema_dn_modifyr   r   decodeschema_dn_addprefixmap_dataset_from_ldif)selfr   invocationidrB   filesoverride_prefixmapadditional_prefixmaprA   r(   schema_versiondescrprefixmap_ldifr2   s               @r   __init__zSchema.__init__[   s    	/	  446K&  ue<#HH&&|4)~(;(;K(H(KKL~(;(;K(H(KKLN	( !ww ':38':  :D *$*:*:+5x*@Bd../V//<= 1<=!@!B /
;<CCFK.56!79 )"4D"+J,G"HD+277*XCW*X#XX'(;(;<CCFK :>H[H[\>4+;+;T]]Kr   c                       y)z&Returns the default base schema to user$   r=   r=   r   r   r@   zSchema.default_base_schema   s     r   c                 .    t         j                  |    d   S )z=Returns the base schema's object version, e.g. 47 for 2008_R2   )r   rE   )rA   s    r   rI   zSchema.get_version   s     "";/22r   c                 H    t        j                  | j                  |||       y r5   )r   _dsdb_set_schema_from_ldifrC   )rO   pfdfdns       r   rN   zSchema.set_from_ldif   s    ''"b"=r   c                    | j                   j                  |       | j                   j                          	 | j                   j                  d       | j                  dz   }| j                   j                  |       | j                   j                  | j                         | j                   j                  | j                         | j                   j                          y #  | j                   j                           xY w)N)urlzpdn: @ATTRIBUTES
linkID: INTEGER

dn: @INDEXLIST
@IDXATTR: linkID
@IDXATTR: attributeSyntax
@IDXGUID: objectGUID
z1objectGUID: 24e2ca70-b093-4ae8-84c0-2d7ac652a1b8
)
rC   connecttransaction_startadd_ldifrL   modify_ldifrJ   rF   transaction_committransaction_cancel)rO   schemadb_pathrL   s      r   write_to_tmp_ldbzSchema.write_to_tmp_ldb   s    ]+""$	* HH   !..FGM HHm,HH  !6!67HHd../
 HH'')		HH'')s   BC" "C?c                 B    t        | j                  | j                        S r5   )get_linked_attributesrB   rC   rO   s    r   linked_attributeszSchema.linked_attributes   s    $T]]DHH==r   c                 B    t        | j                  | j                        S r5   )get_dnsyntax_attributesrB   rC   rl   s    r   dnsyntax_attributeszSchema.dnsyntax_attributes   s    &t}}dhh??r   c                 D    t        j                  | j                  ||      S r5   )r    _dsdb_convert_schema_to_openldaprC   )rO   targetmappings      r   convert_to_openldapzSchema.convert_to_openldap   s    44TXXvwOOr   )NNNNNN)__name__
__module____qualname__rE   rW   staticmethodr@   rI   rN   ri   rm   rp   ru   r=   r   r   r   r   C   s    !L* @DKO!ALF   3 3>*<>@Pr   r   c                 *   ddg}|j                  d| t        |      }i }t        dt        |            D ][  }dt	        ||   d   d         dz   z  }|j                  | |dt              }|9|j                  d	      |t        ||   d         <   ] |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+   )basednr~   	attributer   zutf-8)	searchr   rangelenint	searchoner   rK   rH   )rB   	schemaldbr   res
attributesir~   rs   s           r   rk   rk      s    ()E


0 ^5  :C J1c#h 	P33q6(+A./!35
 $$H0:/@+8 % : 9?w9OJs3q6"3456	P r   c                     |j                  d| t        ddg      }g }t        dt        |            D ]"  }|j	                  t        ||   d                $ |S )NzF(&(!(linkID=*))(objectclass=attributeSchema)(attributeSyntax=2.5.5.1))r{   r|   r}   r   )r   r   r   r   appendrH   )rB   r   r   r   r   s        r   ro   ro      sl    


[^*+  -C J1c#h :#c!f%6789:r   c                 v    |t        j                         }nt        j                  |      }t        || |      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.
    )rB   rR   )r   
random_siddom_sidr   )rB   	domainsidrR   s      r   ldb_with_schemar      s<     '')	$$Y/	)h%79 9r   r5   )z,cn=schema,cn=configuration,dc=example,dc=comNN)__doc__base64r   sambar   r   r   samba.dcerpcr   samba.ms_schemar   	samba.ndrr	   samba.samdbr
   samba.commonr   r   rC   r   r   r   objectr   rk   ro   r   r=   r   r   <module>r      sY   . /  J J ! *   #  ->MPV MPb. L"'+9r   