U
    [e                      @   s$  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ ej	d  dkZ
e
rdd dlmZ e nd dlmZ d dlmZ ejd d 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mZmZmZ d dl m!Z! dd e_"G dd deZ#G dd deZ$G dd de%Z&dS )    N)timegm)oidutil   )
HTMLParser)	HTTPrettyz..)parse_qsmodule_member)load_backends)AuthTokenError)BaseBackendTest)TestStorageUserTestUserSocialAuth	TestNonceTestAssociation)TestStrategyc                  O   s   d S N )argskwargsr   r   _/var/www/html/services/stratfitenv/lib/python3.8/site-packages/social/tests/backends/open_id.py<lambda>"       r   c                   @   s   e Zd Zi Zi Zdd ZdS )FormHTMLParserc                 C   sD   t |}|dkr| j| n"|dkr@d|kr@|d | j|d < d S )Nforminputnamevalue)dictr   updateinputs)selftagattrsr   r   r   handle_starttag)   s
    zFormHTMLParser.handle_starttagN)__name__
__module____qualname__r   r    r$   r   r   r   r   r   %   s   r   c                   @   s`   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdd Zdd Zdd	 Zd
d Zdd Zdd ZdS )
OpenIdTestN z/complete/{0}/c                 C   sl   t   t| j}tt| _| j|j	| _
|| j| j
d| _| jd| jdfi t| jddd d S )N)Zredirect_uriZ#SOCIAL_AUTH_AUTHENTICATION_BACKENDSz3social.tests.backends.test_broken.BrokenBackendAuthT)Z
force_load)r   enabler   backend_pathr   r   strategyraw_complete_urlformatr   Zcomplete_urlbackendZset_settingsr	   Zget_setting)r!   Backendr   r   r   setUp<   s    


zOpenIdTest.setUpc                 C   s2   d | _ t  t  t  t  t  d S r   )r,   r   reset_cacher   r   r   r   disabler!   r   r   r   tearDownN   s    zOpenIdTest.tearDownc                 C   s   t  }|| |j|jfS r   )r   feedr   r    )r!   htmlparserr   r   r   get_form_dataV   s    
zOpenIdTest.get_form_datac                 C   s
   | j  S r   )r/   
openid_urlr4   r   r   r   r:   [   s    zOpenIdTest.openid_urlc                 C   s   d S r   r   r4   r   r   r   
post_start^   s    zOpenIdTest.post_startc                 C   s   t jt j|  d| jdd | j }|   | |\}}t jt j	|
dd| jd tj|
d|d}| jt|j| j t jt j	|
dddd | j S )N   zapplication/xrds+xml)statusbodycontent_typeaction)r=   r>   )datazis_valid:true
)r   Zregister_uriGETr:   Zdiscovery_bodyr/   startr;   r9   POSTgetZserver_responserequestspostr,   Zset_request_datar   contentZcomplete)r!   rC   r   r    responser   r   r   do_starta   s0    
zOpenIdTest.do_start)r%   r&   r'   r+   r/   access_token_bodyZuser_data_bodyZuser_data_urlZexpected_usernamesettingsZpartial_login_settingsr-   r1   r5   r9   r:   r;   rJ   r   r   r   r   r(   1   s   r(   c                       s   e Zd ZdZdZdZdZdZ fddZdd	 Z	dd
dZ
dddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )OpenIdConnectTestMixinzh
    Mixin to test OpenID Connect consumers. Inheriting classes should also
    inherit OAuth2Test.
    za-keyza-secret-keyNiX  c                    sT   t t|  }|d| j| jd| j| jd| j| jd| j| ji |S )NzSOCIAL_AUTH_{0}_KEYzSOCIAL_AUTH_{0}_SECRETz'SOCIAL_AUTH_{0}_ID_TOKEN_DECRYPTION_KEYz SOCIAL_AUTH_{0}_ID_TOKEN_MAX_AGE)	superrM   extra_settingsr   r.   r   
client_keyclient_secretid_token_max_age)r!   rL   	__class__r   r   rO      s    
 
 

z%OpenIdConnectTestMixin.extra_settingsc                 C   s&   t |jd}| j|d}d||fS )z~
        Get the nonce from the request parameters, add it to the id_token, and
        return the complete response.
        noncerU   r<   )r   r>   rE   prepare_access_token_body)r!   request_urlheadersrU   r>   r   r   r   rK      s    z(OpenIdConnectTestMixin.access_token_bodyc                 C   s   ||||||dd}|S )zK
        Return the id_token to be added to the access token body.
        1234)ZissrU   ZaudZazpexpZiatsubr   )r!   rP   expiration_datetimeissue_datetimerU   issuerid_tokenr   r   r   get_id_token   s    
z#OpenIdConnectTestMixin.get_id_tokenc           
      C   s   ddd}|p| j }|p| j}tj }|p:|tjdd }|pB|}|pJd}|pT| j}| |t| t| ||}	t	j
|	|ddd	|d
< t|S )a  
        Prepares a provider access token response. Arguments:

        client_id       -- (str) OAuth ID for the client that requested
                                 authentication.
        client_secret   -- (str) OAuth secret for the client that requested
                                 authentication.
        expiration_time -- (datetime) Date and time after which the response
                                      should be considered invalid.
        ZfoobarZbearer)Zaccess_token
token_type   secondsza-nonceZHS256)	algorithmzutf-8ra   )rP   rQ   datetimeutcnow	timedeltar`   rb   r   utctimetuplejwtencodedecodejsondumps)
r!   rP   rQ   r^   r_   rU   r`   r>   nowra   r   r   r   rW      s.    




 

  z0OpenIdConnectTestMixin.prepare_access_token_bodyc              	   K   s2   | j f || _| t| |   W 5 Q R X d S r   )rW   rK   ZassertRaisesRegexpr
   Zdo_login)r!   Zexpected_message_regexpZaccess_token_kwargsr   r   r   authtoken_raised   s
    z'OpenIdConnectTestMixin.authtoken_raisedc                 C   s   | j ddd d S )Nz*Token error: Signature verification failedzwrong!)rQ   rr   r4   r   r   r   test_invalid_secret   s    z*OpenIdConnectTestMixin.test_invalid_secretc                 C   s(   t j  t jdd }| jd|d d S )Nrd   re   z"Token error: Signature has expired)r^   )rh   ri   rj   rr   )r!   r^   r   r   r   test_expired_signature   s    
z-OpenIdConnectTestMixin.test_expired_signaturec                 C   s   | j ddd d S )NzToken error: Invalid issuersomeone-else)r`   rs   r4   r   r   r   test_invalid_issuer   s    z*OpenIdConnectTestMixin.test_invalid_issuerc                 C   s   | j ddd d S )NzToken error: Invalid audiencerv   )rP   rs   r4   r   r   r   test_invalid_audience   s    z,OpenIdConnectTestMixin.test_invalid_audiencec                 C   s.   t j  t j| jd d }| jd|d d S )N   re   z$Token error: Incorrect id_token: iat)r_   )rh   ri   rj   rR   rr   )r!   r_   r   r   r   test_invalid_issue_time   s    z.OpenIdConnectTestMixin.test_invalid_issue_timec                 C   s   | j ddd d S )Nz&Token error: Incorrect id_token: noncezsomething-wrongrV   rs   r4   r   r   r   test_invalid_nonce   s    z)OpenIdConnectTestMixin.test_invalid_nonce)NNNNN)NNNNNN)r%   r&   r'   __doc__rP   rQ   r`   rR   rO   rK   rb   rW   rr   rt   ru   rw   rx   rz   r{   __classcell__r   r   rS   r   rM   x   s2   	      
      
 rM   )'rh   ro   syscalendarr   rl   rF   Zopenidr   version_infoPY3html.parserr   Z	httprettyr   pathinsertZsocial.utilsr   r   Zsocial.backends.utilsr	   Zsocial.exceptionsr
   Zsocial.tests.backends.baser   Zsocial.tests.modelsr   r   r   r   r   Zsocial.tests.strategyr   logr   r(   objectrM   r   r   r   r   <module>   s.   
G