o
    &zh                     @   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&dededededef
d d!Zd"ed#edefd$d%ZdS )'    N)	timedelta)cache)HttpRequest)timezone)get_adapter)jwtkit)SocialLoginSocialToken)Provider)GRAPH_API_URLidemail
first_name	last_namenamelink)subr   
given_namefamily_namer   	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#   i/var/www/html/kangema/venv/lib/python3.10/site-packages/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   join
get_fieldsr   r%   r   raise_for_statusjsonsociallogin_from_response)requestproviderr   resp
extra_dataloginr#   r#   r$   complete_login$   s   
r7   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_tokenclient_credentials)	client_idclient_secret
grant_typer)   r(   APP_TOKEN_CACHE_TIMEOUTi,  )timeout)r   r;   r   r,   r   r+   r   r   r/   r0   get_settingsset)r3   r   	cache_key	app_tokenr4   datar?   r#   r#   r$   get_app_token7   s(   
rE   c                 C   sv   t | }t  jtd ||dd}|  | d }|d s't d|d | jj	ks3|d s9t dd S )Nz/debug_token)input_tokenr(   r)   rD   is_validinvalid_tokenapp_id)
rE   r   r+   r,   r   r/   r0   validation_errorr   r;   )r3   rF   rC   r4   rD   r#   r#   r$   inspect_tokenP   s   rK    r3   r(   	auth_type
auth_noncereturnc                 C   s  |j }t|| d }|dkr7t  jtd |j|dd}|  | }|o.||dk}	|	s7t 	d|
 drot  jtd d	|j|j|d
d}|  | }|d }|d}
|
rot tt|
d }t|||d}t| ||}||_|S )Nreauthenticatez/oauth/access_token_info)r;   r(   r)   rN   rH   EXCHANGE_TOKENr9   fb_exchange_token)r=   r;   r<   rR   r(   
expires_in)seconds)r   r   
expires_at)r   rK   r   r+   r,   r   r;   r/   r0   rJ   r@   r   r   nowr   intr	   r7   r   )r2   r3   r(   rM   rN   r   rU   r4   infookrS   r   r6   r#   r#   r$   verify_tokenb   sP   

rZ   r2   id_tokenc                    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.
    )
credentialkeys_urlissueraudience
lookup_kidc                    s"   i | ]\}}| v r| | qS r#   r#   ).0	jwt_fieldgraph_fieldjwt_datar#   r$   
<dictcomp>   s
    z.verify_limited_login_token.<locals>.<dictcomp>)
r   verify_and_decodelimited_login_jwks_url!limited_login_expected_jwt_issuerr   r;   lookup_kid_jwk JWT_FIELD_TO_GRAPH_API_FIELD_MAPitemsr1   )r2   r3   r[   fake_responser#   rd   r$   verify_limited_login_token   s   
rn   )rL   rL   )r   r   datetimer   django.core.cacher   django.httpr   django.utilsr   allauth.socialaccount.adapterr   allauth.socialaccount.internalr   allauth.socialaccount.modelsr   r	   $allauth.socialaccount.providers.baser
   2allauth.socialaccount.providers.facebook.constantsr   rk   r%   r7   rE   rK   strrZ   rn   r#   r#   r#   r$   <module>   sT    
	
7