o
    gfh                     @   s   d Z zddlZW n ey'   zddlZW n ey$   ddlmZ Y nw Y nw ddlmZ ddlmZmZ ddl	m
Z
mZmZmZ ddlmZmZmZ dZd	Zd
Z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G dd deZG dd deZeeedZdS )z
Yandex OpenID and OAuth2 support.

This contribution adds support for Yandex.ru OpenID service in the form
openid.yandex.ru/user. Username is retrieved from the identity url.

If username is not specified, OpenID 2.0 url used for authentication.
    N)
simplejson)	urlencode)urlparseurlsplit)OpenIDBackend
OpenIdAuthOAuthBackend
BaseOAuth2)settinglogdsa_urlopenz!https://oauth.yandex.ru/authorizezhttps://oauth.yandex.ru/tokenzoauth.yandex.ruzhttp://openid.yandex.ruc              	   C   s:   zt | dj}|dd W S  ttfy   Y d S w )Nwww.r   )r   gethostnamesplit
IndexErrorAttributeError)linkshost r   d/var/www/html/humari/django-venv/lib/python3.10/site-packages/social_auth/backends/contrib/yandex.pyget_username_from_url!   s   r   c                       s,   e Zd ZdZdZdd Z fddZ  ZS )YandexBackendz$Yandex OpenID authentication backendyandexc                 C   s   |d p|j S )Nemail)identity_url)selfdetailsresponser   r   r   get_user_id-   s   zYandexBackend.get_user_idc                    sD   t t| |}|dpt|jjd|d< |dd|d< |S )z#Generate username from identity urlusername/r    )superr   get_user_detailsr   r   r   pathstrip)r   r   values	__class__r   r   r%   0   s   
zYandexBackend.get_user_details)__name__
__module____qualname____doc__namer    r%   __classcell__r   r   r)   r   r   )   
    r   c                   @   s   e Zd ZdZeZdd ZdS )
YandexAuthzYandex OpenID authenticationc                 C   s   t S )z!Returns Yandex authentication URL)YANDEX_OPENID_URLr   r   r   r   
openid_url?   s   zYandexAuth.openid_urlN)r+   r,   r-   r.   r   AUTH_BACKENDr5   r   r   r   r   r2   ;   s    r2   c                   @   s$   e Zd ZdZdZddgZdd ZdS )YaruBackendz#Yandex OAuth authentication backendyaru)idr9   )expiresr:   c                 C   sT   |d }d}d|v r| d}|d }|d }n|}t|d|dd||dS )	z'Return user details from Yandex accountr/   r#    r      r   r   )r!   r   
first_name	last_name)r   r   r   )r   r   r/   r>   namesr=   r   r   r   r%   L   s   


zYaruBackend.get_user_detailsN)r+   r,   r-   r.   r/   
EXTRA_DATAr%   r   r   r   r   r7   D   s    r7   c                   @   s8   e Zd ZdZeZeZeZ	dZ
dZdZdd Zdd Zd	S )
YaruAuthzYandex Ya.ru OAuth mechanismFYANDEX_APP_IDYANDEX_API_SECRETc                 C   s   dS )Nzhttps://api-yaru.yandex.ru/me/r   r4   r   r   r   get_api_urli   s   zYaruAuth.get_api_urlc              
   O   s`   |ddd}|   d t| }ztt|W S  ttfy/   tdddt|dd	 Y d
S w )zLoads user data from servicejsonr<   )oauth_tokenformattext?errorz Could not load data from Yandex.T)data)exc_infoextraN)	rD   r   r   loadr   
ValueErrorr   r   dict)r   access_tokenr   argskwargsparamsurlr   r   r   	user_datal   s   
zYaruAuth.user_dataN)r+   r,   r-   r.   YANDEX_AUTHORIZATION_URLAUTHORIZATION_URLYANDEX_ACCESS_TOKEN_URLACCESS_TOKEN_URLr7   r6   REDIRECT_STATESETTINGS_KEY_NAMESETTINGS_SECRET_NAMErD   rV   r   r   r   r   rA   `   s    rA   c                   @   s   e Zd ZdZdZdS )YandexOAuth2Backendz+Legacy Yandex OAuth2 authentication backendyandex-oauth2N)r+   r,   r-   r.   r/   r   r   r   r   r^   |   s    r^   c                       s,   e Zd ZdZeZdd Z fddZ  ZS )YandexOAuth2z%Yandex Ya.ru/Moi Krug OAuth mechanismc                 C   s   t dS )NYANDEX_OAUTH2_API_URL)r
   r4   r   r   r   rD      s   zYandexOAuth2.get_api_urlc                    s   t t| ||||}|rFt|trt|dkr|d }d|v r(|d d}nd|v r4|d d}nd}||d dd	 ||d
 |S )Nr<   r   r   avatarPortraitr#   r9   r"   )r9   rQ   userpic)	r$   r`   rV   
isinstancelistlenr   updater   )r   rQ   r   rR   rS   replyre   r)   r   r   rV      s"   zYandexOAuth2.user_data)	r+   r,   r-   r.   r^   r6   rD   rV   r0   r   r   r)   r   r`      r1   r`   )r   r8   r_   )r.   rE   r   ImportErrordjango.utilsurllibr   r   r   social_auth.backendsr   r   r   r	   social_auth.utilsr
   r   r   rW   rY   YANDEX_SERVERr3   r   r   r2   r7   rA   r^   r`   BACKENDSr   r   r   r   <module>   s<    	!
