
    i                         S r SSKrSSKrSSKJr  SSKJr  SSK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
KJr   " S S\5      r " S S5      rg)zV
Device Code Flow implementation for OAuth 2.0 device authorization grant (RFC 8628).
    N)Dict)Optional)	BaseModel)
BaseClient)AnacondaAuthSite)DeviceFlowDenied)DeviceFlowError)DeviceFlowTimeoutc                   Z    \ rS rSr% \\S'   \\S'   \\S'   \\S'   Sr\\S'   Sr\\S	'   S
r	g)DeviceAuthorizationResponse   device_code	user_codeverification_uriverification_uri_complete<   
expires_in   interval N)
__name__
__module____qualname____firstlineno__str__annotations__r   intr   __static_attributes__r       9lib/python3.13/site-packages/anaconda_auth/device_flow.pyr   r      s-    N""JHcr   r   c                       \ rS rSr% Sr\\S'   \\   \S'   S\4S jr	S\4S jr
S\\\4   4S jrS\\\4   4S	 jrS
rg)DeviceCodeFlow   z
OAuth 2.0 Device Code Flow implementation.

This implements RFC 8628 for devices that are either browserless
or have limited input capabilities.
configauthorize_responsec                 :    Xl         [        US9U l        SU l        g)zN
Initialize device code flow.

Args:
    config: Configuration for the client
)siteN)r$   r   clientr%   )selfr$   s     r    __init__DeviceCodeFlow.__init__(   s      f- #'r   returnc                 0   U R                   R                  SS.nU R                   R                  R                  c  [	        S5      e U R
                  R                  U R                   R                  R                  UU R                   R                  SS0S9nUR                  5         UR                  5       n[        S
0 UD6U l        U R                  $ ! [        R                   a  n[	        SU 35      eSnAf[         a  n[	        S	U 35      eSnAff = f)zp
Initiate device authorization request.

Returns:
    Tuple of (user_code, verification_uri) to display to user
openid)	client_idscopeNz,Server does not support device authorizationContent-Type!application/x-www-form-urlencodeddataverifyheadersz%Device authorization request failed: z$Missing required field in response: r   )r$   r/   oidcdevice_authorization_endpointr	   r(   post
ssl_verifyraise_for_statusjsonr   r%   requestsRequestExceptionKeyError)r)   r4   responseauth_responsees        r    initiate_device_authorization,DeviceCodeFlow.initiate_device_authorization5   s    "[[22XF;;99A!"PQQ	N{{''  >>{{--')LM	 ( H %%'$MMOM&A&RM&RD#***(( 	O!$I!"MNN 	N!$H"LMM	Ns%   BC D'C55DDDc                    U R                   (       d  [        S5      e[        R                  " 5       nU R                   R                  nU R                   R                  n[        R                  " 5       U-
  U:  a   U R                  5       nU$ [        S5      e! [         a    e [         a    e [         a  nS[        U5      R                  5       ;   a  [        R                  " U5         SnAM  S[        U5      R                  5       ;   a+  [        US-   S5      n[        R                  " U5         SnAM  e SnAff = f)zu
Poll the token endpoint until authorization is complete.

Returns:
    Token response containing access_token, etc.
-Must call initiate_device_authorization firstauthorization_pendingN	slow_downr      zDevice authorization timed out)r%   r	   timer   r   _request_tokenr
   r   r   lowersleepmin)r)   
start_timer   r   token_responserB   s         r    poll_for_tokenDeviceCodeFlow.poll_for_tokenU   s     &&!"QRRYY[
,,77
**33iikJ&3!%!4!4!6%%&   @AA# % # " *c!flln<JJx( CFLLN2"8a<4HJJx(s%   ;B D=63D8/AD87D88D=c                    U R                   (       d  [        S5      eSU R                   R                  U R                  R                  S.nU R
                  R                  U R                  R                  R                  UU R                  R                  SS0S9nUR                  S:X  a  UR                  5       $  UR                  5       nUR                  SS	5      nUR                  S
S5      nUS:X  a  [        S5      eUS:X  a  [        S5      eUS:X  a  [        S5      eUS:X  a  [        S5      e[        SU SU 35      e! [        R                   a    UR!                  5          Of = f[        S5      e)zMake a single token request.rF   z,urn:ietf:params:oauth:grant-type:device_code)
grant_typer   r/   r1   r2   r3      errorunknown_errorerror_description rG   rH   expired_tokenzDevice code expiredaccess_deniedzUser denied authorizationzToken request failed: z - zToken request failed)r%   r	   r   r$   r/   r(   r9   r7   token_endpointr:   status_coder<   getr
   r   JSONDecodeErrorr;   )r)   r4   r@   
error_data
error_coderX   s         r    rK   DeviceCodeFlow._request_token{   su   &&!"QRR I22>>..
 ;;##KK++;;))#%HI	 $ 
 3&==?"	(!J#AJ */BB G44%&=>>{*%k22.'(=>>.&'BCC%,ZL<M;NO  ## 	(%%'	( 455s   <B	E $E,+E,)r%   r(   r$   N)r   r   r   r   __doc__r   r   r   r   r*   rC   r   r   rQ   rK   r   r   r   r    r"   r"      sc      !<=='/ 'N/J N@$BS#X $BL+6S#X +6r   r"   )rc   r<   rJ   typingr   r   r=   pydanticr   anaconda_auth.clientr   anaconda_auth.configr   anaconda_auth.exceptionsr   r	   r
   r   r"   r   r   r    <module>ri      sE          + 1 5 4 6) I6 I6r   