o
    gf                     @   sT  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 zd dlZW n eyJ   zd dlZW n eyG   d dlmZ Y nw Y nw d d	lmZmZ d d
lmZmZmZ d dlmZmZ dZde Zde Zde Zde Zg dZdd Z G dd deZ!G dd deZ"G dd deZ#G dd deZ$dd Z%e#e$dZ&dS )    )get_language)ElementTree)
ExpatError)	urlencode)Request)TokenN)
simplejson)settingdsa_urlopen)ConsumerBasedOAuthOAuthBackend
BaseOAuth2)AuthCanceledAuthUnknownErrorzlinkedin.comz%https://api.%s/uas/oauth/requestTokenz$https://api.%s/uas/oauth/accessTokenz%https://www.%s/uas/oauth/authenticatezhttps://api.%s/v1/people/~)id
first-name	last-namec                 C   s<   t dd}|du r| dt  d S |r| d| d S d S )NLINKEDIN_FORCE_PROFILE_LANGUAGEFTzAccept-Language)r	   
add_headerr   )requestlanguage r   f/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/backends/contrib/linkedin.pyadd_language_header(   s   
r   c                       s8   e Zd ZdZdZg dZdd Ze fddZ  Z	S )LinkedinBackendz%Linkedin OAuth authentication backendlinkedin)r   r   )r   
first_name)r   	last_namec                 C   s:   |d |d }}| dd}|| |d | |||dS )z)Return user details from Linkedin accountr   r   zemail-address  usernamefullnamer   r   emailget)selfresponser   r   r$   r   r   r   get_user_details7   s   
z LinkedinBackend.get_user_detailsc                    s<   t t| |}|rd|v rtdd |d dD }|S )z/ Return list of OAuth v1 tokens from Linkedin  access_tokenc                 s   s    | ]}| d V  qdS )=N)split).0tokr   r   r   	<genexpr>F   s    z)LinkedinBackend.tokens.<locals>.<genexpr>&)superr   tokensdictr,   )clsinstancetoken	__class__r   r   r2   A   s   zLinkedinBackend.tokens)
__name__
__module____qualname____doc__name
EXTRA_DATAr)   classmethodr2   __classcell__r   r   r7   r   r   0   s    
r   c                   @   s$   e Zd ZdZdZg dZdd ZdS )LinkedinOAuth2Backendz&Linkedin OAuth2 authentication backendlinkedin-oauth2)r   )	firstNamer   )lastNamer   c                 C   s6   |d |d }}|| |d | ||| dddS )NrC   rD   r    emailAddressr   r!   r%   )r'   r(   r   r   r   r   r   r)   S   s   

z&LinkedinOAuth2Backend.get_user_detailsN)r9   r:   r;   r<   r=   r>   r)   r   r   r   r   rA   K   s
    rA   c                       sX   e Zd ZdZeZeZeZ	e
ZdZdZdZdZdd Z fdd	Zd
d Zdd Z  ZS )LinkedinAuthz'Linkedin OAuth authentication mechanismLINKEDIN_CONSUMER_KEYLINKEDIN_CONSUMER_SECRETLINKEDIN_SCOPE+c              
   O   sn   t tdg  }tddt|  }| ||}t| | |}ztt	
|W S  tttfy6   Y dS w )Return user data providedLINKEDIN_EXTRA_FIELD_SELECTORS:(%s),N)LINKEDIN_FIELD_SELECTORSr	   LINKEDIN_CHECK_AUTHjoinsetoauth_requestr   fetch_responseto_dictr   
fromstringr   KeyError
IndexError)r'   r*   argskwargsfields_selectorsurlr   raw_xmlr   r   r   	user_datag   s   
zLinkedinAuth.user_datac                    sH   | j jd}|r|dkrt| dt| d| tt| j|i |S )z5Complete auth process. Check LinkedIn error response.oauth_problemuser_refusedr   zLinkedIn error was %s)r   GETr&   r   r   r1   rF   auth_complete)r'   rY   rZ   r_   r7   r   r   rb   v   s   
zLinkedinAuth.auth_completec                 C   s"   g }| j rt| j g }|S g }|S )z$Return list with needed access scope)SCOPE_VAR_NAMEr	   )r'   scoper   r   r   	get_scope   s   zLinkedinAuth.get_scopec                 C   sV   | j }|  }|rd| j| }|d | }| jd||  d}| |}t|S )z<Makes first request to oauth. Returns an unauthorized Token.zscope=?N)r6   r\   extra_params)	REQUEST_TOKEN_URLre   SCOPE_SEPARATORrQ   rS   request_token_extra_argumentsrT   r   from_string)r'   request_token_urlrd   qsr   r(   r   r   r   unauthorized_token   s   

zLinkedinAuth.unauthorized_token)r9   r:   r;   r<   LINKEDIN_AUTHORIZATION_URLAUTHORIZATION_URLLINKEDIN_REQUEST_TOKEN_URLrh   LINKEDIN_ACCESS_TOKEN_URLACCESS_TOKEN_URLr   AUTH_BACKENDSETTINGS_KEY_NAMESETTINGS_SECRET_NAMErc   ri   r^   rb   re   rn   r@   r   r   r7   r   rF   \   s    	rF   c                   @   s0   e Zd ZeZdZdZdZdZdZ	dZ
dd Zd	S )
LinkedinOAuth2z1https://www.linkedin.com/uas/oauth2/authorizationz/https://www.linkedin.com/uas/oauth2/accessTokenrG   rH   rI   Fc              
   O   sz   t tdg  }tddt|  }|dd}t|d t| }t| z
t	t
| W S  tttfy<   Y dS w )rK   rL   rM   rN   json)oauth2_access_tokenformatrf   N)rO   r	   rP   rQ   rR   r   r   r   r   loadsr
   readr   rW   rX   )r'   r*   rY   rZ   r[   r\   datar   r   r   r   r^      s   
zLinkedinOAuth2.user_dataN)r9   r:   r;   rA   rt   rp   rs   ru   rv   rc   REDIRECT_STATEr^   r   r   r   r   rw      s    rw   c                 C   sx   |   }|s	| jS i }|   D ]*}|j|v r2t||j ts'||j g||j< ||j t| qt|||j< q|S )zhConvert XML structure to dict recursively, repeated keys entries
    are returned as in list containers.)getchildrentexttag
isinstancelistappendrU   )xmlchildrenoutnoder   r   r   rU      s   
rU   )r   rB   )'django.utils.translationr   	xml.etreer   xml.parsers.expatr   urllibr   urllib2r   oauth2r   rx   r   ImportErrordjango.utilssocial_auth.utilsr	   r
   social_auth.backendsr   r   r   social_auth.exceptionsr   r   LINKEDIN_SERVERrq   rr   ro   rP   rO   r   r   rA   rF   rw   rU   BACKENDSr   r   r   r   <module>   sR    ?
