o
    wOi                      @   sf   d dl Z d dlZd dlZeeZG dd deZG dd deZG dd deZ	G dd	 d	eZ
dS )
    Nc                   @   sZ   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dddZedd ZdS )EtcdAuthBaseexamplec                 C   s(   || _ || _d| j j| j| j| _d S )Nz{}/auth/{}s/{})clientnameformatversion_prefixentityuriselfr   r    r   =/home/ubuntu/.local/lib/python3.10/site-packages/etcd/auth.py__init__   s
   

zEtcdAuthBase.__init__c                 C   sD   d | j}d | jj|}| j|| jj}t|j	d| S )Nz{}sz
{}/auth/{}utf-8)
r   r   r   r   api_execute_MGETjsonloadsdatadecode)r   keyr	   responser   r   r   names   s   zEtcdAuthBase.namesc              
   C   s   z| j | j| j j}W nH tjy } ztd  d }~w tjy0   t	d| j
| j   tyT } ztd| j
| j j| j j| td| j
| jd }~ww | |j d S )N6Any action on the authorization requires the root role%s '%s' not foundzFailed to fetch %s in %s%s: %rzCould not fetch {} '{}')r   r   r	   r   etcdEtcdInsufficientPermissions_logerrorEtcdKeyNotFoundinfor   r   	Exception	_base_urir   EtcdExceptionr   	_from_netr   )r   r   er   r   r   read   s(   

zEtcdAuthBase.readc              
   C   s   z|  | j| j}|  W n tjy   d }Y nw z| |D ]}| jj| j| jj	|d}| 
|j q!W d S  tjyK } ztd  d }~w tyk } ztd| j| j td| j| j|d }~ww )N)paramsr   zFailed to write %s '%s'zCould not write {} '{}': {})	__class__r   r   r&   r   r   _to_netapi_execute_jsonr	   _MPUTr$   r   r   r   r   r!   r   r#   r   )r   rpayloadr   r%   r   r   r   write+   s6   

zEtcdAuthBase.writec              
   C   s   z| j | j| j j}W d S  tjy  } ztd  d }~w tjy1   t	d| j
| j   tyS } ztd| j
| j| j| td| j
| jd }~ww )Nr   r   zFailed to delete %s in %s%s: %rzCould not delete {} '{}')r   r   r	   _MDELETEr   r   r   r   r   r    r   r   r!   r"   r   r#   r   )r   _r%   r   r   r   deleteB   s$   
zEtcdAuthBase.deletec                 C      t  NNotImplementedError)r   r   r   r   r   r$   Q      zEtcdAuthBase._from_netNc                 C   r2   r3   r4   )r   oldr   r   r   r)   T   r6   zEtcdAuthBase._to_netc                 C   s   | ||| j  }|| |S r3   )r   r$   )clsr   r   cr   r   r   newW   s   
zEtcdAuthBase.newr3   )__name__
__module____qualname__r   r   propertyr   r&   r.   r1   r$   r)   classmethodr:   r   r   r   r   r   	   s    

r   c                       sr   e Zd ZdZdZ fddZdd Zddd	Zed
d Z	e	j
dd Z	edd Zej
dd Zdd Z  ZS )EtcdUserz,Class to manage in a orm-like way etcd usersuserc                    s$   t t| || t | _d | _d S r3   )superr@   r   set_roles	_passwordr
   r(   r   r   r   b   s   
zEtcdUser.__init__c                 C   s.   t |d}|dg | _|d| _d S )Nr   rolesrA   )r   r   r   getrG   r   )r   r   dr   r   r   r$   g   s   zEtcdUser._from_netNc                 C   s   |d u r| j | jt| jdg}n5g }| jr || j | jd t| j|j }t|j| j }|r;|| j |d |rF|| j |d d | _|S )N)rA   passwordrG   )rA   rJ   )rA   grant)rA   revoke)r   rE   listrG   appendr   prevobjretvalto_grant	to_revoker   r   r   r)   l   s   
zEtcdUser._to_netc                 C   s   | j S r3   )rD   r   r   r   r   rG      s   zEtcdUser.rolesc                 C   s   t || _d S r3   )rC   rD   )r   valr   r   r   rG      s   c                 C   s   dS )zEmpty property for password.Nr   rT   r   r   r   rJ      s   zEtcdUser.passwordc                 C   s
   || _ dS )zChange user's password.N)rE   )r   new_passwordr   r   r   rJ      s   
c                 C   s   t |  d S )Nr   )r   dumpsr)   rT   r   r   r   __str__   s   zEtcdUser.__str__r3   )r;   r<   r=   __doc__r   r   r$   r)   r>   rG   setterrJ   rX   __classcell__r   r   rF   r   r@   ^   s    




r@   c                       sd   e Zd ZdZ fddZdd ZdddZd	d
 Zdd Ze	dd Z
e
jdd Z
dd Z  ZS )EtcdRolerolec                    s&   t t| || t | _t | _d S r3   )rB   r\   r   rC   _read_paths_write_pathsr
   rF   r   r   r      s   zEtcdRole.__init__c                 C   sr   t |d}|d| _z|d d }W n   t | _t | _Y d S t|dg | _t|dg | _d S )Nr   r]   permissionskvr&   r.   )r   r   r   rH   r   rC   r^   r_   )r   r   rI   ra   r   r   r   r$      s   zEtcdRole._from_netNc                 C   s   g }|d u r| | jdt| jt| jdid |S t| j|j t| j|j d}t|j| j t|j| j d}dd | D rR| | jd|id dd | D rf| | jd|id |S )	Nra   )r&   r.   )r]   r`   c                 S      g | ]	}|D ]}|qqS r   r   .0sublistpathr   r   r   
<listcomp>       z$EtcdRole._to_net.<locals>.<listcomp>)r]   rL   c                 S   rb   r   r   rc   r   r   r   rg      rh   )r]   rK   )rN   r   rM   r^   r_   valuesrO   r   r   r   r)      s,   zEtcdRole._to_netc                 C   sD   |  ddkr| j| |  ddkr | j| d S d S NRr   W)upperfindr^   addr_   r   rf   
permissionr   r   r   rK      s
   zEtcdRole.grantc                 C   s\   |  ddkr|| jv r| j| |  ddkr*|| jv r,| j| d S d S d S rj   )rm   rn   r^   remover_   rp   r   r   r   rL      s   

zEtcdRole.revokec                 C   sZ   i }z$| j D ]}d||< q| jD ]}||v r||  d7  < qd||< qW |S    Y |S )Nrk   rl   )r^   r_   )r   permsrf   r   r   r   acls   s   



zEtcdRole.aclsc                 C   s2   t  | _t  | _| D ]
\}}| || qd S r3   )rC   r^   r_   itemsrK   )r   rt   rf   rq   r   r   r   rt      s
   c                 C   s   t | j| jdS )N)r]   rt   )r   rW   r   rt   rT   r   r   r   rX      s   zEtcdRole.__str__r3   )r;   r<   r=   r   r   r$   r)   rK   rL   r>   rt   rZ   rX   r[   r   r   rF   r   r\      s    


r\   c                   @   s.   e Zd Zdd Zedd Zejdd ZdS )Authc                 C   s   || _ d| j j| _d S )Nz{}/auth/enable)r   r   r   r	   )r   r   r   r   r   r      s   zAuth.__init__c                 C   s*   | j | j| j j}t|jdd S )Nr   enabled)r   r   r	   r   r   r   r   r   )r   respr   r   r   active   s   zAuth.activec                 C   s6   || j kr|r| jjp| jj}| j| j| d S d S r3   )ry   r   r+   r/   r   r	   )r   valuemethodr   r   r   ry      s   
N)r;   r<   r=   r   r>   ry   rZ   r   r   r   r   rv      s    
rv   )r   loggingr   	getLoggerr;   r   objectr   r@   r\   rv   r   r   r   r   <module>   s    
U8[