o
    h4                      @   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 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_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S )FacebookAccountc                 C   s   | j jdS )Nlink)account
extra_datagetself r    h/var/www/html/pos/venv/lib/python3.10/site-packages/allauth/socialaccount/providers/facebook/provider.pyget_profile_url#      zFacebookAccount.get_profile_urlN)__name__
__module____qualname__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,   5   s   zFacebookProvider.__init__c                 C   s   |   ddS )NMETHODoauth2get_settingsr   r   r    r    r!   
get_method9   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:%sr2   zInvalid method specified: %s)popr5   r   r   r   r   LOGINr   AUTHENTICATEr   r+   r'   get_login_urlRuntimeError)
r   requestr.   r6   nextr9   r:   r;   jsretr/   r    r!   r?   <   s$   zFacebookProvider.get_login_urlc                 C   s$   |   }|d}|rt|S t S )NLOCALE_FUNC)r4   r   r   r   )r   settingsfuncr    r    r!   _get_locale_callableP   s   
z%FacebookProvider._get_locale_callablec                 C   s   | j s|  | _ |  |S r)   )r*   rH   )r   rA   r    r    r!   get_locale_for_requestU   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_scopeZ   s   
z"FacebookProvider.get_default_scopec                 C   s   |   }g d}|d|S )N)idrJ   name
first_name	last_nameverifiedlocaletimezoner   genderupdated_timeFIELDSr3   )r   rF   default_fieldsr    r    r!   
get_fields`   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   rA   r:   rD   r/   r    r!   r\   q   s   

z-FacebookProvider.get_auth_params_from_requestc                 C   s*   |j td}|  }||di  |S )N)appIdversionINIT_PARAMS)	client_idr   r4   updater   )r   rA   appinit_paramsrF   r    r    r!   get_init_paramsy   s   z FacebookProvider.get_init_paramsc                 C   sD   |  |d}d| ||d< |ddkr | j|dd|d< |S )	Nauthenticate,r;   rZ   rY   T)	or_create
auth_nonce)r\   joinget_scope_from_requestr   	get_nonce)r   rA   rD   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>rR   )rR   )r4   r   string	FormatterparserI   format)r   rA   rF   sdk_urlfield_namesrR   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 )Nr7   r8   c                    s     t| S r)   )build_absolute_urir   )rN   rA   r    r!   abs_uri   r#   z*FacebookProvider.media_js.<locals>.abs_urifacebook_login_by_tokensocialaccount_login_cancelledaccount_logoutr2   )r6   socialaccount_login_error)r_   r`   sdkUrl
initParamsloginOptionsloginByTokenUrl	cancelUrl	logoutUrlloginUrlerrorUrl	csrfTokenfb_datazfacebook/fbconnect.htmlr{   )r5   rd   rb   r   ry   rf   rn   rz   r?   r   r   )r   rA   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   rA   ri   r<   noncer    r    r!   rm      s   
zFacebookProvider.get_noncec                 C   s   |d S )NrM   r    r   datar    r    r!   extract_uid   s   zFacebookProvider.extract_uidc                 C   s0   t |d|d|d|d|ddS )NrJ   usernamerO   rP   rN   )rJ   r   rO   rP   rN   )dictr   r   r    r    r!   extract_common_fields   s   z&FacebookProvider.extract_common_fieldsc                 C   s*   g }| d}|r|t|ddd |S )NrJ   FT)rJ   rQ   primary)r   rK   r	   )r   r   rD   rJ   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   rA   r   r   r   r   er    r    r!   r      s   

zFacebookProvider.verify_token)FF) r$   r%   r&   r   rM   rN   r   account_classr   oauth2_adapter_classsupports_token_authentication!limited_login_expected_jwt_issuerlimited_login_jwks_urlr,   r5   r?   rH   rI   rL   rX   r\   rf   rn   ry   r   rm   r   r   r   r   r   __classcell__r    r    r/   r!   r'   '   s4    

		r'   ),r   rs   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   .allauth.socialaccount.providers.facebook.viewsr   -allauth.socialaccount.providers.oauth2.clientr   /allauth.socialaccount.providers.oauth2.providerr   allauth.utilsr   rR   r   r   r'   provider_classesr    r    r    r!   <module>   s.     
=