
    Dsi=                         d dl 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
mZ ddlmZ  e j                  d	      Z e       Z G d
 de      Zy)    N)get_user_model)ModelBackend   )MicrosoftClient)LOGIN_TYPE_XBL)MicrosoftAccountXboxLiveAccount)get_hookdjangoc                   j    e Zd ZdZdZdZddZddZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zy)MicrosoftAuthenticationBackendzAuthentication backend to authenticate a user against their Microsoft
    Uses Microsoft's Graph OAuth and XBL servers to authentiate.Nc                     ddl m} || _        y )Nr   )config)confr   )selfuserr   s      c/var/www/python-projects/worksol/worksolenv/lib/python3.12/site-packages/microsoft_auth/backends.py__init__z'MicrosoftAuthenticationBackend.__init__   s         c                     t        |      | _        d}|N| j                  j                  |      }d|v r.| j                  j                  |d         r| j	                         }|| j                  |       |S )aT  
        Authenticates the user against the Django backend
            using a Microsoft auth code from
        https://login.microsoftonline.com/common/oauth2/v2.0/authorize or
        https://login.live.com/oauth20_authorize.srf

        For more details:
        https://developer.microsoft.com/en-us/graph/docs/get-started/rest
        )requestN)codeaccess_tokenscope)r   	microsoftfetch_tokenvalid_scopes_authenticate_user
_call_hook)r   r   r   r   tokens        r   authenticatez+MicrosoftAuthenticationBackend.authenticate   sv     )9NN..D.9E &4>>+F+FuW~+V..0OOD!r   c                 |    | j                   j                  t        k(  r| j                         S | j	                         S N)r   MICROSOFT_AUTH_LOGIN_TYPEr   _authenticate_xbox_user_authenticate_microsoft_user)r   s    r   r   z1MicrosoftAuthenticationBackend._authenticate_user6   s2    ;;00NB//114466r   c                     | j                   j                         }d|v r+| j                   j                         }| j                  |      S y )NToken)r   fetch_xbox_tokenget_xbox_profile_get_user_from_xbox)r   
xbox_tokenresponses      r   r%   z6MicrosoftAuthenticationBackend._authenticate_xbox_user<   sB    ^^446
j ~~668H++H55r   c                 ^    | j                   j                         }|| j                  |      S y r#   )r   
get_claims_get_user_from_microsoft)r   claimss     r   r&   z;MicrosoftAuthenticationBackend._authenticate_microsoft_userD   s.    **,0088r   c                 
   d}| j                  |      }|m| j                  |       |j                  }| j                  j                  r:|j
                  |j                  k7  r!|j                  |_        |j                          |S zWRetrieves existing Django user or creates
        a new one from Xbox Live profile dataN)_get_xbox_user_verify_xbox_userr   r    MICROSOFT_AUTH_XBL_SYNC_USERNAMEusernamegamertagsave)r   datar   	xbox_users       r   r+   z2MicrosoftAuthenticationBackend._get_user_from_xboxL   sr     ''-	 ""9->>D <<MMY%7%77 ) 2 2		r   c                 P   d }	 t         j                  j                  |d         }|j                  |d   k7  r|d   |_        |j	                          |S # t         j
                  $ r= | j                  j                  r#t        |d   |d         }|j	                          Y |S w xY w)Nxid)xbox_idgtg)r>   r8   )r	   objectsgetr8   r9   DoesNotExistr   MICROSOFT_AUTH_AUTO_CREATE)r   r:   r;   s      r   r4   z-MicrosoftAuthenticationBackend._get_xbox_user`   s    	
	!'//33DK3HI!!T%[0%)%[	"   ++ 	!{{55+DK$u+V	 	!s   AA AB%$B%c                     |j                   >t        |j                        }|j                          ||_         |j                          y y )N)r7   )r   Userr8   r9   )r   r;   r   s      r   r5   z0MicrosoftAuthenticationBackend._verify_xbox_userq   s;    >>!!3!34DIIK!INNN "r   c                 T    d}| j                  |      }|| j                  ||      }|S r3   )_get_microsoft_user_verify_microsoft_user)r   r:   r   microsoft_users       r   r0   z7MicrosoftAuthenticationBackend._get_user_from_microsofty   s6     11$7%..~tDDr   c                     d }	 t         j                  j                  |d         }|S # t         j                  $ r9 | j                  j
                  rt        |d         }|j                          Y |S w xY w)Nsub)microsoft_id)r   r@   rA   rB   r   rC   r9   )r   r:   rI   s      r   rG   z2MicrosoftAuthenticationBackend._get_microsoft_user   sv    	&-5599tE{9SN   ,, 	&{{55!1tE{!K##%	&s   #) AA54A5c                 >   |j                   }||j                  d      }d\  }}|	 |j                  d      \  }}	 t        j
                  j                  |d         }|j                  dk(  r-|j                  dk(  r||_        ||_        |j                          | j                  |      }|]| j                  j                  rd |_         |j                          n/t        j                  dj                  |j                                y ||_         |j                          |S # t        $ r, 	 |j                  dd      \  }}n# t        $ r |}Y nw xY wY w xY w# t        j                  $ r+ t	        |d	   d d
 |||d         }|j                          Y w xY w)Nname) rO   z,  r   email)rQ   rO   preferred_username   )r7   
first_name	last_namerQ   z^User {} already has linked Microsoft account and MICROSOFT_AUTH_AUTO_REPLACE_ACCOUNTS is False)r   rA   split
ValueErrorrE   r@   rT   rU   r9   rB   _get_existing_microsoft_accountr   $MICROSOFT_AUTH_AUTO_REPLACE_ACCOUNTSloggerwarningformatrQ   )r   rI   r:   r   fullnamerT   rU   existing_accounts           r   rH   z5MicrosoftAuthenticationBackend._verify_microsoft_user   s   ""<xx'H$*!J	#.,4NN4,@)Iz||''d7m'<??b(T^^r-A&0DO%.DNIIK  $CCDI+;;CC,0$)$))+NN' !&,  "&N!S " ..08sA0F-
I% .%-
.. $$ !"67=)'w-	 		sG   D& AE &	E0EEEEEEE;FFc                 v    	 t         j                  j                  |      S # t         j                  $ r Y y w xY w)N)r   )r   r@   rA   rB   )r   r   s     r   rX   z>MicrosoftAuthenticationBackend._get_existing_microsoft_account   s9    	#++//T/::,, 		s   " 88c                     t        d      }|Y| j                  j                  t        k(  r ||| j                  j
                         y  ||| j                  j                         y y )N MICROSOFT_AUTH_AUTHENTICATE_HOOK)r
   r   r$   r   r   r,   r    )r   r   functions      r   r   z)MicrosoftAuthenticationBackend._call_hook   sR    >?{{44Ft~~889t~~334	  r   r#   )__name__
__module____qualname____doc__r   r   r   r!   r   r%   r&   r+   r4   r5   r0   rG   rH   rX   r    r   r   r   r      sV    D FI
67("	3j5r   r   )loggingdjango.contrib.authr   django.contrib.auth.backendsr   clientr   r   r   modelsr   r	   utilsr
   	getLoggerrZ   rE   r   rg   r   r   <module>ro      sB     . 5 #   5 			8	$C5\ C5r   