o
    pfY&                     @   s   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	r1d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   G/home/ertert/spirit/venv/lib/python3.10/site-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 )
_PermPropertyz1Creates 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   obj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   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   c                 C   s   g | ]\}}|qS r   r   ).0r   _maskr   r   r   
<listcomp>M   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 )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                       h | ]
\}} |@ r|qS r   r   r;   r   maskmoder   r   	<setcomp>n       z'Permissions.__init__.<locals>.<setcomp>c                 s        | ]}|d krd| V  qdS )-u_Nr   r;   pr   r   r   	<genexpr>q       z'Permissions.__init__.<locals>.<genexpr> c                 s   rE   )rF   g_Nr   rH   r   r   r   rJ   r   rK   c                 s   rE   )rF   o_Nr   rH   r   r   r   rJ   s   rK   r)   r'   r(   )set_perms_LINUX_PERMSupdater    )
r   namesrB   usergroupotherr)   r'   r(   permsr   rA   r   r   O   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   rH   r   r   r   rJ      s    z'Permissions.__repr__.<locals>.<genexpr>zPermissions(names=[{}])c                    s   |  j v r|S dS )NrL   rP   )permr   r   r   r   _check   s   z$Permissions.__repr__.<locals>._checkrL   r*   rr,   wr.   xr0   r2   r4   r6   r8   r:   z!user='{}', group='{}', other='{}'zsticky=Truezsetuid=Truezsetguid=TruezPermissions({}))	rP   issubset_LINUX_PERMS_NAMESjoinsortedr   appendr)   r'   )	r   
_perms_strr[   rT   rU   rV   args_fmtbasicr   rZ   r   __repr__|   s$   
"""



zPermissions.__repr__c                 C   s   |   S r   )as_strrZ   r   r   r   __str__   s   zPermissions.__str__c                 C   
   t | jS r   )iterrP   rZ   r   r   r   __iter__   r   zPermissions.__iter__c                 C   s
   || j v S r   rX   )r   
permissionr   r   r   __contains__   r   zPermissions.__contains__c                 C   s$   t |tr
| }n|}|  |kS r   )
isinstancer   dump)r   rV   rS   r   r   r   __eq__   s   

zPermissions.__eq__c                 C   s   |  | S r   )rr   )r   rV   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      	   )rT   rU   rV   r   )clslsrT   rU   rV   r   r   r   parse   s   zPermissions.parsec                 C   s
   | |dS )z%Load a serialized permissions object.rS   r   )rw   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  rA   rz   zpermissions is invalid)rp   intlist
ValueErrorrw   r   r   r   r   create   s   





zPermissions.createc                 C   s   |  |jS )z+Convert an initial value to a mode integer.)r   rB   r   r   r   r   r      s   zPermissions.get_modec                 C   s   t t| jdS )z'Make a copy of this permissions object.rz   )r   r~   rP   rZ   r   r   r   copy   s   zPermissions.copyc                 C   rk   )z&Get a list suitable for serialization.)rb   rP   rZ   r   r   r   rq      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 )z7Get a Linux-style string representation of permissions.c                    s"   g | ]\}}| j v r|nd qS )rF   rX   )r;   r   crZ   r   r   r=      s    z&Permissions.as_str.<locals>.<listcomp>iN	rwxrwxrwxr'   r.   sSr9   r(   r4      r)   r:   tTr5   rL   )zipr`   rP   ra   )r   rW   perm_strr   rZ   r   ri      s   




zPermissions.as_strc                 C   s*   d}| j D ]\}}|| jv r||O }q|S )z`int`: mode integer.r   rQ   rP   )r   rB   r   r@   r   r   r   rB      s   
zPermissions.modec                    s    fdd| j D | _d S )Nc                    r>   r   r   r?   rA   r   r   rC   	  rD   z#Permissions.mode.<locals>.<setcomp>r   )r   rB   r   rA   r   rB     s   r*   r,   r.   r0   r2   r4   r6   r8   r:   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)rP   rR   r   r{   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)rP   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.

        )rP   
issupersetr   r   r   r   check1  s   zPermissions.check)NNNNNNNNr   )(r$   r%   r&   r   rQ   r`   r   rh   rj   rm   ro   rr   rs   classmethodry   r|   r   r   r   rq   ri   propertyrB   setterr   r*   r,   r.   r0   r2   r4   r6   r8   r:   r)   r'   r(   r    r!   r   r   r   r   r   r   +   sb    
-



	
r   )r   
__future__r   r   typingr   six_typingr   TYPE_CHECKINGr   r   r	   r
   r   r   r   objectr   python_2_unicode_compatibler   r   r   r   r   <module>   s     