U
    >i'                     @   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 d dlmZ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 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. d dl/m0Z0m1Z1 d dl2m3Z4m-Z5 d dl6m3Z7m-Z8 d dl9m:Z: dd Z;G dd deZ<G dd deZ=G dd deZ>G dd deZ?G dd deZ@G dd  d eZAG d!d" d"eZBG d#d$ d$eZCG d%d& d&eZDG d'd( d(e	ZEG d)d* d*eZFd+S ),    )
HTTPStatus)ValidationError)get_pending_stage)Login)
SignupView)APIResponseAuthenticationResponseConflictResponse)APIViewAuthenticatedAPIViewAuthenticationStageAPIView)ErrorResponse)response)ActivateTOTPInputAddWebAuthnInputAuthenticateInputAuthenticateWebAuthnInputCreateWebAuthnInputDeleteWebAuthnInputGenerateRecoveryCodesInputLoginWebAuthnInputReauthenticateWebAuthnInputSignupWebAuthnInput
TrustInputUpdateWebAuthnInput)DefaultMFAAdapterget_adapter)add)trust_browser)Authenticator)flows)AuthenticateStage
TrustStage)authr    )PasskeySignupStagec              
   C   sL   zt | j W n6 tk
rF } zt| tj|d W Y S d }~X Y nX d S )N)status	exception)r   Zvalidate_can_add_authenticatoruserr   r   r   CONFLICT)requeste r+   >/tmp/pip-unpacked-wheel-upujnpc2/allauth/headless/mfa/views.py_validate_can_add_authenticator-   s    r-   c                   @   s$   e Zd ZeZeZdd Zdd ZdS )AuthenticateViewc                 O   s   | j   |  S Ninputsaverespond_next_stageselfr)   argskwargsr+   r+   r,   post8   s    
zAuthenticateView.postc                 C   s   d| j jjiS Nr'   stageloginr'   r5   r+   r+   r,   get_input_kwargs<   s    z!AuthenticateView.get_input_kwargsN)	__name__
__module____qualname__r   input_classr!   stage_classr8   r>   r+   r+   r+   r,   r.   4   s   r.   c                   @   s    e Zd ZeZdd Zdd ZdS )ReauthenticateViewc                 O   s   | j   t| jS r/   )r1   r2   r   r)   r4   r+   r+   r,   r8   C   s    
zReauthenticateView.postc                 C   s   d| j jiS r9   r)   r'   r=   r+   r+   r,   r>   G   s    z#ReauthenticateView.get_input_kwargsN)r?   r@   rA   r   rB   r8   r>   r+   r+   r+   r,   rD   @   s   rD   c                   @   s   e Zd Zdd ZdS )AuthenticatorsViewc                 O   s   t jj|jd}t||S )N)r'   )r   objectsfilterr'   r   ZAuthenticatorsResponser5   r)   r6   r7   authenticatorsr+   r+   r,   getL   s    zAuthenticatorsView.getN)r?   r@   rA   rK   r+   r+   r+   r,   rF   K   s   rF   c                   @   sB   e Zd ZdeiZedddZdd Zdd Zd	d
 Z	dd Z
dS )ManageTOTPViewPOST)returnc           	      O   sV   |   }|sJt|}|r|S t }tjdd}||j|}t|||S t	||S )NT)Z
regenerate)
_get_authenticatorr-   r   	totp_authZget_totp_secretZbuild_totp_urlr'   r   ZTOTPNotFoundResponseTOTPResponse)	r5   r)   r6   r7   authenticatorerradaptersecretZtotp_urlr+   r+   r,   rK   T   s    zManageTOTPView.getc                 C   s   t jjt jj| jjd S )N)typer'   )r   rG   rH   TypeZTOTPr)   r'   firstr=   r+   r+   r,   rO   `   s     z!ManageTOTPView._get_authenticatorc                 C   s   d| j jiS r9   rE   r=   r+   r+   r,   r>   e   s    zManageTOTPView.get_input_kwargsc                 O   s   t || jd }t||S )Nr   )
totp_flowsZactivate_totpr1   r   rQ   r5   r)   r6   r7   rR   r+   r+   r,   r8   h   s    zManageTOTPView.postc                 O   s"   |   }|rt||}t|S r/   )rO   rY   Zdeactivate_totpr   ZAuthenticatorDeletedResponserZ   r+   r+   r,   deletel   s    zManageTOTPView.deleteN)r?   r@   rA   r   rB   r   rK   rO   r>   r8   r[   r+   r+   r+   r,   rL   Q   s   rL   c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )ManageRecoveryCodesViewc                 O   s$   t |}|st|S t||S r/   )recovery_codes_flowsZview_recovery_codesr   ZRecoveryCodesNotFoundResponseRecoveryCodesResponserZ   r+   r+   r,   rK   v   s    

zManageRecoveryCodesView.getc                 O   s   t |}t||S r/   )r]   Zgenerate_recovery_codesr   r^   rZ   r+   r+   r,   r8   |   s    
zManageRecoveryCodesView.postc                 C   s   d| j jiS r9   rE   r=   r+   r+   r,   r>      s    z(ManageRecoveryCodesView.get_input_kwargsN)r?   r@   rA   r   rB   rK   r8   r>   r+   r+   r+   r,   r\   s   s   r\   c                       sP   e Zd ZeeedZ fddZdd Zdd Z	dd	 Z
d
d Zdd Z  ZS )ManageWebAuthnView)rM   PUTDELETEc                    s.   |j dkrt|}|r|S t j|f||S )N)GETrM   )methodr-   superhandle)r5   r)   r6   r7   rS   	__class__r+   r,   re      s
    
zManageWebAuthnView.handlec                 O   s&   d|j k}t||j|}t||S )Npasswordless)rb   webauthn_flowsbegin_registrationr'   r   AddWebAuthnResponse)r5   r)   r6   r7   rh   creation_optionsr+   r+   r,   rK      s    
  zManageWebAuthnView.getc                 C   s   d| j jiS r9   rE   r=   r+   r+   r,   r>      s    z#ManageWebAuthnView.get_input_kwargsc                 O   s@   t j|| jjd | jjd d\}}t|}tj||d|idS )Nname
credential)rm   rn   Zrecovery_codes_generated)meta)ri   Zadd_authenticatorr1   cleaned_databoolr   AuthenticatorResponse)r5   r)   r6   r7   r#   Zrc_authZdid_generate_recovery_codesr+   r+   r,   r8      s    


zManageWebAuthnView.postc                 O   s.   | j jd }t||| j jd  t||S )Nidrm   )r1   rp   ri   Zrename_authenticatorr   rr   rZ   r+   r+   r,   put   s      
zManageWebAuthnView.putc                 O   s"   | j jd }t|| t|S )NrJ   )r1   rp   ri   Zremove_authenticatorsr   ZAuthenticatorsDeletedResponserI   r+   r+   r,   r[      s    zManageWebAuthnView.delete)r?   r@   rA   r   r   r   rB   re   rK   r>   r8   rt   r[   __classcell__r+   r+   rf   r,   r_      s   r_   c                   @   s,   e Zd ZdeiZdd Zdd Zdd ZdS )	ReauthenticateWebAuthnViewrM   c                 O   s   t |j}t||S r/   )webauthn_authbegin_authenticationr'   r   WebAuthnRequestOptionsResponser5   r)   r6   r7   Zrequest_optionsr+   r+   r,   rK      s    zReauthenticateWebAuthnView.getc                 C   s   d| j jiS r9   rE   r=   r+   r+   r,   r>      s    z+ReauthenticateWebAuthnView.get_input_kwargsc                 O   s"   | j jd }t|| t| jS )Nrn   )r1   rp   ri   Zreauthenticater   r)   rZ   r+   r+   r,   r8      s    zReauthenticateWebAuthnView.postN)r?   r@   rA   r   rB   rK   r>   r8   r+   r+   r+   r,   rv      s    rv   c                   @   s0   e Zd ZdeiZeZdd Zdd Zdd Z	dS )	AuthenticateWebAuthnViewrM   c                 O   s   t | jjj}t||S r/   )rw   rx   r;   r<   r'   r   ry   rz   r+   r+   r,   rK      s    zAuthenticateWebAuthnView.getc                 C   s   d| j jjiS r9   r:   r=   r+   r+   r,   r>      s    z)AuthenticateWebAuthnView.get_input_kwargsc                 O   s   | j   |  S r/   r0   r4   r+   r+   r,   r8      s    
zAuthenticateWebAuthnView.postN)
r?   r@   rA   r   rB   r!   rC   rK   r>   r8   r+   r+   r+   r,   r{      s    r{   c                   @   s$   e Zd ZdeiZdd Zdd ZdS )LoginWebAuthnViewrM   c                 O   s   t  }t||S r/   )rw   rx   r   ry   rz   r+   r+   r,   rK      s    zLoginWebAuthnView.getc                 O   s4   | j jd }d }t|j|d}t||| t|S )Nrn   )r'   redirect_url)r1   rp   r   r'   ri   Zperform_passwordless_loginr   )r5   r)   r6   r7   rR   r}   r<   r+   r+   r,   r8      s
    zLoginWebAuthnView.postN)r?   r@   rA   r   rB   rK   r8   r+   r+   r+   r,   r|      s
    r|   c                       sJ   e Zd ZeedZdZdd Zdd Zdd Z	 fd	d
Z
dd Z  ZS )SignupWebAuthnView)rM   r`   Tc                 O   s4   |   }|r|S tj|| jjjddd}t||S )NT)rh   Zsignup)_require_stageri   rj   r;   r<   r'   r   rk   )r5   r)   r6   r7   resprl   r+   r+   r,   rK      s       zSignupWebAuthnView.getc                 C   s"   t | dr| jS t| j| _| jS )Nr;   )hasattrr;   r   r)   r=   r+   r+   r,   _prep_stage   s    
zSignupWebAuthnView._prep_stagec                 C   s*   |    | jr| jjtjkr&t| jS d S r/   )r   r;   keyr$   r	   r)   r=   r+   r+   r,   r     s    
z!SignupWebAuthnView._require_stagec                    s6   t   }|   | jr2| jjdkr2| jjj|d< |S )Nr`   r'   )rd   r>   r   r;   r)   rc   r<   r'   )r5   retrf   r+   r,   r>     s
    
z#SignupWebAuthnView.get_input_kwargsc                 O   sJ   |   }|r|S tj|| jjj| jjd | jjd d | j  t	|S )Nrm   rn   )r'   rm   rn   )
r   ri   Zsignup_authenticatorr;   r<   r'   r1   rp   exitr   )r5   r)   r6   r7   r   r+   r+   r,   rt     s    


zSignupWebAuthnView.put)r?   r@   rA   r   r   rB   Z
by_passkeyrK   r   r   r>   rt   ru   r+   r+   rf   r,   r~      s   	r~   c                   @   s   e Zd ZeZeZdd ZdS )	TrustViewc                 O   s.   | j jd }|  }|r*t|| jjj| |S )Ntrust)r1   rp   r3   r   r;   r<   r'   )r5   r)   r6   r7   r   r   r+   r+   r,   r8      s
    zTrustView.postN)r?   r@   rA   r   rB   r"   rC   r8   r+   r+   r+   r,   r     s   r   N)Ghttpr   Zdjango.core.exceptionsr   Z!allauth.account.internal.stagekitr   Zallauth.account.modelsr   Zallauth.headless.account.viewsr   Zallauth.headless.base.responser   r   r	   Zallauth.headless.base.viewsr
   r   r   Z*allauth.headless.internal.restkit.responser   Zallauth.headless.mfar   Zallauth.headless.mfa.inputsr   r   r   r   r   r   r   r   r   r   r   r   Zallauth.mfa.adapterr   r   Zallauth.mfa.internal.flowsr   Z allauth.mfa.internal.flows.trustr   Zallauth.mfa.modelsr   Z#allauth.mfa.recovery_codes.internalr    r]   Zallauth.mfa.stagesr!   r"   Zallauth.mfa.totp.internalr#   rP   rY   Zallauth.mfa.webauthn.internalrw   ri   Zallauth.mfa.webauthn.stagesr$   r-   r.   rD   rF   rL   r\   r_   rv   r{   r|   r~   r   r+   r+   r+   r,   <module>   s<   8"21