ó
E®Uc           @   sà   d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z m Z m	 Z	 d d l
 m Z m Z d d l m Z d e f d „  ƒ  YZ d „  Z d d e d d	 „ Z d d e e d d d
 „ Z d „  Z e d „ Z d S(   s   NT Acls.iÿÿÿÿN(   t   securityt   xattrt   idmap(   t   ndr_packt
   ndr_unpack(   t   smbdt   XattrBackendErrorc           B   s   e  Z d  Z RS(   s   A generic xattr backend error.(   t   __name__t
   __module__t   __doc__(    (    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyR      s   c         C   sH  | d k rr |  j d ƒ } | d k	 r= t j |  j d ƒ f S|  j d ƒ } | d k	 rn t j |  j d ƒ f Sd S| d k r‚ d S| d k rÛ | d k	 r§ t j | f St j t j j t j j |  j d ƒ d ƒ ƒ f Sni | d k r4| d k	 r t j | f St j t j j t j j |  j d ƒ d	 ƒ ƒ f Sn t	 d
 | ƒ ‚ d S(   s$   return the path to the eadb, or Nones   xattr_tdb:files
   posix:eadbt   nativet   eadbs   private dirs   eadb.tdbt   tdbs	   state dirs	   xattr.tdbs   Invalid xattr backend choice %sN(   NN(   NN(
   t   Nonet   gett   sambat	   xattr_tdbt
   posix_eadbt   ost   patht   abspatht   joinR   (   t   lpt   backendt   eadbfileR   R   (    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   checkset_backend    s&    44c   
      C   s>  | rt  |  | | ƒ \ } } | d  k	 r~ y | j | | t j ƒ } Wq– t k
 rz d | GHt j j | t j ƒ } q– Xn t j j | t j ƒ } t t j	 | ƒ }	 |	 j
 d k r¾ |	 j S|	 j
 d k r× |	 j j S|	 j
 d k rð |	 j j S|	 j
 d k r:|	 j j Sn. t j | t j t j Bt j Bt j Bd | ƒSd  S(   Ns   Fail to open %si   i   i   i   t   service(   R   R   t   wrap_getxattrR   t   XATTR_NTACL_NAMEt	   ExceptionR   t   xattr_nativeR   t   NTACLt   versiont   infot   sdR   t
   get_nt_aclR    t   SECINFO_OWNERt   SECINFO_GROUPt   SECINFO_DACLt   SECINFO_SACL(
   R   t   fileR   R   t   direct_db_accessR   t   backend_objt   dbnamet	   attributet   ntacl(    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   getntacl:   s,    	

c
         C   sG  t  | t ƒ s' t  | t j ƒ s' t ‚ t  | t ƒ rH t j | ƒ }
 n' t  | t j ƒ ro | }
 t |
 ƒ } n  t  | t ƒ s– t  | t j ƒ s– t ‚ t  | t ƒ r½ t j j | |
 ƒ } n* t  | t j ƒ rç | } | j |
 ƒ } n  | rF| rF| j | j	 ƒ \ } } | t
 j k rF| t
 j k rF| j	 t j d | t j f ƒ k rt j d | t j f ƒ } | j | ƒ \ } } | t
 j k sž| t
 j k rç| } | | _	 t j | t j t j Bt j Bt j B| d |	 ƒt } q@t d | | | f ƒ ‚ qCt j | d d ƒ t j | t j t j Bt j B| d |	 ƒqFn  | rt |  | | ƒ \ } } t j ƒ  } d | _ | | _ | d  k	 rðy# | j | | t j  t! | ƒ ƒ Wqt" k
 rìd | GHt# j$ j | t j  t! | ƒ ƒ qXqCt# j$ j | t j  t! | ƒ ƒ n1 t j | t j t j Bt j Bt j B| d |	 ƒd  S(   Ns   %s-%dR   sD   Unable to find UID for domain administrator %s, got id %d of type %di    i   s   Fail to open %s(%   t
   isinstancet   strR    t   dom_sidt   AssertionErrort
   descriptort	   from_sddlt   as_sddlt	   sid_to_idt	   owner_sidR   t   ID_TYPE_UIDt   ID_TYPE_BOTHt   DOMAIN_RID_ADMINSt   DOMAIN_RID_ADMINISTRATORR   t
   set_nt_aclR$   R%   R&   R'   t   TrueR   R   t   chownR   R   R   R    R!   R   t   wrap_setxattrR   R   R   R   R   (   R   R(   t   sddlt   domsidR   R   t	   use_ntvfst   skip_invalid_chownt   passdbR   t   sidR"   t   owner_idt
   owner_typet   administratort   admin_idt
   admin_typet   sd2R*   R+   R-   (    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   setntaclW   sT    ''%	1	0				c         C   sR  d } d } d } d } d } d } d } d } d	 }	 d }
 d } d } d } d } d } d } d } d } d } d } d } d } d	 } d
 } d } d } d } d } d } |  | @} |  | @rí |  | @rí | | | B| B| B|
 B| BB} n  |  | @r| | | B| B| B| B| B| BB} n  |  | @r7| | | BB} n  |  | @rN| | B} n  | S(   sM   Takes the access mask of a DS ACE and transform them in a File ACE mask.
    i   i   i   i   i   i    i@   i€   i   i   i   i   i   i   i   (    (   t   ldmt   RIGHT_DS_CREATE_CHILDt   RIGHT_DS_DELETE_CHILDt   RIGHT_DS_LIST_CONTENTSt   ACTRL_DS_SELFt   RIGHT_DS_READ_PROPERTYt   RIGHT_DS_WRITE_PROPERTYt   RIGHT_DS_DELETE_TREEt   RIGHT_DS_LIST_OBJECTt   RIGHT_DS_CONTROL_ACCESSt   FILE_READ_DATAt   FILE_LIST_DIRECTORYt   FILE_WRITE_DATAt   FILE_ADD_FILEt   FILE_APPEND_DATAt   FILE_ADD_SUBDIRECTORYt   FILE_CREATE_PIPE_INSTANCEt   FILE_READ_EAt   FILE_WRITE_EAt   FILE_EXECUTEt   FILE_TRAVERSEt   FILE_DELETE_CHILDt   FILE_READ_ATTRIBUTESt   FILE_WRITE_ATTRIBUTESt   DELETEt   READ_CONTROLt	   WRITE_DACt   WRITE_OWNERt   SYNCHRONIZEt   STANDARD_RIGHTS_ALLt   filemask(    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   ldapmask2filemask   sT    



c         C   s1  t  j j |  | ƒ } t  j ƒ  } | j | _ | j | _ | j | _ | j | _ | j j } xº t	 d t
 | ƒ ƒ D]£ } | | } | j t  j @rs t | j ƒ t  j k rs | j t  j Bt  j B| _ t | j ƒ t  j k rô | j t  j B| _ n  t | j ƒ | _ | j | ƒ qs qs W| s$| S| j | ƒ S(   sµ   

    This function takes an the SDDL representation of a DS
    ACL and return the SDDL representation of this ACL adapted
    for files. It's used for Policy object provision
    i    (   R    R3   R4   R7   t	   group_sidt   typet   revisiont   daclt   acest   ranget   lent"   SEC_ACE_TYPE_ACCESS_ALLOWED_OBJECTR0   t   trusteet   SID_BUILTIN_PREW2Kt   flagst   SEC_ACE_FLAG_OBJECT_INHERITt   SEC_ACE_FLAG_CONTAINER_INHERITt   SID_CREATOR_OWNERt   SEC_ACE_FLAG_INHERIT_ONLYRl   t   access_maskt   dacl_addR5   (   t   dssddlRE   R5   t   reft   fdescrRq   t   it   ace(    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   dsacl2fsaclÔ   s$    
)(   R	   R   t   samba.xattr_nativeR   t   samba.xattr_tdbt   samba.posix_eadbt   samba.dcerpcR    R   R   t	   samba.ndrR   R   t   samba.samba3R   R   R   R   R   R=   R.   t   FalseRL   Rl   Rƒ   (    (    (    s0   /usr/lib/python2.7/dist-packages/samba/ntacls.pyt   <module>   s   $	F	7