
    obY&                         d Z ddlmZmZ ddlZddlmZ ddlZddlmZ ej                  rddlm
Z
mZmZmZmZmZ d Z G d	 d
e      Zej&                   G d de             Zy)z Abstract permissions container.
    )print_functionunicode_literalsN)Iterable   )Text)IteratorListOptionalTupleTypeUnionc                 ,    t         j                  |       S )z*Make a mode integer from an initial value.)Permissionsget_mode)inits    0/usr/lib/python3/dist-packages/fs/permissions.py	make_moder      s     %%    c                   $    e Zd ZdZd ZddZd Zy)_PermPropertyz1Creates simple properties to get/set permissions.c                 >    || _         dj                  |      | _        y )NzBoolean for '{}' permission.)_nameformat__doc__)selfnames     r   __init__z_PermProperty.__init__   s    
5<<TBr   Nc                     | j                   |v S N)r   )r   objobj_types      r   __get__z_PermProperty.__get__   s    zzS  r   c                 v    |r|j                  | j                         y |j                  | j                         y r   )addr   remove)r   r    values      r   __set__z_PermProperty.__set__#   s%    GGDJJJJtzz"r   r   )__name__
__module____qualname__r   r   r"   r'    r   r   r   r      s    ;C
!#r   r   c                      e Zd ZdZg dZeD  cg c]  \  }}|	 c}}} Z	 	 	 	 	 	 	 	 d#dZd Zd Zd Z	d Z
d	 Zd
 Zed        Zed        Zed$d       Zed        Zd Zd Zd Zed        Zej.                  d        Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z  ed      Z! ed      Z" ed      Z# ed      Z$d  Z%d! Z&d" Z'yc c}}} w )%r   a  An abstraction for file system permissions.

    Permissions objects store information regarding the permissions
    on a resource. It supports Linux permissions, but is generic enough
    to manage permission information from almost any filesystem.

    Example:
        >>> from fs.permissions import Permissions
        >>> p = Permissions(user='rwx', group='rw-', other='r--')
        >>> print(p)
        rwxrw-r--
        >>> p.mode
        500
        >>> oct(p.mode)
        '0o764'

    ))setuidi   )setguidi   )stickyi   )u_r   )u_w   )u_x@   )g_r    )g_w   )g_x   )o_r   )o_w   )o_xr   Nc	                 
   |t        |      | _        n|+| j                  D 	
ch c]  \  }	}
||
z  s|	 c}
}	| _        net               x}| _        |j                  d |xs dD               |j                  d |xs dD               |j                  d |xs dD               |r| j                  j	                  d       |r| j                  j	                  d       |r| j                  j	                  d       yyc c}
}	w )	a  Create a new `Permissions` instance.

        Arguments:
            names (list, optional): A list of permissions.
            mode (int, optional): A mode integer.
            user (str, optional): A triplet of *user* permissions, e.g.
                ``"rwx"`` or ``"r--"``
            group (str, optional): A triplet of *group* permissions, e.g.
                ``"rwx"`` or ``"r--"``
            other (str, optional): A triplet of *other* permissions, e.g.
                ``"rwx"`` or ``"r--"``
            sticky (bool, optional): A boolean for the *sticky* bit.
            setuid (bool, optional): A boolean for the *setuid* bit.
            setguid (bool, optional): A boolean for the *setguid* bit.

        Nc              3   2   K   | ]  }|d k7  s	d|z     yw)-u_Nr+   .0ps     r   	<genexpr>z'Permissions.__init__.<locals>.<genexpr>q   s     BacB   

 c              3   2   K   | ]  }|d k7  s	d|z     yw)rC   g_Nr+   rE   s     r   rH   z'Permissions.__init__.<locals>.<genexpr>r        Ca!s(CrI   c              3   2   K   | ]  }|d k7  s	d|z     yw)rC   o_Nr+   rE   s     r   rH   z'Permissions.__init__.<locals>.<genexpr>s   rM   rI   r/   r-   r.   )set_perms_LINUX_PERMSupdater$   )r   namesmodeusergroupotherr/   r-   r.   r   maskpermss               r   r   zPermissions.__init__O   s    8 e*DK262C2CSJD$td{4SDK"%%'EDKLLB4:2BBLLC5;BCCLLC5;BCCKKOOH%KKOOH%KKOOI&  Ts
   C?C?c                      j                   j                   j                        s<dj                  d t	         j                         D              }dj                  |      S  fd}dj                   |dd       |dd	       |d
d      f      }dj                   |dd       |dd	       |dd      f      }dj                   |dd       |dd	       |dd      f      }g }d}|j                  |||      }|j                  |        j                  r|j                  d        j                  r|j                  d        j                  r|j                  d       dj                  dj                  |            S )Nz, c              3   >   K   | ]  }d j                  |        yw)z'{}'N)r   rE   s     r   rH   z'Permissions.__repr__.<locals>.<genexpr>   s     "Q6==#3"Qs   zPermissions(names=[{}])c                 (    | j                   v r|S dS )NrJ   rQ   )permr   r   s     r   _checkz$Permissions.__repr__.<locals>._check   s    4;;.46B6r   rJ   r0   rr2   wr4   xr6   r8   r:   r<   r>   r@   z!user='{}', group='{}', other='{}'zsticky=Truezsetuid=Truezsetguid=TruezPermissions({}))	rQ   issubset_LINUX_PERMS_NAMESjoinsortedr   appendr/   r-   )	r   
_perms_strr`   rV   rW   rX   args_fmtbasics	   `        r   __repr__zPermissions.__repr__|   sH   {{##D$;$;<"QVDKK=P"QQJ,33J??	7 wwuc*F5#,>uc@RSTs+VE3-?sASTUs+VE3-?sASTU2D%/E;;KK&;;KK&;;KK' ''		$88r   c                 "    | j                         S r   )as_strr   s    r   __str__zPermissions.__str__   s    {{}r   c                 ,    t        | j                        S r   )iterrQ   rp   s    r   __iter__zPermissions.__iter__   s    DKK  r   c                     || j                   v S r   r^   )r   
permissions     r   __contains__zPermissions.__contains__   s    T[[((r   c                 n    t        |t              r|j                         }n|}| j                         |k(  S r   )
isinstancer   dump)r   rX   rT   s      r   __eq__zPermissions.__eq__   s-    e[)JJLEEyy{e##r   c                 &    | j                  |       S r   )r{   )r   rX   s     r   __ne__zPermissions.__ne__   s    ;;u%%%r   c                 6    |dd }|dd }|dd } | |||      S )z$Parse permissions in Linux notation.N      	   )rV   rW   rX   r+   )clslsrV   rW   rX   s        r   parsezPermissions.parse   s4     "1v1Q1QE77r   c                      | |      S )z%Load a serialized permissions object.rT   r+   )r   permissionss     r   loadzPermissions.load   s     %%r   c                     |	 | d      S t        ||       r|S t        |t              r	 | |      S t        |t              r	 | |      S t        d      )a  Create a permissions object from an initial value.

        Arguments:
            init (int or list, optional): May be None to use `0o777`
                permissions, a mode integer, or a list of permission names.

        Returns:
            int: mode integer that may be used for instance by `os.makedir`.

        Example:
            >>> Permissions.create(None)
            Permissions(user='rwx', group='rwx', other='rwx')
            >>> Permissions.create(0o700)
            Permissions(user='rwx', group='', other='')
            >>> Permissions.create(['u_r', 'u_w', 'u_x'])
            Permissions(user='rwx', group='', other='')

        i  )rU   r   zpermissions is invalid)ry   intlist
ValueErrorr   r   s     r   createzPermissions.create   sV    * <E?"dC KdC D>!dD!T?"122r   c                 8    | j                  |      j                  S )z+Convert an initial value to a mode integer.)r   rU   r   s     r   r   zPermissions.get_mode   s     zz$$$$r   c                 @    t        t        | j                              S )z'Make a copy of this permissions object.r   )r   r   rQ   rp   s    r   copyzPermissions.copy   s     dkk!233r   c                 ,    t        | j                        S )z&Get a list suitable for serialization.)rg   rQ   rp   s    r   rz   zPermissions.dump   s     dkk""r   c                 |   t        | j                  dd d      D cg c]  \  }}|| j                  v r|nd }}}d| j                  v rd| j                  v rdnd|d	<   d
| j                  v rd| j                  v rdnd|d<   d| j                  v rd| j                  v rdnd|d<   dj                  |      }|S c c}}w )z7Get a Linux-style string representation of permissions.iN	rwxrwxrwxrC   r-   r4   sSr?   r.   r:      r/   r@   tTr;   rJ   )zipre   rQ   rf   )r   r   crZ   perm_strs        r   ro   zPermissions.as_str   s    
 t66rs;[I
a $A#-
 
 t{{"#t{{2sE!H##t{{2sE!Ht{{"#t{{2sE!H775>
s   B8c                 Z    d}| j                   D ]  \  }}|| j                  v s||z  } |S )z`int`: mode integer.r   rR   rQ   r   rU   r   rY   s       r   rU   zPermissions.mode   s>     ++ 	JD$t{{"	 r   c                 d    | j                   D ch c]  \  }}||z  s| c}}| _        y c c}}w r   r   r   s       r   rU   zPermissions.mode  s)     /3.?.?O
d4$;tOOs   ,,r0   r2   r4   r6   r8   r:   r<   r>   r@   r/   r-   r.   c                 :    | j                   j                  |       y)zAdd permission(s).

        Arguments:
            *permissions (str): Permission name(s), such as ``'u_w'``
                or ``'u_x'``.

        N)rQ   rS   r   r   s     r   r$   zPermissions.add  s     	;'r   c                 :    | j                   j                  |       y)zRemove permission(s).

        Arguments:
            *permissions (str): Permission name(s), such as ``'u_w'``
                or ``'u_x'``.s

        N)rQ   difference_updater   s     r   r%   zPermissions.remove&  s     	%%k2r   c                 8    | j                   j                  |      S )zCheck if one or more permissions are enabled.

        Arguments:
            *permissions (str): Permission name(s), such as ``'u_w'``
                or ``'u_x'``.

        Returns:
            bool: `True` if all given permissions are set.

        )rQ   
issupersetr   s     r   checkzPermissions.check1  s     {{%%k22r   )NNNNNNNNr   )(r(   r)   r*   r   rR   re   r   rm   rq   rt   rw   r{   r}   classmethodr   r   r   r   r   rz   ro   propertyrU   setterr   r0   r2   r4   r6   r8   r:   r<   r>   r@   r/   r-   r.   r$   r%   r   )rF   r   _masks   000r   r   r   +   s   $L 5AAALE5%A +'Z92!)$& 8 8 & &
 3 3< % %
4
#
"   
[[P P 
C

C

C

C

C

C

C

C

C8$F8$FI&G	(	33I Bs   C.r   )r   
__future__r   r   typingr   six_typingr   TYPE_CHECKINGr   r	   r
   r   r   r   r   objectr   python_2_unicode_compatibler   r+   r   r   <module>r      s_    8   
 	CC&#F #(   Q3& Q3 !Q3r   