
    :j                         d Z ddlZddlmZmZ ddlmZ  G d de      Zdefd	Zd
eg ee	   f   deg ee	   f   deg e	f   fdZ
y)z
Core Authentication Services

This module provides a centralized GitHub authentication service that can be configured
by upper layers and used by lower layers without creating circular dependencies.
    N)CallableOptional   )IAuthProviderc            	       l   e Zd ZU dZdZed    ed<    ej                         Z	dZ
eeg ee   f      ed<   dZeeg ee   f      ed<   dZeeg ef      ed<   d Zedd	       Zedd
       Zedeg ee   f   deg ee   f   deg ef   fd       Zdee   fdZdee   fdZddedeeef   fdZdefdZy)GithubAuthProviderzDCentralized GitHub authentication service with dependency injection.N	_instance_session_provider_token_provider_user_agent_providerc                      y)z(Initialize with default implementations.N selfs    0/root/.openclaw/workspace/harvester/core/auth.py__init__zGithubAuthProvider.__init__   s        returnc                     | j                   9| j                  5  | j                    |        | _         ddd       | j                   S | j                   S # 1 sw Y   | j                   S xY w)z#Get thread-safe singleton instance.N)r	   _lockclss    r   get_instancezGithubAuthProvider.get_instance   sY     ==  *==($'ECM* }}s}}* }}s   AA&c                 T    | j                   5  d| _        ddd       y# 1 sw Y   yxY w)z.Reset singleton instance (mainly for testing).N)r   r	   r   s    r   reset_instancez!GithubAuthProvider.reset_instance&   s'     YY 	! CM	! 	! 	!s   'session_providertoken_provideruser_agent_providerc                 N    | j                         }|| _        || _        || _        y)zConfigure authentication providers.

        Args:
            session_provider: Function to get GitHub session token
            token_provider: Function to get GitHub API token
            user_agent_provider: Function to get User-Agent string
        N)r   r
   r   r   )r   r   r   r   _s        r   	configurezGithubAuthProvider.configure,   s*      0,#6 r   c                     | j                   j                  r	 | j                   j                         S y# t        $ r Y yw xY w)zGet GitHub web session token.N)	__class__r
   	Exceptionr   s    r   get_sessionzGithubAuthProvider.get_session?   s@    >>++~~7799      3 	??c                     | j                   j                  r	 | j                   j                         S y# t        $ r Y yw xY w)zGet GitHub API token.N)r#   r   r$   r   s    r   	get_tokenzGithubAuthProvider.get_tokenH   s@    >>))~~5577   r&   prefer_tokenc                     |r,| j                         }|r|dfS | j                         }|r0|dfS | j                         }|r|dfS | j                         }|r|dfS t        d      )a   Get next credential with type preference.

        Args:
            prefer_token: Whether to prefer API tokens over sessions

        Returns:
            tuple[str, str]: (credential_value, credential_type)

        Raises:
            RuntimeError: If no credentials available
        tokensessionzNo credentials available)r(   r%   RuntimeError)r   r)   r+   r,   s       r   get_credentialz!GithubAuthProvider.get_credentialQ   s     NN$Ew''&&(G++&&(G++NN$Ew''566r   c                     | j                   j                  r	 | j                   j                         S y# t        $ r Y yw xY w)zGet User-Agent string.zDefaultUserAgent/1.0)r#   r   r$   r   s    r   get_user_agentz!GithubAuthProvider.get_user_agentn   sC    >>..~~::<< &  %r&   )r   r   )r   N)T)__name__
__module____qualname____doc__r	   r   __annotations__	threadingLockr   r
   r   strr   r   r   classmethodr   r   r!   r%   r(   booltupler.   r0   r   r   r   r   r      s@   N04Ix,-4INNE?CxXc]): ;<C=AOXhr8C='89:A8<(8BG#45<   ! !
 7"2x}#457 !Xc]!237 &b#g.	7 7$Xc] 8C= 74 75c? 7:& &r   r   r   c                  *    t         j                         S )z$Get the core auth provider instance.)r   r   r   r   r   get_auth_providerr=   y   s    **,,r   r   r   r   c                 2    t         j                  | ||       y)zxConfigure the global authentication service.

    This should be called by the manager layer during initialization.
    N)r   r!   )r   r   r   s      r   configure_authr?   ~   s       !1>CVWr   )r4   r6   typingr   r   typesr   r   r=   r8   r?   r   r   r   <module>rB      sx     %  e& e&R-= -
	Xr8C=01	XR#./	X ""c'*	Xr   