o
    Q `K&                     @   s   d Z ddlmZ ddlmZ ddlZddlmZ ddlZddlmZ ej	r5ddlm
Z
mZmZmZmZmZ d	d
 ZG dd deZejG dd deZdS )z Abstract permissions container.
    )print_function)unicode_literalsN)Iterable   )Text)IteratorListOptionalTupleTypeUnionc                 C   s
   t | S )z/Make a mode integer from an initial value.
    )Permissionsget_mode)init r   0/usr/lib/python3/dist-packages/fs/permissions.py	make_mode      
r   c                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
_PermPropertyz6Creates simple properties to get/set permissions.
    c                 C   s   || _ d|| _d S )NzBoolean for '{}' permission.)_nameformat__doc__)selfnamer   r   r   __init__   s   z_PermProperty.__init__Nc                 C   s
   | j |v S N)r   )r   objZobj_typer   r   r   __get__#      
z_PermProperty.__get__c                 C   s$   |r
| | j d S || j d S r   )addr   remove)r   r   valuer   r   r   __set__'   s   z_PermProperty.__set__r   )__name__
__module____qualname__r   r   r   r"   r   r   r   r   r      s
    
r   c                   @   sL  e Zd ZdZg dZdd eD Z								d7ddZdd	 Zd
d Zdd Z	dd Z
dd Zdd Zedd Zedd Zed8ddZedd Zdd Zdd Zd d! Zed"d# Zejd$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d0Z$d1d2 Z%d3d4 Z&d5d6 Z'dS )9r   ab  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.

    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.

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

    ))setuidi   )setguidi   )stickyi   )u_r   )u_w   )u_x@   )g_r    )g_w   )g_x   )o_r   )o_w   )o_xr   c                 C   s   g | ]\}}|qS r   r   ).0r   Z_maskr   r   r   
<listcomp>^   s    zPermissions.<listcomp>Nc	           
         s   |d ur
t || _n: d ur fdd| jD | _n*t   }	| _|	dd |p(dD  |	dd |p4dD  |	dd |p@dD  |rL| jd |rT| jd	 |r^| jd
 d S d S )Nc                       h | ]
\}} |@ r|qS r   r   r:   r   maskmoder   r   	<setcomp>o       z'Permissions.__init__.<locals>.<setcomp>c                 s        | ]}|d krd| V  qdS )-Zu_Nr   r:   pr   r   r   	<genexpr>r       z'Permissions.__init__.<locals>.<genexpr> c                 s   rC   )rD   Zg_Nr   rE   r   r   r   rG   s   rH   c                 s   rC   )rD   Zo_Nr   rE   r   r   r   rG   t   rH   r(   r&   r'   )set_perms_LINUX_PERMSupdater   )
r   namesr@   usergroupotherr(   r&   r'   permsr   r?   r   r   `   s   zPermissions.__init__c           	         s   j  jsddd t j D }d|S  fdd}d|dd	|d
d|ddf}d|dd	|dd|ddf}d|dd	|dd|ddf}g }d}||||}||  jrj|d  jrr|d  jrz|d dd|S )Nz, c                 s   s    | ]}d  |V  qdS )z'{}'N)r   rE   r   r   r   rG      s    z'Permissions.__repr__.<locals>.<genexpr>zPermissions(names=[{}])c                    s   |  j v r|S dS )NrI   rK   )Zpermr   r   r   r   _check   s   z$Permissions.__repr__.<locals>._checkrI   r)   rr+   wr-   xr/   r1   r3   r5   r7   r9   z!user='{}', group='{}', other='{}'zsticky=Truezsetuid=Truezsetguid=TruezPermissions({}))	rK   issubset_LINUX_PERMS_NAMESjoinsortedr   appendr(   r&   )	r   Z
_perms_strrU   rO   rP   rQ   argsZ_fmtZbasicr   rT   r   __repr__}   s$   
"""



zPermissions.__repr__c                 C   s   |   S r   )as_strrT   r   r   r   __str__   s   zPermissions.__str__c                 C   
   t | jS r   )iterrK   rT   r   r   r   __iter__   r   zPermissions.__iter__c                 C   s
   || j v S r   rS   )r   Z
permissionr   r   r   __contains__   r   zPermissions.__contains__c                 C   s$   t |tr
| }n|}|  |kS r   )
isinstancer   dump)r   rQ   rN   r   r   r   __eq__   s   

zPermissions.__eq__c                 C   s   |  | S r   )rh   )r   rQ   r   r   r   __ne__   s   zPermissions.__ne__c                 C   s2   |dd }|dd }|dd }| |||dS )z-Parse permissions in Linux notation.
        N      	   )rO   rP   rQ   r   )clsZlsrO   rP   rQ   r   r   r   parse   s   zPermissions.parsec                 C   s
   | |dS )z.Load a serialized permissions object.
        rN   r   )rm   permissionsr   r   r   load   s   
zPermissions.loadc                 C   sP   |du r	| ddS t || r|S t |tr| |dS t |tr$| |d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='')

        Ni  r?   ro   zpermissions is invalid)rf   intlist
ValueErrorrm   r   r   r   r   create   s   





zPermissions.createc                 C   s   |  |jS )z4Convert an initial value to a mode integer.
        )rv   r@   ru   r   r   r   r      s   zPermissions.get_modec                 C   s   t t| jdS )z0Make a copy of this permissions object.
        ro   )r   rs   rK   rT   r   r   r   copy   s   zPermissions.copyc                 C   rb   )z/Get a list suitable for serialization.
        )r\   rK   rT   r   r   r   rg      r   zPermissions.dumpc                    s    fddt  jdd dD }d jv r!d jv rdnd	|d
< d jv r1d jv r-dnd	|d< d jv rAd jv r=dnd|d< d|}|S )z@Get a Linux-style string representation of permissions.
        c                    s"   g | ]\}}| j v r|nd qS )rD   rS   )r:   r   crT   r   r   r;      s    z&Permissions.as_str.<locals>.<listcomp>iNZ	rwxrwxrwxr&   r-   sSr8   r'   r3      r(   r9   tTr4   rI   )ziprZ   rK   r[   )r   rR   Zperm_strr   rT   r   r`      s   




zPermissions.as_strc                 C   s*   d}| j D ]\}}|| jv r||O }q|S )z`int`: mode integer.
        r   rL   rK   )r   r@   r   r>   r   r   r   r@     s   
zPermissions.modec                    s    fdd| j D | _d S )Nc                    r<   r   r   r=   r?   r   r   rA     rB   z#Permissions.mode.<locals>.<setcomp>r   )r   r@   r   r?   r   r@     s   r)   r+   r-   r/   r1   r3   r5   r7   r9   r(   r&   r'   c                 G      | j | dS )zAdd permission(s).

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

        N)rK   rM   r   rp   r   r   r   r   #     	zPermissions.addc                 G   r   )zRemove permission(s).

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

        N)rK   difference_updater   r   r   r   r    .  r   zPermissions.removec                 G   s   | 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.

        )rK   
issupersetr   r   r   r   check9  s   zPermissions.check)NNNNNNNNr   )(r#   r$   r%   r   rL   rZ   r   r_   ra   rd   re   rh   ri   classmethodrn   rq   rv   r   rw   rg   r`   propertyr@   setterr   r)   r+   r-   r/   r1   r3   r5   r7   r9   r(   r&   r'   r   r    r   r   r   r   r   r   /   sb    

	




r   )r   Z
__future__r   r   typingr   ZsixZ_typingr   ZTYPE_CHECKINGr   r   r	   r
   r   r   r   objectr   Zpython_2_unicode_compatibler   r   r   r   r   <module>   s     