o
    Lf,                     @   s@  d dl 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
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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'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 G dd deZ3e34 Z5eeddG dd de Z6e64 Z7eeddG dd deZ8e84 Z9eeddG dd  d eZ:e:4 Z;eeddG d!d" d"eZ<e<4 Z=eeddG d#d$ d$eZ>e>4 Z?eeddG d%d& d&eZ@e@4 ZAeeddG d'd( d(eZBeB4 ZCdS ))    N)forms)messages)login_required)Http404HttpResponseRedirect)get_object_or_404)reversereverse_lazy)method_decorator)TemplateView)FormView)app_settings)get_adapter)reauthentication_required)LoginStageController)BaseReauthenticateView)r   signalstotp)ActivateTOTPFormAuthenticateFormDeactivateTOTPForm)Authenticator)RecoveryCodes)AuthenticateStage)is_mfa_enabled)get_form_classc                       sF   e Zd ZeZdej Z fddZ fddZ	dd Z
dd	 Z  ZS )
AuthenticateViewzmfa/authenticate.c                    sR   t |tj| _| jrt| jjjtj	j
gsttdS t j|g|R i |S )Naccount_login)r   enterr   keystager   loginuserr   TypeTOTPr   r   superdispatchselfrequestargskwargs	__class__ R/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/mfa/views.pyr&   $   s   zAuthenticateView.dispatchc                    s   t   }| jjj|d< |S Nr"   )r%   get_form_kwargsr    r!   r"   r(   retr,   r.   r/   r1   ,   s   
z AuthenticateView.get_form_kwargsc                 C      t tjd| jS )Nauthenticater   r   FORMS
form_classr(   r.   r.   r/   r   1      zAuthenticateView.get_form_classc                 C   s   |   | j S )N)saver    exit)r(   formr.   r.   r/   
form_valid4   s   
zAuthenticateView.form_valid)__name__
__module____qualname__r   r8   account_settingsTEMPLATE_EXTENSIONtemplate_namer&   r1   r   r>   __classcell__r.   r.   r,   r/   r       s    
r   r&   )namec                       s2   e Zd ZeZdej Z fddZdd Z	  Z
S )ReauthenticateViewzmfa/reauthenticate.c                       t   }| jj|d< |S r0   r%   r1   r)   r"   r2   r,   r.   r/   r1   A      
z"ReauthenticateView.get_form_kwargsc                 C   r4   )Nreauthenticater6   r9   r.   r.   r/   r   F   r:   z!ReauthenticateView.get_form_class)r?   r@   rA   r   r8   rB   rC   rD   r1   r   rE   r.   r.   r,   r/   rG   <   s
    
rG   c                       &   e Zd Zdej Z fddZ  ZS )	IndexViewz
mfa/index.c                    sT   t  jdi |}dd tjj| jjdD }||d< tj|d< t	| jj|d< |S )Nc                 S   s   i | ]}|j | qS r.   )typewrap).0authr.   r.   r/   
<dictcomp>S   s    
z.IndexView.get_context_data.<locals>.<dictcomp>)r"   authenticatorsMFA_SUPPORTED_TYPESr   r.   )
r%   get_context_datar   objectsfilterr)   r"   r   SUPPORTED_TYPESr   )r(   r+   r3   rS   r,   r.   r/   rU   Q   s   
zIndexView.get_context_datar?   r@   rA   rB   rC   rD   rU   rE   r.   r.   r,   r/   rM   M       
rM   c                       s^   e Zd ZeZdej Z fddZ fddZ	 fddZ
dd	 Zd
d Z fddZ  ZS )ActivateTOTPViewzmfa/totp/activate_form.c                    s8   t |jtjjgrttdS t j|g|R i |S )Nmfa_deactivate_totp)	r   r"   r   r#   r$   r   r   r%   r&   r'   r,   r.   r/   r&   e   s   zActivateTOTPView.dispatchc                    sz   t  jdi |}t }t|| jj| |d j	}t
|}t|dd}d| }||||d |S )Nr=   utf8zutf-8zdata:image/svg+xml;base64,)totp_svgtotp_svg_data_uritotp_urlr.   )r%   rU   r   r   build_totp_urlget_totp_labelr)   r"   get_totp_issuersecretbuild_totp_svgbase64	b64encodeencodedecodeupdate)r(   r+   r3   adapterr`   r^   base64_datatotp_data_urir,   r.   r/   rU   j   s"   

z!ActivateTOTPView.get_context_datac                    rH   r0   rI   r2   r,   r.   r/   r1   ~   rJ   z ActivateTOTPView.get_form_kwargsc                 C   r4   )Nactivate_totpr6   r9   r.   r.   r/   r      r:   zActivateTOTPView.get_form_classc                 C   s   t jjtjv rtdS tdS )Nmfa_view_recovery_codes	mfa_index)r   r#   RECOVERY_CODESr   rX   r   r9   r.   r.   r/   get_success_url   s   z ActivateTOTPView.get_success_urlc                    s   t j| jj|j}tjjt	j
v rt| jj}nd }||fD ]}|r/tjjt| jj|jd qt| j}|| jtjd |d| jj t |S )Nsenderr"   authenticatorzmfa/messages/totp_activated.txtzmfa/email/totp_activated)r   r$   activater)   r"   rd   r   r#   rq   r   rX   r   r   authenticator_addedsendinstanceget_account_adapteradd_messager   SUCCESSsend_notification_mailr%   r>   )r(   r=   	totp_authrc_authrQ   rk   r,   r.   r/   r>      s$   

zActivateTOTPView.form_valid)r?   r@   rA   r   r8   rB   rC   rD   r&   rU   r1   r   rr   r>   rE   r.   r.   r,   r/   r[   `   s    
r[   c                       sb   e Zd ZeZdej ZedZ	dd Z
ee fddZ fddZd	d
 Z fddZ  ZS )DeactivateTOTPViewzmfa/totp/deactivate_form.rp   c                 O   sN   t t| jjtjjd| _t|jtjjgstt	dS | j
|g|R i |S )Nr"   rN   mfa_activate_totp)r   r   r)   r"   r#   r$   ru   r   r   r   	_dispatchr'   r.   r.   r/   r&      s   zDeactivateTOTPView.dispatchc                    s   t  j|g|R i |S )zThere's no point to reauthenticate when MFA is not enabled, so the
        `is_mfa_enabled` chheck needs to go first, which is why we cannot slap a
        `reauthentication_required` decorator on the `dispatch` directly.
        )r%   r&   r'   r,   r.   r/   r      s   zDeactivateTOTPView._dispatchc                    s$   t   }| j|d< |di  |S )Nru   data)r%   r1   ru   
setdefaultr2   r,   r.   r/   r1      s   

z"DeactivateTOTPView.get_form_kwargsc                 C   r4   )Ndeactivate_totpr6   r9   r.   r.   r/   r      r:   z!DeactivateTOTPView.get_form_classc                    s   | j    tj| j j}| j |fD ]}|r#tjj	t| j
j|d qt| j
}|| j
tjd |d| j
j t |S )Nrs   z!mfa/messages/totp_deactivated.txtzmfa/email/totp_deactivated)ru   rO   
deactivater   rV   delete_dangling_recovery_codesr"   r   authenticator_removedrx   r)   rz   r{   r   r|   r}   r%   r>   )r(   r=   r   rQ   rk   r,   r.   r/   r>      s$   

zDeactivateTOTPView.form_valid)r?   r@   rA   r   r8   rB   rC   rD   r	   success_urlr&   r
   r   r   r1   r   r>   rE   r.   r.   r,   r/   r      s    


r   c                       s@   e Zd ZejZdej Ze	dZ
 fddZ fddZ  ZS )GenerateRecoveryCodesViewzmfa/recovery_codes/generate.ro   c                    sz   t jj| jjt jjd  t	| jj}t
| j}|| jtjd tjjt | jj|jd |d| jj t |S )Nr   z)mfa/messages/recovery_codes_generated.txtrs   z"mfa/email/recovery_codes_generated)r   rV   rW   r)   r"   r#   rq   deleter   rv   rz   r{   r   r|   r   authenticator_resetrx   ry   r}   r%   r>   )r(   r=   r   rk   r,   r.   r/   r>      s    

z$GenerateRecoveryCodesView.form_validc                    sR   t  jdi |}g }tjj| jjtjjd	 }|r!|
  }t||d< |S )Nr   unused_code_countr.   )r%   rU   r   rV   rW   r)   r"   r#   rq   firstrO   get_unused_codeslen)r(   r+   r3   unused_codesru   r,   r.   r/   rU      s   z*GenerateRecoveryCodesView.get_context_data)r?   r@   rA   r   Formr8   rB   rC   rD   r	   r   r>   rU   rE   r.   r.   r,   r/   r      s    
r   c                       s<   e Zd ZdZdZ fddZ fddZ fddZ  ZS )	DownloadRecoveryCodesViewzmfa/recovery_codes/download.txtz
text/plainc                    sN   t t| jjtjjd| _| j  | _	| j	st
 S t j|g|R i |S )Nr   )r   r   r)   r"   r#   rq   ru   rO   r   r   r   r%   r&   r'   r,   r.   r/   r&   
  s   z"DownloadRecoveryCodesView.dispatchc                    s    t  jdi |}| j|d< |S )Nr   r.   )r%   rU   r   )r(   r+   r3   r,   r.   r/   rU     s   
z*DownloadRecoveryCodesView.get_context_datac                    s    t  j|fi |}d|d< |S )Nz)attachment; filename="recovery-codes.txt"zContent-Disposition)r%   render_to_response)r(   contextresponse_kwargsresponser,   r.   r/   r     s   z,DownloadRecoveryCodesView.render_to_response)	r?   r@   rA   rD   content_typer&   rU   r   rE   r.   r.   r,   r/   r     s    r   c                       rL   )ViewRecoveryCodesViewzmfa/recovery_codes/index.c                    sF   t  jdi |}tt| jjtjjd}||	 
 tjd |S )Nr   )r   total_countr.   )r%   rU   r   r   r)   r"   r#   rq   rj   rO   r   r   RECOVERY_CODE_COUNT)r(   r+   r3   ru   r,   r.   r/   rU   '  s   
z&ViewRecoveryCodesView.get_context_datarY   r.   r.   r,   r/   r   #  rZ   r   )Drf   djangor   django.contribr   django.contrib.auth.decoratorsr   django.httpr   r   django.shortcutsr   django.urlsr   r	   django.utils.decoratorsr
   django.views.genericr   django.views.generic.editr   allauth.accountr   rB   allauth.account.adapterr   rz   allauth.account.decoratorsr   allauth.account.stagesr   allauth.account.viewsr   allauth.mfar   r   allauth.mfa.adapterallauth.mfa.formsr   r   r   allauth.mfa.modelsr   allauth.mfa.recovery_codesr   allauth.mfa.stagesr   allauth.mfa.utilsr   allauth.utilsr   r   as_viewr5   rG   rK   rM   indexr[   rn   r   r   r   generate_recovery_codesr   download_recovery_codesr   view_recovery_codesr.   r.   r.   r/   <module>   s\    


?
8
"

