ó
E®Uc           @   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 m Z d d
 l Z i  d „ Z d e f d „  ƒ  YZ d „  Z d „  Z d d
 d
 d „ Z d
 S(   s(   Functions for setting up a Samba Schema.iÿÿÿÿ(   t	   b64encode(   t   read_and_sub_filet   substitute_vart   check_all_substituted(   t   security(   t   read_ms_schema(   t   ndr_pack(   t   SamDB(   t   dsdb(   t   SCOPE_SUBTREEt   SCOPE_ONELEVELNc         C   s%   d } t  j j | |  ƒ } t | ƒ S(   NsÈ  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   t
   descriptort	   from_sddlR   (   t
   domain_sidt   name_mapt   sddlt   sec(    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   get_schema_descriptor#   s    t   Schemac           B   sM   e  Z d d d d d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sÚ  d d l  m } | |  _ t d t d t ƒ |  _ | d  k	 rP |  j j | ƒ n  t | d ƒ | d ƒ ƒ |  _	 | d  k	 r¬ x/ | D]$ } |  j	 t
 | d ƒ j ƒ  7_	 q Wn  t |  j	 i | d 6ƒ |  _	 t |  j	 ƒ t | d	 ƒ i | d 6ƒ |  _ t t | ƒ ƒ }	 t | d
 ƒ i | d 6|	 d 6ƒ |  _ | d  k	 rD| |  _ n t
 | d ƒ d ƒ j ƒ  |  _ | d  k	 r•x$ | D] }
 |  j d |
 7_ quWn  t |  j ƒ |  _ d |  j |  j f } |  j | |  j	 |  j ƒ d  S(   Niÿÿÿÿ(   t
   setup_patht   global_schemat   am_rodcs,   ad-schema/MS-AD_Schema_2K8_R2_Attributes.txts)   ad-schema/MS-AD_Schema_2K8_R2_Classes.txtt   rt   SCHEMADNs#   provision_schema_basedn_modify.ldifs   provision_schema_basedn.ldift
   DESCRIPTORs   prefixMap.txts   %s
s   dn: %s
prefixMap:: %s

(   t   samba.provisionR   t   schemadnR   t   Falset   ldbt   Nonet   set_invocation_idR   t   schema_datat   opent   readR   R   R   t   schema_dn_modifyR    R   t   schema_dn_addt   prefixmap_datat   set_from_ldif(   t   selfR   t   invocationidR   t   filest   override_prefixmapt   additional_prefixmapR   t   filet   descrt   mapt   prefixmap_ldif(    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   __init__A   s<    		%			c         C   s   t  j |  j | | | ƒ d  S(   N(   R   t   _dsdb_set_schema_from_ldifR   (   R&   t   pft   dft   dn(    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyR%   z   s    c         C   s˜   |  j  j d | ƒ |  j  j ƒ  yM |  j  j d ƒ |  j  j |  j ƒ |  j  j |  j ƒ |  j  j |  j ƒ Wn |  j  j ƒ  ‚  n X|  j  j	 ƒ  d  S(   Nt   urls[   dn: @ATTRIBUTES
linkID: INTEGER

dn: @INDEXLIST
@IDXATTR: linkID
@IDXATTR: attributeSyntax
(
   R   t   connectt   transaction_startt   add_ldifR#   t   modify_ldifR"   R   t   transaction_cancelt   transaction_commit(   R&   t   schemadb_path(    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   write_to_tmp_ldb}   s    	c         C   s   t  |  j |  j ƒ S(   N(   t   get_linked_attributesR   R   (   R&   (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   linked_attributes”   s    c         C   s   t  |  j |  j ƒ S(   N(   t   get_dnsyntax_attributesR   R   (   R&   (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   dnsyntax_attributes—   s    c         C   s   t  j |  j | | ƒ S(   N(   R   t    _dsdb_convert_schema_to_openldapR   (   R&   t   targett   mapping(    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   convert_to_openldapš   s    N(	   t   __name__t
   __module__R   R/   R%   R<   R>   R@   RD   (    (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyR   ?   s   8				c      
   C   sË   d d g } | j  d d d |  d t d | ƒ } i  } xŽ t d t | ƒ ƒ D]w } d	 t | | d d ƒ d
 } | j d |  d | d d d t ƒ } | d  k	 rL t | ƒ | t | | d ƒ <qL qL W| S(   Nt   linkIDt   lDAPDisplayNamet
   expressionsh   (&(linkID=*)(!(linkID:1.2.840.113556.1.4.803:=1))(objectclass=attributeSchema)(attributeSyntax=2.5.5.1))t   baset   scopet   attrsi    sD   (&(objectclass=attributeSchema)(linkID=%d)(attributeSyntax=2.5.5.1))i   t   basednt	   attribute(	   t   searchR
   t   ranget   lent   intt	   searchoneR	   R   t   str(   R   t	   schemaldbRL   t   rest
   attributest   iRI   RB   (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyR=   Ÿ   s    		%c      
   C   so   | j  d d d |  d t d d d g ƒ } g  } x8 t d t | ƒ ƒ D]! } | j t | | d ƒ ƒ qF W| S(	   NRI   sF   (&(!(linkID=*))(objectclass=attributeSchema)(attributeSyntax=2.5.5.1))RJ   RK   RL   RG   RH   i    (   RO   R
   RP   RQ   t   appendRT   (   R   RU   RV   RW   RX   (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyR?   ¶   s    	s,   cn=schema,cn=configuration,dc=example,dc=comc         C   s@   | d k r t j ƒ  } n t j | ƒ } t | d |  d | ƒS(   sO  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.
    R   R)   N(   R   R   t
   random_sidt   dom_sidR   (   R   t	   domainsidR)   (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   ldb_with_schemaÁ   s
    (   t   __doc__t   base64R    t   sambaR   R   R   t   samba.dcerpcR   t   samba.ms_schemaR   t	   samba.ndrR   t   samba.samdbR   R   R   R	   R
   t   osR   t   objectR   R=   R?   R   R]   (    (    (    s0   /usr/lib/python2.7/dist-packages/samba/schema.pyt   <module>   s    `		