U
    yih6B                     @   sX  d 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 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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.Z.ddl/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: eeddeeddG dd deZ;eeddeeddG dd deZ<G dd  d eZ=ee
ddG d!d" d"eZ>ee
ddG d#d$ d$eZ?ee
ddG d%d& d&eZ@ee
ddG d'd( d(eZAe
ed)gd*d+ ZBe
ed)gd,d- ZCe
d.d/ ZDd0d1 ZEdS )2ad  
Enhanced Authentication Views for Stream Processor

This module provides views for enhanced authentication features including:
- Enhanced login with 2FA support
- 2FA setup and management
- Password change with strength validation
- Security settings management
- Session management

Author: Stream Processor Development Team
Version: 1.0.0
Created: 2025
    )renderredirectget_object_or_404)loginlogoutauthenticate)login_required)LoginRequiredMixin)User)messages)TemplateViewFormView)never_cache)csrf_protect)require_http_methods)method_decorator)reverse_lazyreverse)JsonResponseHttpResponseRedirect)ValidationError)gettext_lazy)timezone)settings)update_session_auth_hash)transactionN   )UserProfileLoginAttemptUserSession)EnhancedLoginFormTwoFactorFormEnhancedPasswordChangeFormSetup2FAFormDisable2FAFormSecuritySettingsFormBackupCodesFormdispatch)namec                       sT   e Zd ZdZdZeZedZ fddZ	 fddZ
 fdd	Z fd
dZ  ZS )EnhancedLoginViewz/
    Enhanced login view with 2FA support.
    zauthentication/login.htmlmonitoring:dashboardc                    s(   |j jrt|  S t j|f||S )N)useris_authenticatedr   get_success_urlsuperr'   selfrequestargskwargs	__class__ >/var/www/html/StreamProcessor/src/apps/authentication/views.pyr'   8   s    zEnhancedLoginView.dispatchc                    s   t   }| j|d< |S )Nr1   )r.   get_form_kwargsr1   r0   r3   r4   r6   r7   r8   >   s    

z!EnhancedLoginView.get_form_kwargsc                    s   |  }z>tjj|d}|jrD|j| jjd< |j| jjd< t	dW S W n$ tj
k
rj   tjj|d Y nX t| j| |jdr| jjtj n| jjd t| jtd| p|j t |S )Nr+   pre_2fa_user_idpre_2fa_backendzcore:two_factor_verifyZremember_mer   Welcome back, {}!)get_userr   objectsgetis_2fa_enabledidr1   sessionbackendr   DoesNotExistcreater   cleaned_dataZ
set_expiryr   SESSION_COOKIE_AGEr   success_formatget_full_nameusernamer.   
form_valid)r0   formr+   profiler4   r6   r7   rN   C   s    "zEnhancedLoginView.form_validc                    s   t | jtd t |S )Nz:Login failed. Please check your credentials and try again.r   errorr1   rJ   r.   form_invalidr0   rO   r4   r6   r7   rS   ^   s    zEnhancedLoginView.form_invalid)__name__
__module____qualname____doc__template_namer    
form_classr   success_urlr'   r8   rN   rS   __classcell__r6   r6   r4   r7   r)   -   s   r)   c                       s`   e Zd ZdZdZeZedZ fddZ	 fddZ
 fdd	Z fd
dZ fddZ  ZS )TwoFactorVerifyViewz*
    View for 2FA token verification.
    z%authentication/two_factor_verify.htmlr*   c                    s&   d|j krtdS t j|f||S Nr;   
core:loginrC   r   r.   r'   r/   r4   r6   r7   r'   n   s    
zTwoFactorVerifyView.dispatchc                    s,   t   }| jjd}tt|d|d< |S Nr;   rB   r+   r.   r8   r1   rC   r@   r   r
   r0   r3   user_idr4   r6   r7   r8   t   s    
z#TwoFactorVerifyView.get_form_kwargsc                    s4   t  jf |}| jjd}tt|d}||d< |S ra   )r.   get_context_datar1   rC   r@   r   r
   )r0   r3   contextre   r+   r4   r6   r7   rf   z   s
    z$TwoFactorVerifyView.get_context_datac                    s|   | j jd}| j jd}tt|d}||_t| j | | j jd= | j jd= t| j t	d
| pj|j t |S )Nr;   r<   rb   r=   )r1   rC   r@   r   r
   rD   r   r   rI   rJ   rK   rL   rM   r.   rN   )r0   rO   re   rD   r+   r4   r6   r7   rN      s    

"zTwoFactorVerifyView.form_validc                    s   t | jtd t |S )Nz,Invalid verification code. Please try again.rQ   rT   r4   r6   r7   rS      s    z TwoFactorVerifyView.form_invalid)rU   rV   rW   rX   rY   r!   rZ   r   r[   r'   r8   rf   rN   rS   r\   r6   r6   r4   r7   r]   c   s   r]   c                       sH   e Zd ZdZdZeZedZ fddZ	 fddZ
 fdd	Z  ZS )
BackupCodeVerifyViewz,
    View for backup code verification.
    z&authentication/backup_code_verify.htmlr*   c                    s&   d|j krtdS t j|f||S r^   r`   r/   r4   r6   r7   r'      s    
zBackupCodeVerifyView.dispatchc                    s,   t   }| jjd}tt|d|d< |S ra   rc   rd   r4   r6   r7   r8      s    
z$BackupCodeVerifyView.get_form_kwargsc                    s   | j jd}| j jd}tt|d}tjj|d}|jd }|j	| |j
dgd ||_t| j | | j jd= | j jd= t| j tdt|j t |S )	Nr;   r<   rb   r:   backup_codebackup_codesupdate_fieldsz1Welcome back! You have {} backup codes remaining.)r1   rC   r@   r   r
   r   r?   rG   rj   removesaverD   r   r   rI   rJ   rK   lenr.   rN   )r0   rO   re   rD   r+   rP   ri   r4   r6   r7   rN      s    


zBackupCodeVerifyView.form_valid)rU   rV   rW   rX   rY   r&   rZ   r   r[   r'   r8   rN   r\   r6   r6   r4   r7   rh      s   rh   c                       s,   e Zd ZdZdZ fddZdd Z  ZS )Setup2FAViewz"
    View for setting up 2FA.
    zauthentication/setup_2fa.htmlc                    sP   t  jf |}tjj| jjd\}}| \}}|||t	| jjdd |S )Nr:   )secretqr_code_urlrO   )
r.   rf   r   r?   get_or_creater1   r+   	setup_2faupdater#   )r0   r3   rg   rP   createdrq   rr   r4   r6   r7   rf      s    zSetup2FAView.get_context_datac                 O   st   t |j|jd}| rRtjj|jd}| }||jd< t	
|td tdS | jf |}||d< t|| j|S )Nr+   datar:   new_backup_codesz8Two-factor authentication has been enabled successfully!core:show_backup_codesrO   )r#   r+   POSTis_validr   r?   r@   Z
enable_2farC   r   rI   rJ   r   rf   r   rY   )r0   r1   r2   r3   rO   rP   rj   rg   r6   r6   r7   post   s    
zSetup2FAView.postrU   rV   rW   rX   rY   rf   r}   r\   r6   r6   r4   r7   rp      s   rp   c                       s,   e Zd ZdZdZ fddZdd Z  ZS )ShowBackupCodesViewz;
    View for displaying backup codes after 2FA setup.
    z%authentication/show_backup_codes.htmlc                    s*   t  jf |}| jjdg }||d< |S )Nry   rj   )r.   rf   r1   rC   r@   )r0   r3   rg   rj   r4   r6   r7   rf      s    z$ShowBackupCodesView.get_context_datac                 O   s*   d|j kr|j d= t|td tdS )Nry   z,Two-factor authentication setup is complete!core:security_settings)rC   r   rI   rJ   r   r/   r6   r6   r7   r}     s    
zShowBackupCodesView.postr~   r6   r6   r4   r7   r      s   	r   c                       s<   e Zd ZdZdZeZedZ fddZ	 fddZ
  ZS )Disable2FAViewz!
    View for disabling 2FA.
    zauthentication/disable_2fa.htmlr   c                    s   t   }| jj|d< |S )Nr+   )r.   r8   r1   r+   r9   r4   r6   r7   r8     s    
zDisable2FAView.get_form_kwargsc                    sf   z0t jj| jjd}|  t| jtd W n( t j	k
rX   t
| jtd Y nX t |S )Nr:   z,Two-factor authentication has been disabled.$2FA is not enabled for your account.)r   r?   r@   r1   r+   disable_2far   rI   rJ   rE   rR   r.   rN   )r0   rO   rP   r4   r6   r7   rN     s    zDisable2FAView.form_valid)rU   rV   rW   rX   rY   r$   rZ   r   r[   r8   rN   r\   r6   r6   r4   r7   r     s   r   c                       s,   e Zd ZdZdZ fddZdd Z  ZS )SecuritySettingsViewz.
    View for managing security settings.
    z%authentication/security_settings.htmlc              	      s   t  jf |}tjj| jjd\}}tjj| jjj	d
dd d }tjj| jjdd
d}||t|dt| jjd||| jjjd	 |S )
Nr:   )rM   z-created_at
   Tr+   	is_activez-last_activity)instance)rP   Zsecurity_formZpassword_formrecent_attemptsactive_sessionscurrent_session_key)r.   rf   r   r?   rs   r1   r+   r   filterrM   order_byr   ru   r%   r"   rC   session_key)r0   r3   rg   rP   rv   r   r   r4   r6   r7   rf   0  s0    	z%SecuritySettingsView.get_context_datac                 O   s   t jj|jd}d|jkr\t|j|d}| rJ|  t	|t
d qt|t
d nvd|jkrt|j|jd}| r| }t |_d|_|jd	d
gd t|| t	|t
d nt|t
d tdS )Nr:   Zupdate_security)rx   r   z'Security settings updated successfully.z Please correct the errors below.Zchange_passwordrw   Flast_password_changepassword_reset_requiredrk   zPassword changed successfully.z)Please correct the password errors below.r   )r   r?   r@   r+   r{   r%   r|   rn   r   rI   rJ   rR   r"   r   nowr   r   r   r   )r0   r1   r2   r3   rP   rO   r+   r6   r6   r7   r}   L  s$    



zSecuritySettingsView.postr~   r6   r6   r4   r7   r   (  s   r   r{   c                 C   s   | j d}|s tddiddS ztjj| j|dd}|| jjkrTtddiddW S d	|_|	  d
dl
m} z|jj|d  W n |jk
r   Y nX tddiW S  tjk
r   tddidd Y S X dS )z,
    Terminate a specific user session.
    r   rR   zSession key requiredi  )statusT)r+   r   r   z Cannot terminate current sessionFr   Sessionr   rI   zSession not foundi  N)r{   r@   r   r   r?   r+   rC   r   r   rn   django.contrib.sessions.modelsr   deleterE   )r1   r   user_sessionr   r6   r6   r7   terminate_sessionj  s*    r   c                 C   s   | j j}tjj| jddj|d}t|jddd}|j	dd dd	l
m} |jj|d
  t|}t| td| td|dS )z?
    Terminate all other user sessions except current one.
    Tr   r   r   )flatF)r   r   r   )Zsession_key__inzTerminated {} other session(s).)rI   Zterminated_count)rC   r   r   r?   r   r+   excludelistvalues_listru   r   r   r   ro   r   rI   rJ   rK   r   )r1   r   Zother_sessionsZsession_keysr   countr6   r6   r7   terminate_all_sessions  s    r   c                    s   | j dkrztjj| jd}|js<t| td t	dW S ddl
  fddtd	D }||_|jd
gd || jd< t| td t	dW S  tjk
r   t| td Y nX t	dS )z&
    Regenerate 2FA backup codes.
    r{   r:   r   r   r   Nc                    s   g | ]}  d  qS )   )	token_hexupper).0rJ   secretsr6   r7   
<listcomp>  s     z+regenerate_backup_codes.<locals>.<listcomp>r   rj   rk   ry   z%New backup codes have been generated.rz   zSecurity profile not found.)methodr   r?   r@   r+   rA   r   rR   rJ   r   r   rangerj   rn   rC   rI   rE   )r1   rP   rj   r6   r   r7   regenerate_backup_codes  s     



r   c                 C   sh   | j jrHz(tjj| j | jjd}d|_|  W n tj	k
rF   Y nX t
|  t| td tdS )z4
    Enhanced logout view with session cleanup.
    )r+   r   Fz&You have been logged out successfully.r_   )r+   r,   r   r?   r@   rC   r   r   rn   rE   r   r   rI   rJ   r   )r1   r   r6   r6   r7   enhanced_logout  s    r   )FrX   django.shortcutsr   r   r   django.contrib.authr   r   r   django.contrib.auth.decoratorsr   Zdjango.contrib.auth.mixinsr	   django.contrib.auth.modelsr
   django.contribr   Zdjango.views.genericr   r   django.views.decorators.cacher   django.views.decorators.csrfr   Zdjango.views.decorators.httpr   django.utils.decoratorsr   django.urlsr   r   django.httpr   r   django.core.exceptionsr   django.utils.translationr   rJ   django.utilsr   django.confr   r   	django.dbr   jsonauthenticationr   r   r   formsr    r!   r"   r#   r$   r%   r&   r)   r]   rh   rp   r   r   r   r   r   r   r   r6   r6   r6   r7   <module>   s\   $

4

3.
,


A&
