o
    Lf                     @   s  d dl Z d dl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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( e)e*Z+G dd dZ,e	eddG dd de,eZ-e-. Z/G dd de,eZ0e0. Z1e	eddG dd de,eZ2e2. Z3G dd de,eZ4e4. Z5G dd de,eZ6e6. Z7dS )     N)HttpResponseHttpResponseRedirectJsonResponse)reverse)method_decorator)View)csrf_exempt)OneLogin_Saml2_AuthOneLogin_Saml2_Settings)OneLogin_Saml2_Error)get_adapter)get_next_redirect_url)complete_social_loginrender_authentication_error)SocialLogin)	AuthError)respond_to_login_on_get)LoginSession   )build_saml_configdecode_relay_stateencode_relay_stateget_app_or_404prepare_django_requestc                   @   s$   e Zd Zdd Zdd Zdd ZdS )SAMLViewMixinc                 C   s*   t | j}t| j|jj|}t||}|S N)r   requestr   appsettingsr	   )selfproviderorganization_slugreqconfigauth r%   k/var/www/html/humari/django-venv/lib/python3.10/site-packages/allauth/socialaccount/providers/saml/views.py
build_auth%   s   

zSAMLViewMixin.build_authc                 C   s   t | j|}|S r   )r   r   r   r!   r   r%   r%   r&   get_app-   s   zSAMLViewMixin.get_appc                 C   s   |  |}|| jS r   )r)   get_providerr   r(   r%   r%   r&   r*   1   s   
zSAMLViewMixin.get_providerN)__name__
__module____qualname__r'   r)   r*   r%   r%   r%   r&   r   $   s    r   dispatch)namec                   @      e Zd Zdd ZdS )ACSViewc              
   C   sR  |  |}| ||}d }g }z|  W n$ tjy$   dg}d}Y n ty9 } z
t|}W Y d }~nd }~ww |s@| }|r^| pG|}t	
dd||f  t||||ddS | sjt||tjdS t|jd}|||}	d	D ]}
||
}|r||	j|
< qzt|d
d}|	 |jd< tdd|id}t|}|| |S )Ninvalid_responsezInvalid responsez*Error processing SAML ACS response: %s: %s, )saml_errorssaml_last_error_reason)extra_context)error
RelayState)processnextsaml_acs_sessionsaml-acs-sessionloginsaml_finish_acsr!   )kwargs)r*   r'   process_responsebinasciiErrorr   str
get_errorsget_last_error_reasonloggerr7   joinr   is_authenticatedr   	CANCELLEDr   POSTgetsociallogin_from_responsestater   	serializestorer   r   save)r   r   r!   r    r$   error_reasonerrorserelay_stater=   keyvalueacs_sessionurlresponser%   r%   r&   r.   8   sb   



zACSView.dispatchNr+   r,   r-   r.   r%   r%   r%   r&   r1   6       r1   c                   @   r0   )FinishACSViewc                 C   sV   |  |}t|dd}|jd}|std t||S |  t	|}t
||S )Nr;   r<   r=   z0Unable to finish login, SAML ACS session missing)r*   r   rO   rK   rF   r7   r   deleter   deserializer   )r   r   r!   r    rW   serialized_loginr=   r%   r%   r&   r.   o   s   




zFinishACSView.dispatchNrZ   r%   r%   r%   r&   r\   n       r\   c                   @   r0   )SLSViewc              
      s   |  |}| ||}jj}t  fdd}d }d }z
|j|| d}W n ty> }	 z
t|	}W Y d }	~	nd }	~	ww | }
|
rb|	 pJ|}t
dd|
|f  t|dd}d|_|S |si }t|S )	Nc                      s      d S r   )logoutr%   account_adapterr   r%   r&   force_logout   s   z&SLSView.dispatch.<locals>.force_logout)delete_session_cbkeep_local_sessionz*Error processing SAML SLS response: %s: %sr3   z
text/plain)content_typei  )r*   r'   userrH   get_account_adapterprocess_slor   rC   rD   rE   rF   r7   rG   r   status_codeget_logout_redirect_urlr   )r   r   r!   r    r$   should_logoutre   redirect_torQ   rS   rR   respr%   rc   r&   r.      s:   


zSLSView.dispatchNrZ   r%   r%   r%   r&   ra   ~   r[   ra   c                   @   r0   )MetadataViewc           	      C   sh   |  |}t| j|jj|}t|dd}| }||}t|dkr.t	d|i}d|_
|S t|ddS )NT)r   sp_validation_onlyr   rR   i  ztext/xml)contentrh   )r*   r   r   r   r   r
   get_sp_metadatavalidate_metadatalenr   rl   r   )	r   r   r!   r    r#   saml_settingsmetadatarR   rp   r%   r%   r&   r.      s   

zMetadataView.dispatchNrZ   r%   r%   r%   r&   rq      r`   rq   c                   @   r0   )	LoginViewc           
      C   s^   |  |}t||}|r|S | ||}| jjd}t|}t||d}|j|d}	t	|	S )Nr9   )r9   next_url)	return_to)
r*   r   r'   r   GETrK   r   r   r=   r   )
r   r   r!   r    rp   r$   r9   rz   rT   redirectr%   r%   r&   r.      s   

zLoginView.dispatchNrZ   r%   r%   r%   r&   ry      r`   ry   )8rA   loggingdjango.httpr   r   r   django.urlsr   django.utils.decoratorsr   django.viewsr   django.views.decorators.csrfr   onelogin.saml2.authr	   r
   onelogin.saml2.errorsr   allauth.account.adapterr   rj   allauth.account.utilsr   allauth.socialaccount.helpersr   r   allauth.socialaccount.modelsr   .allauth.socialaccount.providers.base.constantsr   *allauth.socialaccount.providers.base.utilsr   allauth.socialaccount.sessionsr   utilsr   r   r   r   r   	getLoggerr+   rF   r   r1   as_viewacsr\   
finish_acsra   slsrq   rx   ry   r=   r%   r%   r%   r&   <module>   s>    
	
4
!