
    qh@                         S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  S	\S
\4S jr " S S\
5      r " S S\5      rS rS r SS jrg)z
Odnoklassniki OAuth2 and Iframe Application backends, docs at:
    https://python-social-auth.readthedocs.io/en/latest/backends/odnoklassnikiru.html
    )md5)unquote   )
AuthFailed   )BaseAuth)
BaseOAuth2payloadreturnc                 R    [        U R                  S5      5      R                  5       $ )z
Calculates a payload signature using md5.

See
https://apiok.ru/en/ext/invite_suggest#calculating-request-signature-stsignature
zutf-8)r   encode	hexdigest)r
   s    T/var/www/html/env/lib/python3.13/site-packages/social_core/backends/odnoklassniki.pyodnoklassniki_sigr      s!     w~~g&'1133    c                   @    \ rS rSrSrSrSrSrSrSr	SS	/r
S
 rS rSrg)OdnoklassnikiOAuth2   z$Odnoklassniki authentication backendzodnoklassniki-oauth2uid;z%https://connect.ok.ru/oauth/authorizez https://api.ok.ru/oauth/token.do)refresh_tokenr   )
expires_inexpiresc                     U R                  [        US   5      [        US   5      [        US   5      S9u  p#nUS   UR                  SS5      UUUS.$ )	z.Return user details from Odnoklassniki requestname
first_name	last_namefullnamer   r   r   email usernamer    r   r   r   )get_user_namesr   getselfresponser   r   r   s        r   get_user_details$OdnoklassnikiOAuth2.get_user_details"   sm    *.*=*=Xf-.x56h{34 +> +
'i !\\'2. $"
 	
r   c                 n    USS.nU R                  5       u  pVU R                  S5      n[        XSXvS5      $ )z,Return user data from Odnoklassniki REST APIzusers.getCurrentUser)access_tokenmethodPUBLIC_NAMEzhttps://api.ok.ru/oauth)get_key_and_secretsettingodnoklassniki_api)r'   r,   argskwargsdatakeysecret
public_keys           r   	user_dataOdnoklassnikiOAuth2.user_data1   sB     ,8NO--/\\-0
 ,j'
 	
r    N)__name__
__module____qualname____firstlineno____doc__r   ID_KEYSCOPE_SEPARATORAUTHORIZATION_URLACCESS_TOKEN_URL
EXTRA_DATAr)   r9   __static_attributes__r;   r   r   r   r      s5    .!DFO?946OPJ

r   r   c                   H    \ rS rSrSrSrSrSS jrS rS r	S	 r
S
 rS rSrg)OdnoklassnikiApp;   z/Odnoklassniki iframe app authentication backendzodnoklassniki-appr   Nc                 l    UR                  5        VVs0 s H  u  pxXsS   ;   d  M  Xx_M     snn$ s  snnf )Nextra_data_list)items)	r'   userr   r(   detailsr3   r4   r6   values	            r   
extra_dataOdnoklassnikiApp.extra_dataA   sB     'nn.
.
011 CJ.
 	
 
s   00c                     U R                  [        US   5      [        US   5      [        US   5      S9u  p#nUS   SUUUS.$ )Nr   r   r   r   r   r!   r"   )r$   r   r&   s        r   r)   !OdnoklassnikiApp.get_user_detailsH   sb    *.*=*=Xf-.x56h{34 +> +
'i ! $"
 	
r   c                 0   U R                  5         U R                  5       nSSSS/U R                  SS5      Q7nSSR                  US	   5      S
R	                  U5      S.nU R                  5       u  pgU R                  S5      n[        U UUS   UUS5      n	[        U	5      S:X  aJ  SU	S   ;   aA  U	S   n	U R                  SS5      n
U
 H	  nX;   X'   M     XJ-   U	S'   UR                  X	S.5        O[        U S5      eU R                  R                  " U0 UD6$ )Nr   r   r   r   EXTRA_USER_DATA_LISTr;   zusers.getInfoz{}logged_user_id,)r-   uidsfieldsr.   
api_serveriframe_nosessionr   r   EXTRA_AUTH_DATA_LIST)rZ   apiconnectionsession_key
authorizedsession_secret_keyrK   )backendr(   z"Cannot get user details: API error)verify_auth_sigget_responser1   formatjoinr0   r2   lenupdater   strategyauthenticate)r'   r3   r4   r(   rY   r5   
client_keyclient_secretr8   rN   auth_data_fieldsfields               r   auth_completeOdnoklassnikiApp.auth_completeV   sD   $$&	

 \\0"5
 &KK)9 :;hhv&

 %)$;$;$=!
\\-0
#\"
 w<1'!*!4ajG#||&	  *!) *)/)BG%&MMd@AT#GHH}}))4:6::r   c           	          [        SR                  U R                  S   U R                  S   U R                  S5      5      5      $ )Nz{:s}{:s}{:s}rV   r^   SECRET)r   rd   r5   r1   )r'   s    r   get_auth_sigOdnoklassnikiApp.get_auth_sig   sB     !!		*+		-(X&
 	
r   c                 r    SnU Vs0 s H#  o"U R                   ;   d  M  X R                   U   _M%     sn$ s  snf )N)rV   rZ   application_keyr^   r`   r_   r]   )r5   )r'   rY   r   s      r   rc   OdnoklassnikiApp.get_response   s:    
 39N&$DII<M%iio%&NNNs   44c                     U R                  5       nU R                  S   R                  5       nX:w  a  [        U S5      eg )Nauth_sigzWrong authorization key)rr   r5   lowerr   )r'   correct_keyr6   s      r   rb    OdnoklassnikiApp.verify_auth_sig   s@    '')ii
#))+T#<== r   r;   )N)r<   r=   r>   r?   r@   r   rA   rP   r)   rn   rr   rc   rb   rF   r;   r   r   rH   rH   ;   s/    9DF

,;\

O>r   rH   c                     [        SR                  U S   U5      5      n[        S U R                  5        5       5      n[        SR	                  U5      U-   5      $ )z
Calculates signature of request data access_token value must be included
Algorithm is described at
    https://apiok.ru/wiki/pages/viewpage.action?pageId=12878032,
search for "little bit different way"
z{:s}{:s}r,   c              3   H   #    U  H  u  pUS :w  d  M  US SUS 3v   M     g7f)r,   s=Nr;   .0r6   rO   s      r   	<genexpr>*odnoklassniki_oauth_sig.<locals>.<genexpr>   s.      /;sn?T3q'5)|s   ""r!   )r   rd   sortedrL   re   )r5   rk   suffix
check_lists       r   odnoklassniki_oauth_sigr      sX     z00n1E}UVF /3zz| J RWWZ069::r   c                 |    [        S U R                  5        5       5      n[        SR                  U5      U-   5      $ )z
Calculates signature as described at:
    https://apiok.ru/wiki/display/ok/Authentication+and+Authorization
If API method requires session context, request is signed with session
secret key. Otherwise it is signed with application secret key
c              3   8   #    U  H  u  pUS  SUS  3v   M     g7f)r~   r   Nr;   r   s      r   r   +odnoklassniki_iframe_sig.<locals>.<genexpr>   s!     L|3q'5),|s   r!   )r   rL   r   re   )r5   client_secret_or_session_secret
param_lists      r   odnoklassniki_iframe_sigr      s4     Ltzz|LLJRWWZ03RRSSr   c                    UR                  USS.5        US:X  a  [        X5      US'   OIUS:X  a  [        XS   5      US'   O1US:X  a  [        X5      US'   OSn[        XR	                  U5      5      eU R                  US	-   US
9$ )z[Calls Odnoklassniki REST API method
https://apiok.ru/wiki/display/ok/Odnoklassniki+Rest+APIJSON)ru   rd   r/   sigiframe_sessionr`   r[   z2Unknown request type {0}. How should it be signed?zfb.do)params)rg   r   r   r   rd   get_json)ra   r5   api_urlr8   rk   request_typemsgs          r   r2   r2      s    
 	KKJ&ABw-dBU	)	).t:N5OPU	+	+.tCUB**\":;;Gg-d;;r   N)r/   )r@   hashlibr   urllib.parser   
exceptionsr   baser   r/   r	   strr   r   rH   r   r   r2   r;   r   r   <module>r      sa   
    #  4s 4s 4 
*  
Fb>x b>J;T EL<r   