o
    gfe                     @   s   d Z ddlmZ ddlmZ zddlZW n ey3   zddlZW n ey0   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 dd	lmZ d
ZdZdZdZdZG dd deZG dd deZdeiZdS )aX  
GitHub OAuth support.

This contribution adds support for GitHub OAuth service. The settings
GITHUB_APP_ID and GITHUB_API_SECRET must be defined with the values
given by GitHub application registration process.

GITHUB_ORGANIZATION is an optional setting that will allow you to constrain
authentication to a given GitHub organization.

Extended permissions are supported by defining GITHUB_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.
    )	urlencode)	HTTPErrorN)
simplejson)settings)dsa_urlopen)
BaseOAuth2OAuthBackend)
AuthFailedz(https://github.com/login/oauth/authorizez+https://github.com/login/oauth/access_tokenzhttps://api.github.com/userz4https://api.github.com/orgs/{org}/members/{username}z
github.comc                   @   s,   e Zd ZdZdZddgZdd Zdd Zd	S )
GithubBackendz#Github OAuth authentication backendgithub)idr   )expiresr   c              	   C   sF   t d td|i }z
tt|}W |S  ttfy"   g }Y |S w )z(Fetch private emails from Github accountz/emails?access_token)GITHUB_USER_DATA_URLr   r   loadr   
ValueErrorr   )selfr   urldata r   d/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/backends/contrib/github.py_fetch_emails8   s   zGithubBackend._fetch_emailsc                 C   s   | dpd}d| di}z| | dd }W n ty'   d|d< Y nw ||d< z
|dd	\}}W n tyD   ||d
< Y |S w ||d
< ||d< |S )z'Return user details from Github accountname usernameloginr   r   email    
first_name	last_name)getr   
IndexErrorsplitr   )r   responser   detailsr   r   r    r   r   r   get_user_detailsD   s"   
zGithubBackend.get_user_detailsN)__name__
__module____qualname____doc__r   
EXTRA_DATAr   r&   r   r   r   r   r
   /   s    r
   c                   @   s@   e Zd ZdZeZeZeZ	dZ
dZdZdZeeddZdd	 ZdS )

GithubAuthzGithub OAuth2 mechanismGITHUB_APP_IDGITHUB_API_SECRET,GITHUB_EXTENDED_PERMISSIONSGITHUB_ORGANIZATIONNc                 O   s   t d td|i }z	tt|}W n ty   d}Y nw |rS| jrStj| j|	ddd td|i }zt|}W n t
yI   d}Y |S w |jdkrStd|S )zLoads user data from service?r   Nr   )orgr      z'User doesn't belong to the organization)r   r   r   r   r   r   r1   !GITHUB_ORGANIZATION_MEMBER_OF_URLformatr!   r   coder	   )r   r   argskwargsr   r   
member_urlr$   r   r   r   	user_datah   s8   

zGithubAuth.user_data)r'   r(   r)   r*   GITHUB_AUTHORIZATION_URLAUTHORIZATION_URLGITHUB_ACCESS_TOKEN_URLACCESS_TOKEN_URLr
   AUTH_BACKENDSETTINGS_KEY_NAMESETTINGS_SECRET_NAMESCOPE_SEPARATORSCOPE_VAR_NAMEgetattrr   r1   r;   r   r   r   r   r,   [   s    r,   r   )r*   urllibr   urllib2r   jsonr   ImportErrordjango.utilsdjango.confr   social_auth.utilsr   social_auth.backendsr   r   social_auth.exceptionsr	   r<   r>   r   r5   GITHUB_SERVERr
   r,   BACKENDSr   r   r   r   <module>   s6    ,0