
    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 d dl	m
Z
  G d de
j                        Zy)    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                 T    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~~&&6tyykGHH    c                 T    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~~&&>tyykO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~~&&CDEEr   c                    | j                   j                          | j                   st        dd       | j                  j	                         rt        dd       t        | j                   j                        | j                  rt        | j                        nd i d}| j                  j                   j                  dd       t        | j                  d      5 }t        j                  ||d	       d d d        y # 1 sw Y   y xY w)
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   s    {{clpq==!PY]^ '<@<P<Ps4#7#78VZ
 	""D$"?$--% 	)IIdAa(	) 	) 	)s   C>>Dc                     |xs i |xs g }}| j                   j                         st        d| j                   dd       t	        | j                   d      5 }t        j                  |      }d d d        |j                         D ]  \  }}|d   |<    |D ]  }|d   vrd|d   |   d<    t	        | j                   d	      5 }t        j                  |d
       d d d        y # 1 sw Y   {xY w# 1 sw Y   y xY w)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	}}##%7		{BYZbfg$--% 	 99Q<D	  $//+ 	'JD$"&DM$	'  	.D4=(+-DM$(		. $--% 	)IIdAa(	) 	)	  	 	) 	)s   C(C4(C14C=c                 v   dt         j                   d| j                   d| j                   d}d\  }}t	        | j
                  d      5 }||k  ru	 t        j                  |t        j                  t        j                  z         |j                  |       t        j                  |t        j                          	 d d d        y 	 d d d        t        j#                  d	       t%        d
d       y # t        $ r2 t        j                  d       |dz  }t        j                  d       Y w xY w# 1 sw Y   jxY w)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   
FNN#<		{ ;K88*B
 $( [$++S1 	Q+KK5==5==#@A &Au}}-	 	+	 	\^FdS  OO&UW1$KJJqM			 	s0   
D/5C16D/18D,)D/+D,,D//D8c                     t         j                  j                  | j                  g d      }|D ]  }|j	                  | g        y )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   sH    1166;;O 7  ) 	4K))4(3	4r   c                 (    t         |          dgz   S )Nr   )supersave_preload_fields)r   	__class__s    r   rc   zCmfSshKey.save_preload_fieldsa   s    w*,0A/DDDr   c           	         | j                   st        dd       | j                  r>| j                  t        j                  t
        j                        k  rt        dd       t        j                  | j                  j                  j                               j                         }dj                  t        dt        |      d      D cg c]
  }|||dz     c}      | _        t        j"                  | j                  j                  j                               j                         | _        | j'                          | j)                          | j+                          t-        | \  |i |S c c}w )	Nu<   SSH-ключ невозможно редактироватьTr   )tzum   Дата истечения срока действия ключа не может быть в прошлом:r      )is_newr'   r   r   nowr   utchashlibmd5rD   valueencode	hexdigestjoinrangelenfingerprintsha256fingerprint_sha256r1   rT   r`   rb   save)r   argskwargsrm   ird   s        r   rw   zCmfSshKey.saved   s   {{T]abD$8$88<<8<<;X$X  F  NR  Skk$((..//12<<>88q#c(A9N$OAS1Q3Z$OP")..1F1F1H"I"S"S"U  "!!#w|T,V,, %Ps   E1c                    | j                   j                         s$t        j                  d| j                    d       n%| j                   j	                  | j
                         d\  }}t        | j                  d      5 }||k  r	 t        j                  |t        j                  t        j                  z         |j                  d       |j!                         D cg c]   }t#        | j$                        |v rd|z   n|" }}|j                  d       |j'                          |j)                  |       t        j                  |t        j*                         t-        | \  |i |cd d d        S 	 d d d        t        j1                  d	       t3        d
d       y # t        $ r3 t        j                  d       |dz  }t        j                  d       Y Zw xY wc c}w # 1 sw Y   pxY w)NzSSH-key file z already been deletedr>   zr+rA   rB   r   #rC   u0   Невозможно удалить SSH-ключTr   )r   r(   rJ   rK   renamer   r,   r   rE   rF   rG   rH   rI   rL   rM   seek	readlinesr)   r   truncate
writelinesrO   rb   deleterP   r'   )	r   rx   ry   rR   rS   r0   linelinesrd   s	           r   r   zCmfSshKey.deleteu   s   }}##%OOmDMM?:OPQMM  !6!67#' [$++T2 	7a+KK5==5==#@A q	TUT_T_TabDs499~'=t4Gbbq	

U#Au}}-w~t6v6#	7 	7+	7& 	\^DDQ!  OO&UW1$KJJqM	 c	7 	7s=    G$5F <#G$%GA&G$ 8GG$GG$$G-)NN)__name__
__module____qualname__propertyr   r   r   r1   r;   rT   r`   rc   rw   r   __classcell__)rd   s   @r   r	   r	      so    I I Q Q F F)$)*T24E-"R Rr   r	   )rl   r   r   pathlibr   r-   rL   rE   cmf.includemodules.evagit.fieldsr   r	    r   r   <module>r      s3     '      -DR%% DRr   