o
    "4g!                     @   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 d d	lmZ d d
lmZ d dlmZ d dlmZmZmZ d dlmZmZ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) G dd deZ*G dd de%Z+e+gZ,dS )    N)quote)REDIRECT_FIELD_NAME)	get_token)render_to_string)reverse)get_random_string)escapejs)EmailAddress)get_adapter)QUERY_EMAIL)
AuthActionAuthProcessProviderAccount)GRAPH_API_URLGRAPH_API_VERSIONNONCE_LENGTHNONCE_SESSION_KEYPROVIDER_ID)FacebookOAuth2Adapter)OAuth2Error)OAuth2Provider)import_callable   )get_default_locale_callablec                   @   s   e Zd Zdd Zdd ZdS )FacebookAccountc                 C   s   | j jdS )Nlink)account
extra_datagetself r!   z/var/www/html/authentication-server/venv/lib/python3.10/site-packages/allauth/socialaccount/providers/facebook/provider.pyget_profile_url&      zFacebookAccount.get_profile_urlc                 C   s   | j j}td|  S )NzC/%s/picture?type=square&height=600&width=600&return_ssl_resources=1)r   uidr   )r    r%   r!   r!   r"   get_avatar_url)   s   zFacebookAccount.get_avatar_urlN)__name__
__module____qualname__r#   r&   r!   r!   r!   r"   r   %   s    r   c                       s   e Zd ZeZdZeZeZ	dZ
dZdZ fddZdd Z fd	d
Zdd Zdd Zdd Zdd Z fddZdd Zdd Zdd Zdd Zd)ddZd d! Zd"d# Zd$d% Zd&efd'd(Z  ZS )*FacebookProviderFacebookTzhttps://www.facebook.comz;https://limited.facebook.com/.well-known/oauth/openid/jwks/c                    s   d | _ t j|i | d S N)_locale_callable_cachesuper__init__)r    argskwargs	__class__r!   r"   r/   B   s   zFacebookProvider.__init__c                 C   s   |   ddS )NMETHODoauth2get_settingsr   r   r!   r!   r"   
get_methodF   s   zFacebookProvider.get_methodc           
         s   | d|  }|dkrJdt|tpd }dt|dp tj }dt|dp,tj }dt|dd }d||||f }d	t	|f }	|	S |d
kr\t
t| j|fi |}	|	S td| )Nmethodjs_sdkz'%s' processactionscopez&allauth.facebook.login(%s, %s, %s, %s)zjavascript:%sr5   zInvalid method specified: %s)popr8   r   r   r   r   LOGINr   AUTHENTICATEr   r.   r*   get_login_urlRuntimeError)
r    requestr1   r9   nextr<   r=   r>   jsretr2   r!   r"   rB   I   s$   zFacebookProvider.get_login_urlc                 C   s$   |   }|d}|rt|S t S )NLOCALE_FUNC)r7   r   r   r   )r    settingsfuncr!   r!   r"   _get_locale_callable]   s   
z%FacebookProvider._get_locale_callablec                 C   s   | j s|  | _ |  |S r,   )r-   rK   )r    rD   r!   r!   r"   get_locale_for_requestb   s   

z'FacebookProvider.get_locale_for_requestc                 C   s   g }t r	|d |S )Nemail)r   append)r    r>   r!   r!   r"   get_default_scopeg   s   
z"FacebookProvider.get_default_scopec                 C   s   |   }g d}|d|S )N)idrM   name
first_name	last_nameverifiedlocaletimezoner   genderupdated_timeFIELDSr6   )r    rI   default_fieldsr!   r!   r"   
get_fieldsm   s   zFacebookProvider.get_fieldsc                    s:   t  ||}|tjkrd|d< |S |tjkrd|d< |S )Nreauthenticate	auth_type	rerequest)r.   get_auth_params_from_requestr   REAUTHENTICATE	REREQUEST)r    rD   r=   rG   r2   r!   r"   r_   ~   s   

z-FacebookProvider.get_auth_params_from_requestc                 C   s*   |j td}|  }||di  |S )N)appIdversionINIT_PARAMS)	client_idr   r7   updater   )r    rD   appinit_paramsrI   r!   r!   r"   get_init_params   s   z FacebookProvider.get_init_paramsc                 C   sD   |  |d}d| ||d< |ddkr | j|dd|d< |S )	Nauthenticate,r>   r]   r\   T)	or_create
auth_nonce)r_   joinget_scope_from_requestr   	get_nonce)r    rD   rG   r!   r!   r"   get_fb_login_options   s
   z%FacebookProvider.get_fb_login_optionsc                 C   sN   |   }|dd}dd t |D }d|v r%| |}|j|d}|S )NSDK_URLz&//connect.facebook.net/{locale}/sdk.jsc                 S   s    g | ]}|d  dur|d  qS )r   Nr!   ).0tupr!   r!   r"   
<listcomp>   s    z0FacebookProvider.get_sdk_url.<locals>.<listcomp>rU   )rU   )r7   r   string	FormatterparserL   format)r    rD   rI   sdk_urlfield_namesrU   r!   r!   r"   get_sdk_url   s   
zFacebookProvider.get_sdk_urlc                    s   |   dkrdS  fdd}| jjt|  |  | j|  |d|d|d | j dd	|d
t	 d}d|i}t
d| dS )Nr:   r;   c                    s     t| S r,   )build_absolute_urir   )rQ   rD   r!   r"   abs_uri   r$   z*FacebookProvider.media_js.<locals>.abs_urifacebook_login_by_tokensocialaccount_login_cancelledaccount_logoutr5   )r9   socialaccount_login_error)rb   rc   sdkUrl
initParamsloginOptionsloginByTokenUrl	cancelUrl	logoutUrlloginUrlerrorUrl	csrfTokenfb_datazfacebook/fbconnect.htmlr~   )r8   rg   re   r   r|   ri   rq   r}   rB   r   r   )r    rD   r   r   ctxr!   r~   r"   media_js   s&   zFacebookProvider.media_jsFc                 C   s>   |r
|j td }n|j t}|s|rtt}||j t< |S r,   )sessionr?   r   r   r   r   )r    rD   rl   r?   noncer!   r!   r"   rp      s   
zFacebookProvider.get_noncec                 C   s   |d S )NrP   r!   r    datar!   r!   r"   extract_uid   s   zFacebookProvider.extract_uidc                 C   s0   t |d|d|d|d|ddS )NrM   usernamerR   rS   rQ   )rM   r   rR   rS   rQ   )dictr   r   r!   r!   r"   extract_common_fields   s   z&FacebookProvider.extract_common_fieldsc                 C   s*   g }| d}|r|t|ddd |S )NrM   FT)rM   rT   primary)r   rN   r	   )r    r   rG   rM   r!   r!   r"   extract_email_addresses   s
   
z(FacebookProvider.extract_email_addressestokenc              
   C   s   ddl m} |d}|d}t||gst dz|r'||| |W S |s+J ||| |W S  tt	j
fyH } zt d|d}~ww )a  
        Verifies both normal oAuth2-style "access_token"s as well
        as OIDC-style "Limited Login" JWTs.

        Limited Login is an OIDC-based form of Facebook Login
        that their iOS SDK uses when App Tracking Transparency consent is denied.
        r   )flowsaccess_tokenid_tokeninvalid_tokenN)(allauth.socialaccount.providers.facebookr   r   anyr
   validation_errorverify_tokenverify_limited_login_tokenr   requestsRequestException)r    rD   r   r   r   r   er!   r!   r"   r      s   

zFacebookProvider.verify_token)FF) r'   r(   r)   r   rP   rQ   r   account_classr   oauth2_adapter_classsupports_token_authentication!limited_login_expected_jwt_issuerlimited_login_jwks_urlr/   r8   rB   rK   rL   rO   r[   r_   ri   rq   r|   r   rp   r   r   r   r   r   __classcell__r!   r!   r2   r"   r*   4   s4    

		r*   )-r   rv   urllib.parser   django.contrib.authr   django.middleware.csrfr   django.template.loaderr   django.urlsr   django.utils.cryptor   django.utils.htmlr   allauth.account.modelsr	   allauth.socialaccount.adapterr
   "allauth.socialaccount.app_settingsr   $allauth.socialaccount.providers.baser   r   r   2allauth.socialaccount.providers.facebook.constantsr   r   r   r   r   .allauth.socialaccount.providers.facebook.viewsr   -allauth.socialaccount.providers.oauth2.clientr   /allauth.socialaccount.providers.oauth2.providerr   allauth.utilsr   rU   r   r   r*   provider_classesr!   r!   r!   r"   <module>   s.     
=