U
    >i;J                     @   s  d dl mZ d dlmZ d dlmZ d dlmZ	 d dl
mZ d dlmZmZmZ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mZ d dlmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZC G dd de>ZDG dd de>ZEee"ddddG dd de>ZFee"ddddG dd  d e>ZGG d!d" d"e>ZHG d#d$ d$e>ZIG d%d& d&e>ZJG d'd( d(e>ZKG d)d* d*e>ZLG d+d, d,e>ZMee"d-dddG d.d/ d/e>ZNee"d0dddG d1d2 d2e?ZOG d3d4 d4e>ZPG d5d6 d6e>ZQee"d7dddG d8d9 d9e?ZRd:S );    )
HTTPStatus)method_decorator)app_settings)get_adapter)flows)email_verificationmanage_emailpassword_changepassword_resetpassword_reset_by_code)"send_verification_email_to_address)EmailVerificationProcess)PhoneVerificationStageProcess)EmailVerificationStageLoginStageControllerPhoneVerificationStage)	ratelimit)ImmediateHttpResponseRateLimited)
rate_limit)response)AddEmailInputChangeEmailInputChangePasswordInputChangePhoneInputConfirmLoginCodeInputDeleteEmailInput
LoginInputMarkAsPrimaryEmailInputReauthenticateInputRequestLoginCodeInputRequestPasswordResetInputResendEmailVerificationInputResetPasswordInputResetPasswordKeyInputSignupInputVerifyEmailInputVerifyPhoneInput)APIResponseAuthenticationResponseConflictResponseForbiddenResponseRateLimitResponse)APIViewAuthenticatedAPIView)authkit)ErrorResponsec                   @   s   e Zd ZeZdd ZdS )RequestLoginCodeViewc                 O   s:   t jjj| j| jj| jjd| jjdd t	| jS )Nemailphone)requestuserr2   r3   )
r   login_by_codeLoginCodeVerificationProcessinitiater4   input_usercleaned_datagetr)   selfr4   argskwargs rA   B/tmp/pip-unpacked-wheel-upujnpc2/allauth/headless/account/views.pypostC   s    zRequestLoginCodeView.postN)__name__
__module____qualname__r    input_classrC   rA   rA   rA   rB   r1   @   s   r1   c                       s@   e Zd ZeZ fddZdd Z fddZ fddZ  Z	S )	ConfirmLoginCodeViewc                    sV   t |}| | _| js"t|S tjj| j| _	| j	sBt|S t
 j|f||S N)r/   ZAuthenticationStatusZget_pending_stagestager*   r   r6   r7   resumeprocesssuperdispatch)r>   r4   r?   r@   Zauth_status	__class__rA   rB   rN   P   s    

zConfirmLoginCodeView.dispatchc                 O   s   | j d }t||S rI   )rL   finishr)   from_responser>   r4   r?   r@   r   rA   rA   rB   rC   \   s    zConfirmLoginCodeView.postc                    s   t   }| jj|d< |S )Ncode)rM   get_input_kwargsrL   rT   )r>   r@   rO   rA   rB   rU   `   s    
z%ConfirmLoginCodeView.get_input_kwargsc                    s   | j   t |S rI   rL   record_invalid_attemptrM   handle_invalid_inputr>   r9   rO   rA   rB   rX   e   s    
z)ConfirmLoginCodeView.handle_invalid_input)
rD   rE   rF   r   rG   rN   rC   rU   rX   __classcell__rA   rA   rO   rB   rH   M   s
   rH   login)actionhandle)namec                   @   s   e Zd ZeZdd ZdS )	LoginViewc                 O   s8   |j jrt|S | jj}tj||| jj}t	||S rI   )
r5   is_authenticatedr*   r9   r;   r   r[   Zperform_password_loginr)   rR   )r>   r4   r?   r@   credentialsr   rA   rA   rB   rC   n   s      zLoginView.postN)rD   rE   rF   r   rG   rC   rA   rA   rA   rB   r_   j   s   r_   signupc                   @   s    e Zd ZdeiZdZdd ZdS )
SignupViewPOSTFc                 O   sr   |j jrt|S t |s$t|S | j|\}}|sfztj	j
||| jd}W n tk
rd   Y nX t||S )N)r5   
by_passkey)r5   r`   r*   get_account_adapterZis_open_for_signupr+   r9   Ztry_saver   rb   Zcomplete_signupre   r   r)   rR   )r>   r4   r?   r@   r5   resprA   rA   rB   rC   }   s      
zSignupView.postN)rD   rE   rF   r%   rG   re   rC   rA   rA   rA   rB   rc   x   s   rc   c                   @   s   e Zd Zdd Zdd ZdS )SessionViewc                 O   s   t |S rI   )r)   r=   rA   rA   rB   r<      s    zSessionView.getc                 O   s   t  }|| t|S rI   )rf   Zlogoutr)   )r>   r4   r?   r@   adapterrA   rA   rB   delete   s    
zSessionView.deleteN)rD   rE   rF   r<   rj   rA   rA   rA   rB   rh      s   rh   c                       sJ   e Zd ZeZ fddZdd Zed fddZdd	 Zd
d Z	  Z
S )VerifyEmailViewc                    sj   t |tj| _| js,tjr,|jjs,t	|S d | _
tjrVtjj|| _
| j
sVt	|S t j|f||S rI   )r   enterr   keyrJ   account_settings"EMAIL_VERIFICATION_BY_CODE_ENABLEDr5   r`   r*   rL   r   email_verification_by_coder   rK   rM   r]   r=   rO   rA   rB   r]      s"    zVerifyEmailView.handlec                 C   s
   d| j iS )NrL   rL   r>   rA   rA   rB   rU      s    z VerifyEmailView.get_input_kwargsr9   c                    s   | j r| j   t |S rI   rV   rY   rO   rA   rB   rX      s    
z$VerifyEmailView.handle_invalid_inputc                 O   sp   |j dd}| jd|i| jd}| sF| jr:| j  t||dS | jrV| jj}n|jj}t	j
||| jdS )Nzx-email-verification-key rm   rq   rs   )rJ   )headersr<   rG   rL   is_validrW   r0   email_addressverificationr   ZVerifyEmailResponserJ   )r>   r4   r?   r@   rm   r9   rw   rA   rA   rB   r<      s    

zVerifyEmailView.getc                 O   sT   | j r| j  }n| jj|}|s2t|tjdS d }| jrHt	
||}t||S )Nstatus)rL   rQ   r9   rx   Zconfirmr(   r   INTERNAL_SERVER_ERRORrJ   r   Zlogin_on_verificationr)   rR   )r>   r4   r?   r@   rw   r   rA   rA   rB   rC      s    zVerifyEmailView.post)rD   rE   rF   r&   rG   r]   rU   rX   r<   rC   rZ   rA   rA   rO   rB   rk      s   rk   c                       sB   e Zd ZeZ fddZdd Zed fddZdd	 Z  Z	S )
VerifyPhoneViewc                    sl   t |tj| _| jr*tjj| j| _	n |j
js:t|S tjj|| _	| j	sXt|S t j|f||S rI   )r   rl   r   rm   rJ   r   phone_verificationr   rK   rL   r5   r`   r*   ChangePhoneVerificationProcessrM   r]   r=   rO   rA   rB   r]      s    zVerifyPhoneView.handlec                 C   s   | j j| j j| j jdS )N)rT   r5   r3   )rL   rT   r5   r3   rr   rA   rA   rB   rU      s    z VerifyPhoneView.get_input_kwargsrs   c                    s   | j   t |S rI   rV   rY   rO   rA   rB   rX      s    
z$VerifyPhoneView.handle_invalid_inputc                 O   s*   | j   d }| jr| j }t||S rI   )rL   rQ   rJ   exitr)   rR   rS   rA   rA   rB   rC      s
    

zVerifyPhoneView.post)
rD   rE   rF   r'   rG   r]   rU   rX   rC   rZ   rA   rA   rO   rB   r|      s
   r|   c                   @   s   e Zd ZdZdd ZdS )ResendPhoneVerificationCodeViewFc                 O   sh   d }t |tj}|r$tjj|}|r.|js6t	|S z|
  W n tk
r^   t| Y S X t|S rI   )r   rl   r   rm   r   r}   r   rK   
can_resendr*   resendr   r,   r(   )r>   r4   r?   r@   rL   rJ   rA   rA   rB   rC      s    
z$ResendPhoneVerificationCodeView.postNrD   rE   rF   Zhandle_json_inputrC   rA   rA   rA   rB   r      s   r   c                   @   s   e Zd ZdZdd ZdS )ResendEmailVerificationCodeViewFc                 O   s`   t jst|S tjj|}|r&|js.t|S z|  W n t	k
rV   t
| Y S X t|S rI   )rn   ro   r*   r   rp   r   rK   r   r   r   r,   r(   )r>   r4   r?   r@   rL   rA   rA   rB   rC     s    
z$ResendEmailVerificationCodeView.postNr   rA   rA   rA   rB   r     s   r   c                   @   s   e Zd ZeZdd ZdS )RequestPasswordResetViewc                 O   sJ   t j| jd| jjd  d}|r&|S | j| tjr@t	|S t
|S )Nreset_passwordr2   )r\   rm   )r   consume_or_429r4   r9   r;   lowersavern   PASSWORD_RESET_BY_CODE_ENABLEDr)   r   ZRequestPasswordResponse)r>   r4   r?   r@   Zr429rA   rA   rB   rC   #  s    zRequestPasswordResetView.postN)rD   rE   rF   r!   rG   rC   rA   rA   rA   rB   r      s   r   Zreset_password_from_keyc                       sJ   e Zd ZeZed fddZ fddZdd Zdd	 Zd
d Z	  Z
S )ResetPasswordViewrs   c                    s&   | j rd|jkr| j   t |S )Nrm   )rL   errorsrW   rM   rX   rY   rO   rA   rB   rX   5  s    
z&ResetPasswordView.handle_invalid_inputc                    s>   d | _ tjr*tj| j| _ | j s*t|S t j	|f||S rI   )
rL   rn   r   r   Z PasswordResetVerificationProcessrK   r4   r*   rM   r]   r=   rO   rA   rB   r]   :  s    zResetPasswordView.handlec                 O   s   |j dd}| jr`td|i| jjd}| sF| j  t||dS | j  t	
|| jjS td|i}| st||dS t	
||jS d S )NzX-Password-Reset-Keyrt   rm   )rT   rs   )ru   r<   rL   r$   rT   rv   rW   r0   confirm_coder   ZPasswordResetKeyResponser5   )r>   r4   r?   r@   rm   r9   rA   rA   rB   r<   F  s    

zResetPasswordView.getc                 C   s&   i }| j r"|| j j| j jd |S )N)rT   r5   )rL   updaterT   r5   )r>   retrA   rA   rB   rU   U  s    z"ResetPasswordView.get_input_kwargsc                 O   sP   | j j}tj|| j jd  | jr:| j  | j  nt	|| t
| jS )Npassword)r9   r5   r   r
   r   r;   rL   r   rQ   Zfinalize_password_resetr)   r4   )r>   r4   r?   r@   r5   rA   rA   rB   rC   [  s    
zResetPasswordView.post)rD   rE   rF   r#   rG   rX   r]   r<   rU   rC   rZ   rA   rA   rO   rB   r   1  s   r   change_passwordc                   @   s    e Zd ZeZdd Zdd ZdS )ChangePasswordViewc                 O   sR   t | jj| jjd  | jjd }|r<t ||j nt ||j t	|S )NZnew_passwordZcurrent_password)
r	   r   r4   r5   r9   r;   r<   Zfinalize_password_setZfinalize_password_changer)   )r>   r4   r?   r@   is_setrA   rA   rB   rC   j  s     
zChangePasswordView.postc                 C   s   d| j jiS Nr5   r4   r5   rr   rA   rA   rB   rU   u  s    z#ChangePasswordView.get_input_kwargsN)rD   rE   rF   r   rG   rC   rU   rA   rA   rA   rB   r   f  s   r   c                       sn   e Zd ZeeeedZ fddZdd Z	dd Z
dd	 Zd
d Zdd Zdd Z fddZdd Z  ZS )ManageEmailView)rd   PUTDELETEPATCHc                    s   d | _ |jjr|j| _n>|jdkr*t|S t|| _ | j rD| j jsLt|S | j j| _t	j
|d| jd}|rp|S t j|f||S )Nrd   r   r\   r5   )verification_stage_processr5   r`   methodr)   r   rK   
can_changer*   r   r   rM   rN   )r>   r4   r?   r@   rg   rO   rA   rB   rN     s     


zManageEmailView.dispatchc                 O   s   |   S rI   )_respond_email_listr=   rA   rA   rB   r<     s    zManageEmailView.getc                 C   s   t | j| j}t| j|S rI   )r   Zlist_email_addressesr4   r5   r   ZEmailAddressesResponse)r>   addrsrA   rA   rB   r     s    z#ManageEmailView._respond_email_listc                 O   s<   | j r$| j j| jjd | jjd ntj|| j |  S )Nr2   )r2   account_already_exists)	r   	change_tor9   r;   r   r   r   Z	add_emailr   r=   rA   rA   rB   rC     s    
zManageEmailView.postc                 O   s6   | j jd }|jr"tj|| n| j j  |  S Nr2   )	r9   r;   pkr   r   Zdelete_emailrL   abortr   r>   r4   r?   r@   addrrA   rA   rB   rj     s
    zManageEmailView.deletec                 O   s"   | j jd }tj|| |  S r   )r9   r;   r   r   Zmark_as_primaryr   r   rA   rA   rB   patch  s    zManageEmailView.patchc                 O   sf   | j jd }| j j }rNd}|jrXz| j j  d}W qX tk
rJ   Y qXX n
t||}tj||dS )Nr2   FT)Zverification_sent)	r9   r;   rL   r   r   r   r   r   Z RequestEmailVerificationResponse)r>   r4   r?   r@   r   rL   sentrA   rA   rB   put  s    
 zManageEmailView.putc                    s   | j r
tS t  S rI   )r   r   rM   get_input_classrr   rO   rA   rB   r     s    zManageEmailView.get_input_classc                 C   s   | j rd| j jiS d| jiS )Nr2   r5   )r   r2   r5   rr   rA   rA   rB   rU     s    z ManageEmailView.get_input_kwargs)rD   rE   rF   r   r"   r   r   rG   rN   r<   r   rC   rj   r   r   r   rU   rZ   rA   rA   rO   rB   r   y  s   
r   c                       s8   e Zd ZeZ fddZdd Zdd Zdd Z  Z	S )	ManagePhoneViewc                    s   d | _ |jjr|j| _nZ|jdkr*t|S |jdkrrt|tj}|rRt	
|| _ | j r`| j jsht|S | j j| _tj|d| jd}|r|S t j|f||S )NGETrd   Zchange_phoner   )r   r5   r`   r   r)   r   rl   r   rm   r   rK   r   r*   r   r   rM   rN   )r>   r4   r?   r@   rJ   rg   rO   rA   rB   rN     s*    



zManagePhoneView.dispatchc                 O   s>   g }t  | jj}|r0||d |d d t| j|S )Nr      r3   Zverified)rf   	get_phoner4   r5   appendr   PhoneNumbersResponse)r>   r4   r?   r@   Zphone_numbersphone_verifiedrA   rA   rB   r<     s    zManagePhoneView.getc                 O   sV   | j jd }| jr(| jj|| j jd ntjj| j	| t
j| j	|ddgtjdS )Nr3   )r3   r   Fr   ry   )r9   r;   r   r   r   r   r}   r~   r8   r4   r   r   r   ACCEPTED)r>   r4   r?   r@   r3   rA   rA   rB   rC     s$     zManagePhoneView.postc                 C   s*   d }t  | j}|r|d }|| jdS )Nr   )r3   r5   )rf   r   r5   )r>   r3   r   rA   rA   rB   rU     s
    z ManagePhoneView.get_input_kwargs)
rD   rE   rF   r   rG   rN   r<   rC   rU   rZ   rA   rA   rO   rB   r     s
   	r   Zreauthenticatec                   @   s    e Zd ZeZdd Zdd ZdS )ReauthenticateViewc                 O   s   t j| j t| jS rI   )r   ZreauthenticationZreauthenticate_by_passwordr4   r)   r=   rA   rA   rB   rC     s    zReauthenticateView.postc                 C   s   d| j jiS r   r   rr   rA   rA   rB   rU     s    z#ReauthenticateView.get_input_kwargsN)rD   rE   rF   r   rG   rC   rU   rA   rA   rA   rB   r     s   r   N)Shttpr   Zdjango.utils.decoratorsr   Zallauth.accountr   rn   Zallauth.account.adapterr   rf   Zallauth.account.internalr   Zallauth.account.internal.flowsr   r   r	   r
   r   Z1allauth.account.internal.flows.email_verificationr   Z9allauth.account.internal.flows.email_verification_by_coder   Z1allauth.account.internal.flows.phone_verificationr   Zallauth.account.stagesr   r   r   Zallauth.corer   Zallauth.core.exceptionsr   r   Zallauth.decoratorsr   Zallauth.headless.accountr   Zallauth.headless.account.inputsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Zallauth.headless.base.responser(   r)   r*   r+   r,   Zallauth.headless.base.viewsr-   r.   Zallauth.headless.internalr/   Z*allauth.headless.internal.restkit.responser0   r1   rH   r_   rc   rh   rk   r|   r   r   r   r   r   r   r   r   rA   rA   rA   rB   <module>   sL   L
<(4TA