U
    Vc)                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lT d d
lmZ G dd dejZdS )    N)SMTP_SSL)AES
PKCS1_OAEP)SHA256SHA1)RSA)get_random_bytes)
PKCS1_v1_5)padunpad)*)authc                       s   e Zd ZdZdZedd Zedd Zdd Ze	d	d
 Z
dd Zdd Zedd Ze	dd Ze	dd Ze	dd Zdd Zdd Ze	dd Ze	dd Ze	d*d!d"Ze	d#d$ Ze	d+d&d'Z fd(d)Z  ZS ),CmfAuth    
   c                 C   s    | j   t| j dd S )N$	pass_hashloadbase64	b64decodesplitself r   ./modules/auth/models/auth.pykey   s    
zCmfAuth.keyc                 C   s    | j   t| j dd S )Nr   r   r   r   r   r   salt   s    
zCmfAuth.saltc                 C   s2   t | j}|ttt 7 }|| j 7 }|S N)secrets	token_hextoken_lengthstrinttimer   hex)r   server_challenger   r   r   gen_server_challenge#   s    zCmfAuth.gen_server_challengec                 C   s   d| j d  }}||| }||d  }}||| }|t| }}t||| }td| |d}	t| j }
t	t
t }||
 | | }ttj}t|	tj|}|t| tj}||  S )Nr      r   sha256順 )r#   lenbytesfromhexhashlibpbkdf2_hmacencoder!   r"   r$   r%   r&   r   r   
block_sizenewMODE_CBCZencryptr
   r'   )clsloginpasswordr(   startendserver_randomserver_timestampZserver_saltZtest_keyclient_randomZsecretivcipherZencrypted_secretr   r   r   test_gen_server_challenge_resp)   s&       
z&CmfAuth.test_gen_server_challenge_respc              	   C   s   ddd}|  ddg | jsftjtd rfttd }|  }W 5 Q R X | d| _| 	  | j
jttt d | jjd	}tt|  }tt|  }| d
| S )NZRS256ZJWT)Zalgtypr7   scope/custom/org_name:i փ )r7   exprB   .)Zload_fieldsrB   ospathexistsPROJECT_DIRopenreadstripsaver7   valuer$   r%   r&   r   	b64encodejsondumpsr2   decode)r   headerforg_namepayloadr   r   r   
create_jwtF   s    
zCmfAuth.create_jwtc                 C   sT   |   }ttj}t }||  ||}t	
| }| d| }|S )NrF   )rX   r	   r4   APPZrsa_private_keyr   updater2   signr   rP   rS   )r   jwtZsignerdigestr[   resr   r   r   rsa_sign_pack_jwtY   s    
zCmfAuth.rsa_sign_pack_jwtc                 C   s   |  d\}}}t }| d| }||  t|}ttj	}|
||}|s^d S t| }t| }t|}t|}tt t|d krtdt |d  d S ||dS )NrF   rE   u9   Время жизни токена закончилось)rT   rW   )r   r   r4   rZ   r2   r   r   r	   rY   Zrsa_public_keyZverifyrS   rQ   loadsr%   r&   gdebug)rjwtrT   rW   Z	signaturer]   r\   ZverifierZverifiedr   r   r   rsa_verify_unpack_jwtd   s"    


zCmfAuth.rsa_verify_unpack_jwtc              
   C   s|  t d |st d d S z| |}W n2 tk
r\ } ztjd d }W 5 d }~X Y nX |spt d d S | dd}|d d |_|d d |_|d d	 |_	d |_
d |_d }tjtd
 rttd
 }|  }W 5 Q R X | |_|j	pddD ]T}|r|| dr"d|_|dkr t jjr t d|  d|_
d|_q t d|j d|j	 d|j  |S )Nzfrom_jwt: startzfrom_jwt: warn not jwtzfail unpack jwtz2from_jwt: warn not cls.rsa_verify_unpack_jwt(rjwt)T)emptyrW   r7   rB   rC     rD   r   uC   from_jwt: Доступ по билету тех поддержки zfrom_jwt: jwt is ok, z, z, is_local=)ra   rb   rd   	ExceptionrY   loggerZ	exceptionr7   emailrB   Zjwt_is_supportZjwt_is_match_orgrG   rH   rI   rJ   rK   rL   rM   r   
startswithZglobal_settingsZsupport_mode)r6   rc   r\   eobjrV   rU   Zpermr   r   r   from_jwt~   s@    




"zCmfAuth.from_jwtc                 C   s  | j |d}|sd S tjr|S t|}dtj }}||| }|t| }}||| }t|j	tj
|}||}	t|	tj}
|
 }d|jd  }}||| }|||jd   }}||| }|||j  }}||| }|t| }}||| }t t| dkrd S |S )N)r7   r   r*   iQ )getconfigZ
FAKE_LOGINr.   r/   r   r3   r-   r4   r   r5   Zdecryptr   rS   r#   	ts_lengthr&   r%   )r6   r7   Zchallenge_resprm   r9   r:   r>   Zencrypted_messager?   Zres0Zres1Zres2r;   r=   r<   r   r   r   get_by_challenge_resp   s2    

zCmfAuth.get_by_challenge_respc                 C   s"   |  }||_ ||_||| |S r    )r7   rj   set_pass_hash)r6   r7   hashr   rm   r   r   r   new_from_login_hash_salt   s
    z CmfAuth.new_from_login_hash_saltc                 C   s$   t |}t |}| || d S r    )r.   r/   set_pass_hash_bytes)r   rt   r   
hash_bytes
salt_bytesr   r   r   rs      s    

zCmfAuth.set_pass_hashc                 C   s<   | j   t| }t| }d| d| | _ d S )Nzpbkdf2_sha256$100000$r   )r   r   r   rP   rS   )r   rw   rx   Zhash_b64Zsalt_b64r   r   r   rv      s
    
zCmfAuth.set_pass_hash_bytesc                 C   s   t jS r    )ra   r   )r6   r   r   r   current_auth   s    zCmfAuth.current_authc                 C   s:   g }t dD ]}|ttjtj  qd|dS )N   rf   zutf-8)	rangeappendrandomchoicestringascii_lettersdigitsjoinr2   )r6   charsir   r   r   gen_salt   s    zCmfAuth.gen_salt   Tc                    s   t jt j  d fddt|D }|  }td| |d}|  }||_	||_
||| |rt| || nt| d|  |S )Nrf   c                 3   s   | ]}t  V  qd S r    )r}   r~   ).0r   Zlettersr   r   	<genexpr>   s     z)CmfAuth.new_from_login.<locals>.<genexpr>r+   r,   rD   )r   r   r   r   r{   r   r0   r1   r2   r7   rj   rv   send_passwordprint)r6   r7   lengthZ
send_emailr8   r   rt   rm   r   r   r   new_from_login   s"       zCmfAuth.new_from_loginc              
   C   s   ddl m} dd l}ddlm} ddlm} dtj }d|g}d	|d }	|d}
||
d	< tj
|
d
< ||
d< |d}|
| ||	}|| z.ttjtjdd}|  |tj
tj W n6 tk
r } zt| | W Y d S d }~X Y nX ||
d
 |
d |
  |  d S )Nr   )SMTP)MIMEMultipart)MIMETextu&   Пароль для доступа к u   Пароль:
ZrelatedZSubjectZFromZToZalternative   )timeout)smtplibr   	tracebackZemail.mime.multipartr   Zemail.mime.textr   rp   ZPROJECT_NAMEr   Z
EMAIL_USERZattachr   ZEMAIL_HOST_ADDRZ
EMAIL_PORTZehlor7   ZEMAIL_PASSWORDOSErrorr   
format_excZsendmailZ	as_stringquit)r6   r8   rj   r   r   r   r   ZsubjectZmsg_contentsZbodyZmsg_rootZmsg_alternativeZplainZsmtprl   r   r   r   r     s0    


zCmfAuth.send_passwordNc                 C   sh   ddl m} | }tj||d}|  |jtj d|ddd}|jdkrVt	d	t
|jd
dS )Nr   )session)r7   rg_member_ofz/auth/signupT)r7   Zgen_pwd)data   u>   Не удалось создать учётную записьaccess_token)r   )Zrequestsr   ZmodelsZ	CmfPersonrN   Zpostrp   ZAUTH_SERVER_URLZstatus_coderh   dictZcookiesro   )r6   r7   r   r   sZpersonrr   r   r   create_person(  s    

zCmfAuth.create_personc                    sp   | j jrb| j jsb| jjrd| _| j D ].}| j | D ]}|  jd| d| 7  _q2q$| jj | _t j||S )Nrf   rg   rD   )groupsZ
is_changedZis_nullrB   rO   rM   superrN   )r   argskwargsrV   Zgrp_name	__class__r   r   rN   >  s    
zCmfAuth.save)r   T)N)__name__
__module____qualname__r#   rq   propertyr   r   r)   classmethodr@   rX   r_   staticmethodrd   rn   rr   ru   rs   rv   ry   r   r   r   r   rN   __classcell__r   r   r   r   r      s@   




'
'




r   )r   r0   rQ   r}   r!   r   r&   r   r   ZCrypto.Cipherr   r   ZCrypto.Hashr   r   ZCrypto.PublicKeyr   ZCrypto.Randomr   ZCrypto.Signaturer	   ZCrypto.Util.Paddingr
   r   Zcmf.includeZmodules.auth.fieldsr   r   r   r   r   r   <module>   s    