o
    gf+                     @   s  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	 zddl
ZW n eyG   zddlZW n eyD   ddlmZ Y nw Y nw 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 dd
lmZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ dZ%dZ&eddZ'eddZ(eddZ)dZ*G dd deZ+G dd deZ,dd Z-dd Z.d!ddZ/G dd de,Z0d e're0iZ1dS e,iZ1dS )"a  
Facebook OAuth support.

This contribution adds support for Facebook OAuth service. The settings
FACEBOOK_APP_ID and FACEBOOK_API_SECRET must be defined with the values
given by Facebook application registration process.

Extended permissions are supported by defining FACEBOOK_EXTENDED_PERMISSIONS
setting, it must be a list of values to request.

By default account id and token expiration time are stored in extra_data
field, check OAuthBackend class for details on how to extend it.
    N)	urlencode)	HTTPError)
simplejson)authenticate)HttpResponse)TemplateDoesNotExistRequestContextloader)
BaseOAuth2OAuthBackend)sanitize_log_databackend_settingsettinglogdsa_urlopen)AuthExceptionAuthCanceled
AuthFailedAuthTokenErrorAuthUnknownErrorzhttps://graph.facebook.com/me?z.https://graph.facebook.com/oauth/access_token?FACEBOOK_APP_AUTHFFACEBOOK_LOCAL_HTMLzfacebook.htmlFACEBOOK_APP_NAMESPACEax  
<script type="text/javascript">
    var domain = 'https://apps.facebook.com/',
        redirectURI = domain + '{{ FACEBOOK_APP_NAMESPACE }}' + '/';
    window.top.location = 'https://www.facebook.com/dialog/oauth/' +
    '?client_id={{ FACEBOOK_APP_ID }}' +
    '&redirect_uri=' + encodeURIComponent(redirectURI) +
    '&scope={{ FACEBOOK_EXTENDED_PERMISSIONS }}';
</script>
c                   @   s$   e Zd ZdZdZddgZdd ZdS )FacebookBackendz&Facebook OAuth2 authentication backendfacebook)idr   )expiresr   c                 C   s>   | d| d| dd| dd| dd| dddS )z)Return user details from Facebook accountusernamenameemail 
first_name	last_name)r   r   fullnamer!   r"   )get)selfresponse r'   ^/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/backends/facebook.pyget_user_detailsD   s   



z FacebookBackend.get_user_detailsN)__name__
__module____qualname____doc__r   
EXTRA_DATAr)   r'   r'   r'   r(   r   ;   s    r   c                   @   s   e Zd ZdZeZdZdZdZdZ	dZ
eZdZdZd	Zd
Zdd Zdd Zedd Zedd ZdddZedd Zedd Zedd ZdS )FacebookAuthzFacebook OAuth2 supportN,z%https://www.facebook.com/dialog/oauthz,https://graph.facebook.com/{uid}/permissionsDELETEFACEBOOK_APP_IDFACEBOOK_API_SECRETFACEBOOK_EXTENDED_PERMISSIONSFACEBOOK_PROFILE_EXTRA_PARAMSc           	   	   O   s   d}t | | ji }||d< tt| }zt|}t|}W n0 ty6   dt|i}t	ddd|d Y |S  t
yN   dt|i}t	ddd|d t| w t	dd	t|d
|id |S )z]
        Grab user profile information from facebook.

        returns: dict or None
        Naccess_tokenerrorz'Could not load user data from Facebook.T)exc_infoextrazError validating access token.debugzFound user data for token %sdata)r9   )r   EXTRA_PARAMS_VAR_NAMEFACEBOOK_MEr   r   r   load
ValueErrorr   r   r   r   )	r%   r6   argskwargsr;   paramsurlr&   r9   r'   r'   r(   	user_data[   s0   
zFacebookAuth.user_datac           
      O   s@  d}d}d| j v rR|  }ttt| | j| |t| | j| j d d }zt|}W n t	y8   t
| dw | }t|}	|	d d }d|	v rR|	d d }d| j v rt| j dt| | j}|dur|dpw|d	pw| j d}d|v r|d }|r| j|g|R d|i|S | j d
dkrt| t| )z3Completes loging process, must return user instanceNcode)	client_idredirect_uriclient_secretrE   z)There was an error authenticating the appr6   r   r   signed_requestoauth_tokenr7   access_denied)r;   validate_stateACCESS_TOKENr   r   SETTINGS_KEY_NAMEget_redirect_uriSETTINGS_SECRET_NAMEr   r   r   readcgiparse_qsload_signed_requestr$   do_authr   r   )
r%   r@   rA   r6   r   staterC   payloadr&   parsed_responser'   r'   r(   auth_completex   sR   


	






zFacebookAuth.auth_completec                 C   s   t dd t| D S )Nc                 s   s     | ]\}}||d  fV  qdS )r   Nr'   ).0keyvalr'   r'   r(   	<genexpr>   s    z>FacebookAuth.process_refresh_token_response.<locals>.<genexpr>)dictrR   rS   	iteritemsclsr&   r'   r'   r(   process_refresh_token_response   s   z+FacebookAuth.process_refresh_token_responsec                 C   s   |   \}}|d||dS )Nfb_exchange_token)rc   
grant_typerF   rH   )get_key_and_secret)ra   tokenrF   rH   r'   r'   r(   refresh_token_params   s   z!FacebookAuth.refresh_token_paramsc                 O   sZ   |  |}t|tst| d||d< |r||d< |d| d|| jjdi t|i |S )Nz5An error ocurred while retrieving users Facebook datar6   r   authr&   T)rD   
isinstancer^   r   updateAUTH_BACKENDr   r   )r%   r6   r   r@   rA   r;   r'   r'   r(   rU      s   


zFacebookAuth.do_authc                 C   s   t | | jot | | jS )z8Return backend enabled status by checking basic settings)r   rN   rP   )ra   r'   r'   r(   enabled   s   
zFacebookAuth.enabledc                 C   s   d|iS )Nr6   r'   )ra   rf   uidr'   r'   r(   revoke_token_params   s   z FacebookAuth.revoke_token_paramsc                 C   s   |j dko
| dkS )N   true)rE   rQ   r`   r'   r'   r(   process_revoke_token_response   s   z*FacebookAuth.process_revoke_token_responseN)r*   r+   r,   r-   r   rk   RESPONSE_TYPESCOPE_SEPARATORAUTHORIZATION_URLREVOKE_TOKEN_URLREVOKE_TOKEN_METHODrM   ACCESS_TOKEN_URLrN   rP   SCOPE_VAR_NAMEr<   rD   rY   classmethodrb   rg   rU   rl   rn   rq   r'   r'   r'   r(   r/   M   s4    3


	

r/   c                 C   s,   |  d} | ddt| d   7 } t| S )Nascii=   )encodelenbase64urlsafe_b64decoder;   r'   r'   r(   base64_url_decode   s   

r   c                 C   s   t | dS )Nr|   )r   urlsafe_b64encoderstripr   r'   r'   r(   base64_url_encode   s   r   c                 C   s   z9|  dd\}}t|}tt|}tj|ptd|tjd	 }||kr4|d t

 d kr7|W S W d S W d S  tyC   Y d S w )N.   r3   )msg	digestmod	issued_atiQ )splitr   r   loadshmacnewr   hashlibsha256digesttimer?   )rI   
api_secretsigrW   r;   expected_sigr'   r'   r(   rT      s$   rT   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
FacebookAppAuthz+Facebook Application Authentication supportFc                 O   s   |   sd| jvrt|  S d }d }d| jv rAt| jdt| | j}|d urA|dp8|dp8| jd}d|v rA|d }|rQ| j|g|R d|i|S | jddkr]t	| t
| )Nr7   rI   r6   rJ   r   rK   )application_authr;   r   	auth_htmlrT   r$   r   rP   rU   r   r   )r%   r@   rA   r6   r   r&   r'   r'   r(   rY      s,   




zFacebookAppAuth.auth_completec                 C   s:   d}t | jdt| | j}|D ]	}||vr dS qdS )N)user_idrJ   rI   FT)rT   r;   r$   r   rP   )r%   required_paramsr;   paramr'   r'   r(   r     s   

z FacebookAppAuth.application_authc                 C   sp   t | | j}|dt | | j| jtp|d}ztt}W n t	y,   t
t}Y nw t| j|}||S )Nr0   )r2   r4   FACEBOOK_COMPLETE_URIr   )r   rN   joinry   rG   APP_NAMESPACEr	   get_template
LOCAL_HTMLr   get_template_from_stringREDIRECT_HTMLr   requestrender)r%   app_idctxfb_templatecontextr'   r'   r(   r   '  s   
	
zFacebookAppAuth.auth_htmlN)r*   r+   r,   r-   uses_redirectrY   r   r   r'   r'   r'   r(   r      s    r   r   rr   )2r-   rR   r   r   r   r   urllibr   urllib2r   jsonr   ImportErrordjango.utilsdjango.contrib.authr   django.httpr   django.templater   r   r	   social_auth.backendsr
   r   social_auth.utilsr   r   r   r   r   social_auth.exceptionsr   r   r   r   r   r=   rM   USE_APP_AUTHr   r   r   r   r/   r   r   rT   r   BACKENDSr'   r'   r'   r(   <module>   sR    


 
B