
    *.+h                     |    d dl Z d dlmZmZ d dlmZ d dlZd dlZd dlZd dlT d dl	m
Z
  G d de
j                  ZdS )    N)datetimetimezone)Path)*)cmf_ssh_keyc                        e Zd Zed             Zed             Zed             Zd ZddZd Z	d Z
 fd	Z fd
Z fdZ xZS )	CmfSshKeyc                 J    t          t          j         d| j         d          S )Nz/conf/users/key_.jsonr   configGIT_DIRcodeselfs    &./modules/evagit/models/cmf_ssh_key.pykey_filezCmfSshKey.key_file   s%    v~GGtyGGGHHH    c                 J    t          t          j         d| j         d          S )Nz/conf/users/deleted_key_r   r   r   s    r   key_file_deletedzCmfSshKey.key_file_deleted   s%    v~OOtyOOOPPPr   c                 :    t          t          j         d          S )Nz/githome/.ssh/authorized_keys)r   r   r   r   s    r   authorized_keys_filezCmfSshKey.authorized_keys_file   s    v~DDDEEEr   c                    | j                                          | j         st          dd           | j                                        rt          dd           t          | j         j                  | j        rt          | j                  nd i d}| j        j                             dd           t          | j        d          5 }t          j        ||d	           d d d            d S # 1 swxY w Y   d S )
NuK   SSH-ключ должен принадлежать пользователюTabortu8   SSH-ключ c таким id уже существует)userexpiration_daterepos)exist_okparentsw   indent)parentload	cmf_alertr   existsstridr   mkdiropenjsondump)r   datafs      r   _create_key_filezCmfSshKey._create_key_file   sH   { 	rdlpqqqq=!! 	_QY]^^^^ ''<@<PZs4#7888VZ
 
 	""D$"???$-%% 	)IdAa((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   
C//C36C3Nc                    |pi |pg }}| j                                         st          d| j         dd           t	          | j         d          5 }t          j        |          }d d d            n# 1 swxY w Y   |                                D ]\  }}||d         |<   |D ]}||d         vrd|d         |         d<   t	          | j         d	          5 }t          j        ||d
           d d d            d S # 1 swxY w Y   d S )Nu   Файл для SSH-ключа u    отсутствуетTr   rr    allowr!   r"   r#   )	r   r(   r'   r   r,   r-   r&   itemsr.   )r   	additions	deletionsr0   r/   repoperms          r   update_key_filezCmfSshKey.update_key_file+   s   (B	R9	}##%% 	hZ	ZZZbfgggg$-%% 	 9Q<<D	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  $//++ 	' 	'JD$"&DM$ 	. 	.D4=((+-DM$(($-%% 	)IdAa((((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s$   A22A69A6C==DDc                 t   dt           j         d| j         d| j         d}d\  }}t	          | j        d          5 }||k     r	 t          j        |t          j        t          j	        z             nC# t          $ r6 t                              d           |dz  }t          j        d           Y sw xY w|                    |           t          j        |t          j                   	 d d d            d S 	 d d d            n# 1 swxY w Y   t                              d	           t%          d
d           d S )Nz	command="z/githook.py zB",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty 
   r   a/authorized_keys file is locked by other process   Dauthorized_keys file is locked by other process longer than expectedu2   Невозможно добавить SSH-ключTr   )r   r   r   keyr,   r   fcntlflockLOCK_EXLOCK_NBIOErrorloggingwarningtimesleepwriteLOCK_UNerrorr'   )r   auth_templatemax_retriescur_retriesr0   s        r   _add_authorized_keyzCmfSshKey._add_authorized_key@   s   N 04	  8  
 $( [$+S11 	Q++K5=5=#@AAAA   OO$VWWW1$KJqMMMH	 &&&Au}---	 	 	 	 	 	 	 	+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]^^^FdSSSSSSs5   D,A0/D0=B0-D/B008DD	Dc                     t           j                            | j        g d          }|D ]}|                    | g           d S )N)zgit_role.perm_push	namespacemembertree_parent)rW   fields)modelsCmfEvagitRoleAssignlistr%   add_ssh_key_perms)r   role_assignsrole_assigns      r   _recalc_role_assignszCmfSshKey._recalc_role_assignsY   sa    166;OOO 7   ) 	4 	4K))4(3333	4 	4r   c                 L    t                                                      dgz   S )Nr   )supersave_preload_fields)r   	__class__s    r   rc   zCmfSshKey.save_preload_fieldsa   s"    ww**,,0A/DDDr   c           	         | j         st          dd           | j        r9| j        t          j        t
          j                  k     rt          dd           t          j        | j	        j
                                                                                  d                    fdt          dt                    d	          D                       | _        t          j        | j	        j
                                                                                  | _        |                                  |                                  |                                   t-                      j        |i |S )
Nu<   SSH-ключ невозможно редактироватьTr   )tzum   Дата истечения срока действия ключа не может быть в прошлом:c                 *    g | ]}||d z            S )    ).0imd5s     r   
<listcomp>z"CmfSshKey.save.<locals>.<listcomp>l   s%    $O$O$OAS1Q3Z$O$O$Or   r   ri   )is_newr'   r   r   nowr   utchashlibrm   rD   valueencode	hexdigestjoinrangelenfingerprintsha256fingerprint_sha256r1   rT   r`   rb   save)r   argskwargsrm   rd   s      @r   r|   zCmfSshKey.saved   sY   { 	cU]abbbb 	SD$88<8<;X;X;X$X$X  F  NR  S  S  S  Sk$(.//1122<<>>88$O$O$O$Oq#c((A9N9N$O$O$OPP").1F1F1H1H"I"I"S"S"U"U  """!!###uww|T,V,,,r   c                      j                                         s$t                              d j          d           n j                              j                   d\  }}t           j        d          5 }||k     r(	 t          j	        |t          j
        t          j        z             nC# t          $ r6 t                              d           |dz  }t          j        d           Y tw xY w|                    d            fd|                                D             }|                    d           |                                 |                    |           t          j	        |t          j                    t)                      j        |i |cd d d            S 	 d d d            n# 1 swxY w Y   t                              d	           t/          d
d           d S )NzSSH-key file z already been deletedr>   zr+rA   rB   r   c                 J    g | ]}t          j                  |v rd |z   n| S )#)r)   r   )rk   liner   s     r   rn   z$CmfSshKey.delete.<locals>.<listcomp>   s3    bbbDs49~~'='=t4bbbr   rC   u0   Невозможно удалить SSH-ключTr   )r   r(   rJ   rK   renamer   r,   r   rE   rF   rG   rH   rI   rL   rM   seek	readlinestruncate
writelinesrO   rb   deleterP   r'   )r   r}   r~   rR   rS   r0   linesrd   s   `      r   r   zCmfSshKey.deleteu   s(   }##%% 	8OOPDMPPPQQQQM  !6777#' [$+T22 	7a++K5=5=#@AAAA   OO$VWWW1$KJqMMMH	 q			bbbbTUT_T_TaTabbbq			

U###Au}---%uww~t6v66#	7 	7 	7 	7 	7 	7 	7 	7+	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7& 	]^^^DDQQQQQQs7   9F6,B/.F6/=C/,F6.C//B-F66F:=F:)NN)__name__
__module____qualname__propertyr   r   r   r1   r;   rT   r`   rc   r|   r   __classcell__)rd   s   @r   r	   r	      s       I I XI Q Q XQ F F XF) ) )$) ) ) )*T T T24 4 4E E E E E- - - - -"R R R R R R R R Rr   r	   )rr   r   r   pathlibr   r-   rL   rE   cmf.includemodules.evagit.fieldsr   r	   rj   r   r   <module>r      s     ' ' ' ' ' ' ' '              - - - - - -DR DR DR DR DR% DR DR DR DR DRr   