U
    [e                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 zd dlmZ W n ek
rp   Y nX d dlmZ d dlmZ d dlmZmZmZmZ eeed	Zeejdd
 dkdedejkdG dd deZdS )    N)path)patch)	HTTPretty)OneLogin_Saml2_Utils)BaseBackendTest)AuthMissingParameter)urlparse
urlunparse	urlencodeparse_qsdata   )r      z<python-saml currently depends on 2.7; 3+ support coming soonZ__pypy__z"dm.xmlsec not compatible with pypyc                       s\   e Zd ZdZdZdd Z fddZdd Zd	d
 Zdd Z	dd Z
dd Zdd Z  ZS )SAMLTestzsocial.backends.saml.SAMLAuthZmyselfc              	   C   s4   t td}t|d}| }W 5 Q R X t|S )Nzsaml_config.jsonr)r   joinDATA_DIRopenreadjsonloads)selfnameconfig_fileZ
config_str r   a/var/www/html/services/stratfitenv/lib/python3.8/site-packages/social/tests/backends/test_saml.pyextra_settings!   s    zSAMLTest.extra_settingsc                    s@   t t|   tdd }ttd|}|  | |j	 dS )zJPatch the time so that we can replay canned
        request/response pairsc                   S   s
   t dS )Nz2015-05-09T03:57:22Z)r   Zparse_SAML_to_timer   r   r   r   
fixed_time,   s    z"SAMLTest.setUp.<locals>.fixed_timenowN)
superr   setUpstaticmethodr   objectr   startZ
addCleanupstop)r   r   Z	now_patch	__class__r   r   r    '   s    
zSAMLTest.setUpc              	   C   sV   t td}t|d}| }W 5 Q R X tjtj|d|d tjtj|ddd d S )Nzsaml_response.txtr   i-  )statuslocation   foobar)r'   body)r   r   r   r   r   r   Zregister_uriGET)r   	start_url
return_urlr   Zresponse_fileZresponse_urlr   r   r   install_http_intercepts5   s    z SAMLTest.install_http_interceptsc                 C   s   | j  j}| |}| j j}| || t|}| |j	| | 
|jd tdd tt|jj D }| d|d  | j|| j  | j  S )Nr*   c                 s   s   | ]\}}||d  fV  qdS r   Nr   .0kvr   r   r   	<genexpr>O   s     z$SAMLTest.do_start.<locals>.<genexpr> ZSAMLResponse)backendr#   urlmodify_start_urlZredirect_urir/   requestsget
assertTrue
startswithassertEqualtextdictr   r   queryitemsZassertNotInstrategyset_request_dataZcomplete)r   r-   r.   responseZquery_valuesr   r   r   do_startC   s    

zSAMLTest.do_startc                 C   s2   | j  \}}| t|d | |d d dS )z4Test that we can generate the metadata without errorr   <N)r7   Zgenerate_metadata_xmlr>   len)r   xmlerrorsr   r   r   test_metadata_generationU   s    z!SAMLTest.test_metadata_generationc                 C   s    | j ddi| j |   dS )z8Test that we can authenticate with a SAML IdP (TestShib)ZidpZtestshibN)rC   rD   r7   Zdo_loginr   r   r   r   
test_login[   s    zSAMLTest.test_loginc              	   C   s"   |  t |   W 5 Q R X dS )zALogging in without an idp param should raise AuthMissingParameterN)assertRaisesr   rF   rL   r   r   r   test_login_no_idpa   s    zSAMLTest.test_login_no_idpc                 C   sz   t |}tdd t|j D }t|d }tdd|\}}| 	|d t
||d< t|}t||d< t|S )z
        Given a SAML redirect URL, parse it and change the ID to
        a consistent value, so the request is always identical.
        c                 s   s   | ]\}}||d  fV  qdS r0   r   r1   r   r   r   r5   m   s     z,SAMLTest.modify_start_url.<locals>.<genexpr>ZSAMLRequestz
ID="[^"]+"zID="TEST_ID"      )r   r@   r   rA   	iteritemsr   Zdecode_base64_and_inflateresubnr>   Zdeflate_and_base64_encodelistr
   r	   )r   r-   Z	url_partsrA   rI   changedr   r   r   r9   f   s    zSAMLTest.modify_start_url)__name__
__module____qualname__backend_pathZexpected_usernamer   r    r/   rF   rK   rM   rO   r9   __classcell__r   r   r%   r   r      s   r   ) rS   r   sysZ	unittest2r:   osr   Zmockr   Z	httprettyr   Zonelogin.saml2.utilsr   ImportErrorZsocial.tests.backends.baser   Zsocial.exceptionsr   Z	social.p3r   r	   r
   r   r   dirname__file__r   Z
skipUnlessversion_infoZskipIfbuiltin_module_namesr   r   r   r   r   <module>   s.   