U
    c(                     @   s   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 d dl	T d dl
mZ d dlmZ d dlmZ G dd	 d	ejjeZdS )
    N)abort)rollback_all_ds)*)normalize_email_address)ResponseMixin)urlparsec                   @   s   e Zd ZdZdZdd Zdd Zejj	dd Z
d	d
 Zdd Zejj	dd Zejj	dd Zejj	dd Zejj	dd Zejj	dd ZdS )
SigninViewz/signin   c                 C   s4   t jd}|s0t jr0tt j}|r0|d}|S )Naccess_token)requestcookiesgetdataujsonloads)selfr
   json_res r   +/opt/account/./modules/auth/views/signin.py_get_access_token   s    

zSigninView._get_access_tokenc                 C   s   |   }|rtj|S d S )N)r   modelsCmfAuthZrsa_verify_unpack_jwt)r   r
   r   r   r   _jwt_from_request   s    zSigninView._jwt_from_requestc           
      C   sl  |   }|rZz0|d d }|d d }t|d d }d}W n6 ttttfk
rt   td d }d }d}d}Y nX d }|sd}|rtj	j
|dgd	}|sd}|r|j|krd}|rTtj tj| j}|dk rd
tjkrTtd| d| dtjd
   nLd|  kr"tjk rTn n.ttd
tjkr@tjd
 nd}| ||S t  tj }	| dS )NpayloadloginscopeexpTzjwt value errorr   Fr   fieldsnext_urlz !!! Maybe Cycle Redirect: login=z, scope=z
 next_url=/zsignin.html)r   int
ValueError	TypeErrorAttributeErrorKeyErrorlogging	exceptionr   r   r   r   datetimenowfromtimestampdaysr   valuesprintr   prolong_daysmake_responseredirect_okr   configIS_BOX_VERSIONrender)
r   jwtr   r   r   Zjwt_okauthZexpired_daysresponseZshow_register_buttonr   r   r   r   "   sL    



zSigninView.getc              
   C   s   t js
d S tjd| s d S tjjjd| t jd d}|jdd t	t j z|
  W n" tk
r } zW 5 d }~X Y nX d S )Nauth:user_login_failed:zauth:user_login_failed_lock:   )timeoutT)blocking)r2   AUTH_FREEZE_AFTER_LOGIN_FAILAPPREDIS_DBexistsredislockacquiretimesleeprelease	Exception)r   r   rA   er   r   r   _auth_freezeX   s    zSigninView._auth_freezec                 C   s   t js
d S tjd| s d S tjdd }d| }tj|}dt	j
tjdd}tj|| |stjjddd |d	d
ddd td | }|r||krtjjddd |dd
ddd td d S )Nr8   captchaauth:user_login_captcha:    )kr6   r   zRequire captcha)r   reasonfailT)operatecmf_model_nameparent
audit_dataresult_statusZcelery_skipi  zBad captcha)r2   AUTH_CHECK_CAPTCHAr=   r>   r?   r   r,   r   joinrandomchoicesstringdigitssetr   CmfAuditaudit_eventr   decode)r   r   rI   Zdb_keyZ
db_captchaZnew_captchar   r   r   _auth_check_captchah   s4    

  
  zSigninView._auth_check_captchac                 C   sx   t js
d S ttjd }tjd| s.d S ddlm	} ddl
m} tjd|  }| }||}||ddS )Nr   rJ   r   )Response)ImageCaptchaz	image/png)mimetype)r2   rU   r   r   r,   r=   r>   r?   flaskr`   Zcaptcha.imagera   r   r^   generate)r   r   r`   ra   rI   imager   r   r   r   captcha_img   s    
zSigninView.captcha_imgc                 C   s   t tjd }tjd }| | | | tj||}tjj	  |svt
jsVt
jrntjjd| ddd td td}| ||S )	Nr   challenge_respr8        exi  zSigned in successfully)r   r   r,   rH   r_   r   r   Zget_by_challenge_respdpcommitr2   r<   rU   r=   r>   r[   r   r/   r1   )r   r   rg   r6   r7   r   r   r   post   s    


zSigninView.postc                 C   s^   t tjd }tjj|dgd}|s(dS dd |jj D }d|krZt	|dkrZ|
 S dS )	Nr   z***r   rK   c                 S   s   g | ]\}}|r|qS r   r   ).0keyvalr   r   r   
<listcomp>   s      z3SigninView.get_server_challenge.<locals>.<listcomp>Z
allow_baserh   )r   r   r,   r   r   r   Zauth_optionsvalueitemslenZgen_server_challenge)r   r   r6   allowr   r   r   get_server_challenge   s    zSigninView.get_server_challengec                 C   sT  t jstd tdS t jjj}tjj	|d}|s<tdS |j
jr`td | jtd|dS tdd	 |j
j D }|std
 | jtd|dS t|dkrtd t|D ]}td|r|| qt|dkr8td | }td| tj }tjr*tj|r*tdtj }| j||dS td | jtd|dS )uu    Определить по куке куда отправить пользователя автоматически. u7   1. Нет куки - форма авторизации.z/auth/signin)r   z"/auth/signout?next_url=auth/signinuO   2.1. У пользователя нет scope - форма создания VM.z/auth/assign)r6   c                 S   s   g | ]}| d d qS ):r   )split)ro   r   r   r   r   rr      s     z&SigninView.proceed.<locals>.<listcomp>uO   2.2. У пользователя нет scope - форма создания VM.r9   ur   3.2. У пользователя два scope, проверим, не системный ли один из нихz^acrm[0-9]{5,6}$rh   uo   3. У пользователя один единственный scope - на эту CRM и отправить.zhttps://uc   4. У пользователя несколько scope - отправить на список CRM.r    )gr6   r&   infor0   emailrs   r   r   r   r   is_nullr1   r[   ry   ru   rematchdiscardpopr2   AUTH_SESSION_COOKIE_DOMAINr3   
startswith)r   r   r6   scopesr   r7   r   r   r   proceed   s8    






zSigninView.proceedc                 C   sh   t tjd }tjd }| | tj||}|s`tjs@tj	rXt
jjd| ddd td | S )u>   
            Ручка для авторизации
        r   passwordr8   rh   ri   rj   i  )r   r   r,   rH   r   r   Zfrom_login_passwordr2   r<   rU   r=   r>   r[   r   rsa_sign_pack_jwt)r   r   r   r6   r   r   r   signin_with_login_password   s    

z%SigninView.signin_with_login_passwordN)__name__
__module____qualname____url__r.   r   r   cmfviewsactionr   rH   r_   rf   rn   rw   r   r   r   r   r   r   r      s$   
5




%r   )r(   r   rW   rY   rC   rc   r   cmf.data_providers.baser   cmf.includeZmodules.auth.models.emailr   modules.auth.views.responser   urllib.parser   r   r   BaseViewr   r   r   r   r   <module>   s   