U
    >i                     @   s   d dl Z d dl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 d d	lmZ d d
lmZ dddddddZdd Zdd Zdd Zdd Zd!eeeeedddZeeeddd ZdS )"    N)	timedelta)cache)HttpRequest)timezone)get_adapter)jwtkit)SocialLoginSocialToken)Provider)GRAPH_API_URLidemailZ
first_name	last_namenamelink)subr   Z
given_nameZfamily_namer   Z	user_linkc                 C   s2   |j d}| jd}tj||tjd }|S )Nzutf-8)	digestmod)tokenencodesecrethmacnewhashlibsha256	hexdigest)appr   msgkeyappsecret_proof r   R/tmp/pip-unpacked-wheel-upujnpc2/allauth/socialaccount/providers/facebook/flows.pycompute_appsecret_proof   s    r!   c                 C   sT   t   jtd d| |jt|j|dd}|	  |
 }|| |}|S )Nz/me,)fieldsaccess_tokenr   params)r   get_requests_sessiongetr   joinZ
get_fieldsr   r!   r   raise_for_statusjsonsociallogin_from_response)requestproviderr   resp
extra_dataloginr   r   r    complete_login$   s    

r2   c                 C   s   | j }d|j d}t|}|s~t  jtd |j|jddd}|  |	 }|d }| 
 dd	}tj|||d
 |S )Nzallauth.facebook.app_token[]/oauth/access_tokenZclient_credentials)	client_idclient_secret
grant_typer%   r$   ZAPP_TOKEN_CACHE_TIMEOUTi,  )timeout)r   r5   r   r(   r   r'   r   r   r*   r+   get_settingsset)r.   r   	cache_key	app_tokenr/   datar8   r   r   r    get_app_token7   s$    

r>   c                 C   sv   t | }t  jtd ||dd}|  | d }|d sNt d|d | jj	ksf|d srt dd S )Nz/debug_token)input_tokenr$   r%   r=   Zis_validinvalid_tokenZapp_id)
r>   r   r'   r(   r   r*   r+   validation_errorr   r5   )r.   r?   r<   r/   r=   r   r   r    inspect_tokenP   s    
rB    )r.   r$   	auth_type
auth_noncereturnc                 C   s  |j }t|| d }|dkrnt  jtd |j|dd}|  | }|o\||dk}	|	snt 	d|
 drt  jtd d	|j|j|d
d}|  | }|d }|d}
|
rt tt|
d }t|||d}t| ||}||_|S )NZreauthenticatez/oauth/access_token_info)r5   r$   r%   rE   r@   ZEXCHANGE_TOKENr4   fb_exchange_token)r7   r5   r6   rG   r$   
expires_in)seconds)r   r   
expires_at)r   rB   r   r'   r(   r   r5   r*   r+   rA   r9   r   r   nowr   intr	   r2   r   )r-   r.   r$   rD   rE   r   rJ   r/   infookrH   r   r1   r   r   r    verify_tokenb   sH    



rO   )r-   id_tokenrF   c                    s@   t j||j|j|jjt jd  fddt D }|	| |S )aL  
    Verifies a Facebook Limited Login token.
    See https://developers.facebook.com/docs/facebook-login/limited-login/token/validating.

    We validate the JWT, then convert its data/claims into
    a fake Facebook Graph API response, which is then passed to
    `provider.sociallogin_from_response` to be handled as normal.
    )Z
credentialZkeys_urlZissuerZaudienceZ
lookup_kidc                    s"   i | ]\}}| kr| | qS r   r   ).0Z	jwt_fieldZgraph_fieldZjwt_datar   r    
<dictcomp>   s    z.verify_limited_login_token.<locals>.<dictcomp>)
r   Zverify_and_decodeZlimited_login_jwks_urlZ!limited_login_expected_jwt_issuerr   r5   Zlookup_kid_jwk JWT_FIELD_TO_GRAPH_API_FIELD_MAPitemsr,   )r-   r.   rP   Zfake_responser   rR   r    verify_limited_login_token   s    
rV   )rC   rC   )r   r   datetimer   Zdjango.core.cacher   Zdjango.httpr   Zdjango.utilsr   Zallauth.socialaccount.adapterr   Zallauth.socialaccount.internalr   Zallauth.socialaccount.modelsr   r	   Z$allauth.socialaccount.providers.baser
   Z2allauth.socialaccount.providers.facebook.constantsr   rT   r!   r2   r>   rB   strrO   rV   r   r   r   r    <module>   sD   
	  8 