
    DsiZ#                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlZd dl	m
Z
 d dlZd dlmZ ddlmZmZmZmZmZ dd	lmZ  ej,                  d
      Z G d de      Zy)    N)Site)cache)reverse)RSAAlgorithm)OAuth2Session   )CACHE_KEY_JWKSCACHE_KEY_OPENIDCACHE_TIMEOUTLOGIN_TYPE_XBLconfig)
get_schemedjangoc                        e Zd ZdZdZdZdZdZi ZdZ	ddgZ
g d	Zd fd
	Zd Zd Zed        Zed        ZddZ fdZ fdZd Zd Zd Z xZS )MicrosoftClientaR  Simple Microsoft OAuth2 Client to authenticate them

    Extended from Requests-OAuthlib's OAuth2Session class which
        does most of the heavy lifting

    https://requests-oauthlib.readthedocs.io/en/latest/

    Microsoft OAuth documentation can be found at
    https://developer.microsoft.com/en-us/graph/docs/get-started/rest
    zPhttps://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configurationz,https://login.live.com/oauth20_authorize.srfz0https://user.auth.xboxlive.com/user/authenticatez-https://xsts.auth.xboxlive.com/xsts/authorizeNzXboxLive.signinzXboxLive.offline_access)z	User.Readopenidemailprofilec                    t         | _         t        |   | j                   j                  g|| j	                         || j                  |      d| | j                   j                  r| j                   j                  | _        y y )N)scopestateredirect_uri)r   super__init__MICROSOFT_AUTH_CLIENT_ID_get_scopes_get_redirect_uriMICROSOFT_AUTH_PROXIESproxies)selfr   requestargskwargs	__class__s        a/var/www/python-projects/worksol/worksolenv/lib/python3.12/site-packages/microsoft_auth/client.pyr   zMicrosoftClient.__init__2   s    KK00	

 	
""$//8		
 	
 ;;--;;==DL .    c                    dj                  | j                        }| j                  j                  t        k(  rdj                  | j
                        }| j                  j                  }dj                  ||      j                         }|S )N z{} {})	joinSCOPE_MICROSOFTr   MICROSOFT_AUTH_LOGIN_TYPEr   	SCOPE_XBLMICROSOFT_AUTH_EXTRA_SCOPESformatstrip)r    r   extra_scopess      r%   r   zMicrosoftClient._get_scopesA   sg    --.;;00NBHHT^^,E{{>>ul399;r&   c                 X   	 t         j                  j                  |      }|j
                  }t        d      }t        d      }|rd|j                  vr|}n|}t        || j                         d| | S # t         j                  $ r! t         j                  j	                         }Y w xY w)Nzmicrosoft_auth:auth-callbackz!microsoft_auth:from-auth-redirectredirectz://)
r   objectsget_currentDoesNotExistfirstdomainr   pathr   r   )r    r!   current_siter7   callbackr2   r8   s          r%   r   z!MicrosoftClient._get_redirect_uriL   s    	0<<33G<L $$9:>?*GLL8DDWdkk233vhtfEE    	0<<--/L	0s   A5 51B)(B)c                 4   t        j                  t              }||| j                  j	                  | j
                  j                        }| j                  |      }|j                  r/|j                         }t        j                  t        |t               |S )N)tenant)r   getr
   _config_urlr.   r   MICROSOFT_AUTH_TENANT_IDokjsonsetr   )r    r   
config_urlresponses       r%   openid_configzMicrosoftClient.openid_config\   sv    +,>))00{{;; 1 J xx
+H{{!		*FMBr&   c                    t        j                  t        g       }t        |      dk(  rb| j                  d   }|g S | j                  |      }|j
                  r2|j                         d   }t        j                  t        |t               |S )Nr   jwks_urikeys)	r   r=   r	   lenrE   r@   rA   rB   r   )r    jwksrG   rD   s       r%   rJ   zMicrosoftClient.jwksl   sr    yy,t9>))*5H	xx)H{{}}v.		.$>r&   c                    | j                   y | j                   d   j                  d      }t        j                  |      d   }d }d }| j                  D ]  }||d   k(  s|} n |q|rYt
        j                  d       t        j                  t               t        j                  t               | j                  d      S t
        j                  d       y t        j                  t        j                  |            }	 t        j                   ||dg| j"                  j$                  	      }|S # t        j&                  $ r.}t
        j                  d
j)                  |             Y d }~y d }~ww xY w)Nid_tokenutf8kidz>could not find public key for id_token, refreshing OIDC configF)allow_refreshz&could not find public key for id_tokenRS256)
algorithmsaudiencez!could not verify id_token sig: {})tokenencodejwtget_unverified_headerrJ   loggerwarnr   deleter	   r
   
get_claimsr   from_jwkrA   dumpsdecoder   r   
PyJWTErrorr.   )	r    rO   rS   rN   jwk
public_keykeyclaimses	            r%   rZ   zMicrosoftClient.get_claims|   s>   ::

:&--f5''.u5
99 	Cc%j 	
 ;W ^,-.U;;DE!**4::c?;
		ZZ#9==	F 	 ~~ 	KK;BB1EF	s   .D1 1E2$E--E2c                     | j                   d   }| j                  j                  t        k(  r| j                  }| j                  j
                  }d|d<   t        |   |fi |}|S )z:Generates Microsoft/Xbox or a Office 365 Authorization URLauthorization_endpoint	form_postresponse_mode)rE   r   r+   r   _xbox_authorization_urlMICROSOFT_AUTH_EXTRA_PARAMETERSr   authorization_url)r    auth_urlextra_parametersbuilt_auth_urlr$   s       r%   rj   z!MicrosoftClient.authorization_url   si     %%&>?;;00NB33H;;FF,7)28P?OPr&   c                 j    t        |   | j                  d   fd| j                  j                  i|S )z%Fetchs OAuth2 Token with given kwargstoken_endpointclient_secret)r   fetch_tokenrE   r   MICROSOFT_AUTH_CLIENT_SECRET)r    r#   r$   s     r%   rq   zMicrosoftClient.fetch_token   sB     w"/0
++BB
 
 	
r&   c                 "   ddd}dddddj                  | j                  d         d	d
}t        j                  | j                  t        j                  |      |      }|j                  dk(  r|j                         | _        | j                  S )a  Fetches Xbox Live Auth token.

        token must contain a valid access_token
            - retrieved from fetch_token

        Reversed engineered from existing Github repos,
            no "official" API docs from Microsoft

        Response will be similar to
        {
            'Token': 'token',
            'IssueInstant': '2016-09-27T15:01:45.225637Z',
            'DisplayClaims': {'xui': [{'uhs': '###################'}]},
            'NotAfter': '2016-10-11T15:01:45.225637Z'
        }
        application/jsonzContent-typeAcceptzhttp://auth.xboxlive.comJWTRPSzuser.auth.xboxlive.comzd={}access_token)
AuthMethodSiteName	RpsTicketRelyingParty	TokenType
Propertiesdataheaders   )	r.   rS   requestspost_xbox_token_urlrA   r\   status_code
xbox_tokenr    r   paramsrD   s       r%   fetch_xbox_tokenz MicrosoftClient.fetch_xbox_token   s    ( /(

 7#4#]]4::n+EF
 ==  tzz&'97
 3&&mmoDOr&   c                    d| j                   v ryddd}dd| j                   d   gddd}t        j                  | j                  t	        j
                  |      |	      }|j                  d
k(  r|j	                         d   d   d   S i S )a=  
        Fetches the Xbox Live user profile from Xbox servers

        xbox_token must contain a valid Xbox Live token
            - retrieved from fetch_xbox_token

        Reversed engineered from existing Github repos,
            no "official" API docs from Microsoft

        Response will be similar to
        {
            'NotAfter': '2016-09-28T07:19:21.9608601Z',
            'DisplayClaims': {
                'xui': [
                    {
                        'agg': 'Adult',
                        'uhs': '###################',
                        'usr': '###',
                        'xid': '################',
                        'prv': '### ### ###...',
                        'gtg': 'Gamertag'}]},
            'IssueInstant': '2016-09-27T15:19:21.9608601Z',
            'Token': 'token'}
        Tokenrt   ru   zhttp://xboxlive.comrw   RETAIL)
UserTokens	SandboxIdr}   r   r   DisplayClaimsxuir   )r   r   r   _profile_urlrA   r\   r   r   s       r%   get_xbox_profilez MicrosoftClient.get_xbox_profile   s    4 doo% !3,G
 !6"#'??7#;"<!)F  }}!!

6(:GH ##s*}}7>qAA	r&   c                     t        |      }d}| j                  j                  t        k(  rt        | j                        }||k  S t        | j
                        }||k  S )z<Validates response scopes based on MICROSOFT_AUTH_LOGIN_TYPEN)rB   r   r+   r   r,   r*   )r    scopesrequired_scopess      r%   valid_scopeszMicrosoftClient.valid_scopes  s^     V;;00NB!$..1O
 &(( "$"6"67O &((r&   )NN)T)__name__
__module____qualname____doc__r>   rh   r   r   r   r   r,   r*   r   r   r   propertyrE   rJ   rZ   rj   rq   r   r   r   __classcell__)r$   s   @r%   r   r      s    	 eKLHOBLJF #$=>IAO>	F     (T

'R.`)r&   r   )rA   loggingdjango.contrib.sites.modelsr   django.core.cacher   django.urlsr   rU   jwt.algorithmsr   r   requests_oauthlibr   confr	   r
   r   r   r   utilsr   	getLoggerrW   r    r&   r%   <module>r      sO      , #  
 '  +  			8	$G)m G)r&   