o
    Vh\'                     @  s   d dl mZ d dlZ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mZ er6d dlZd dlmZ eeZG dd	 d	eZejG d
d dZG dd dZG dd dZdS )    )annotationsN)suppress)TYPE_CHECKING)Config)atomic_cached_property)IOc                   @  s   e Zd ZdS )PoetryKeyringErrorN)__name__
__module____qualname__ r   r   q/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/poetry/utils/password_manager.pyr      s    r   c                   @  s6   e Zd ZU ejddZded< ejddZded< dS )HTTPAuthCredentialN)default
str | Noneusernamepassword)r	   r
   r   dataclassesfieldr   __annotations__r   r   r   r   r   r      s   
 r   c                   @  sv   e Zd ZdZd#ddZed$d%ddZddd&ddZd'ddZd(ddZ	d)ddZ
d*ddZeejd+d!d"ZdS ),PoetryKeyring __poetry_source_empty_username__	namespacestrreturnNonec                 C  
   || _ d S N
_namespace)selfr   r   r   r   __init__)      
zPoetryKeyring.__init__Nio	IO | NoneconfigConfig | Nonec                 C  s   |pt  }|drE| r|  r| d d}ttt t	 r$d}W d   n1 s.w   Y  | rG|  rI| | | 
d dS dS dS dS )aS  
        Performs a preflight check to determine the availability of the keyring service
        and logs the status if verbosity is enabled. This method is used to validate
        the configuration setup related to the keyring functionality.

        :param io: An optional input/output handler used to log messages during the
            preflight check. If not provided, logging will be skipped.
        :param config: An optional configuration object. If not provided, a new
            configuration instance will be created using the default factory method.
        :return: None
        keyring.enabledzChecking keyring availability: z&<fg=yellow;options=bold>Unavailable</>z#<fg=green;options=bold>Available</>N )r   createget
is_verbosewriter   RuntimeError
ValueErrorr   is_available
write_line)r#   r%   messager   r   r   preflight_check,   s   



zPoetryKeyring.preflight_checkr   namesr   r   r   c             
   G  s   dd l }ddlm} ddlm} |D ]:}d }z|||}W n! |y-   td| Y n |tfy?   tjd|dd Y nw |rLt|j	|j
d  S qt|d dS )	Nr   )KeyringError)KeyringLockedzKeyring %s is lockedzAccessing keyring %s failedTexc_infor   r   )keyringkeyring.errorsr5   r6   get_credentialloggerdebugr-   r   r   r   )r    r   r4   r:   r5   r6   name
credentialr   r   r   r<   I   s$   
zPoetryKeyring.get_credentialr?   c              
   C  sd   dd l }dd l}| |}z
|||p| jW S  t|jjfy1 } z
td| d| d }~ww )Nr   z$Unable to retrieve the password for z from the key ring )	r:   r;   get_entry_nameget_password_EMPTY_USERNAME_KEYr-   errorsr5   r   )r    r?   r   r:   er   r   r   rB   b   s   
zPoetryKeyring.get_passwordr   c              
   C  sj   dd l }dd l}| |}z|||p| j| W d S  t|jjfy4 } z
td| d| d }~ww )Nr   z!Unable to store the password for z in the key ring: )	r:   r;   rA   set_passwordrC   r-   rD   r5   r   )r    r?   r   r   r:   rE   r   r   r   rF   o   s   
zPoetryKeyring.set_passwordc              	   C  sR   dd l }| |}z|||p| j W d S  t|jjfy(   td| dw )Nr   z"Unable to delete the password for z from the key ring)r;   rA   delete_passwordrC   r-   rD   r5   r   )r    r?   r   r:   r   r   r   rG   |   s   

zPoetryKeyring.delete_passwordc                 C  s   | j  d| S )N-r   )r    r?   r   r   r   rA      s   zPoetryKeyring.get_entry_nameboolc              
     s   t d zdd l}dd l}dd l}W n ty, } zt d| W Y d }~dS d }~ww dd	d
dfdd | }|dkrU|j }t	 fdd|D d }n |r[|nd }|d u rht d dS t d|j
 z	|dd W dS  t|jjfy   t jddd Y dS w )Nz Checking if keyring is availabler   z-An error occurred while importing keyring: %sFbackendkeyring.backend.KeyringBackendr   r   c                 S  s   | j }|dd S )N r   )r?   splitrJ   r?   r   r   r   backend_name   s   z0PoetryKeyring.is_available.<locals>.backend_namerI   c                   sP    | }|dv rt d| jd dS d| j v r&t d| j dS dS )N)chainerfailnullzBackend z is not suitableF	plaintextz$Not using plaintext keyring backend T)r=   r>   r?   lowerrN   )rO   r   r   backend_is_valid   s   z4PoetryKeyring.is_available.<locals>.backend_is_validrP   c                 3  s    | ]	} |r|V  qd S r   r   ).0b)rU   r   r   	<genexpr>   s    z-PoetryKeyring.is_available.<locals>.<genexpr>z"No valid keyring backend was foundzUsing keyring backend zpython-poetry-checkzpython-poetryz2Accessing keyring failed during availability checkTr7   )rJ   rK   r   r   )rJ   rK   r   rI   )r=   r>   r:   keyring.backendr;   ImportErrorget_keyringrJ   get_all_keyringnextr?   rB   r-   rD   r5   )clsr:   rE   rJ   backendsvalid_backendr   )rU   rO   r   r/      s<   



zPoetryKeyring.is_available)r   r   r   r   )NN)r#   r$   r%   r&   r   r   r4   r   r   r   r   r   )r?   r   r   r   r   r   )r?   r   r   r   r   r   r   r   )r?   r   r   r   r   r   )r?   r   r   r   r   rI   )r	   r
   r   rC   r!   staticmethodr2   r<   rB   rF   rG   rA   classmethod	functoolscacher/   r   r   r   r   r   !   s    




r   c                   @  s   e Zd Zd'ddZed(dd	Zed)ddZed*ddZd+ddZ	d,ddZ
d-ddZd.ddZd/ddZd-d d!Zd"d#d0d%d&Zd"S )1PasswordManagerr%   r   r   r   c                 C  r   r   )_config)r    r%   r   r   r   r!      r"   zPasswordManager.__init__rI   c                 C  s   | j do	t S )Nr'   )rh   r*   r   r/   r    r   r   r   use_keyring   s   zPasswordManager.use_keyringr   c                 C  s   | j stdtdS )Nz8Access to keyring was requested, but it is not availablezpoetry-repository)rj   r   r   ri   r   r   r   r:      s
   zPasswordManager.keyringc                   C  s   t d d S )Nz+Using a plaintext file to store credentials)r=   warningr   r   r   r   !warn_plaintext_credentials_stored   s   z1PasswordManager.warn_plaintext_credentials_stored	repo_namer   tokenc                 C  s<   | j s|   | jjd| | d S | j|d| d S Npypi-token.	__token__)rj   rl   rh   auth_config_sourceadd_propertyr:   rF   r    rm   rn   r   r   r   set_pypi_token   s   
zPasswordManager.set_pypi_tokenr   c                 C  s2   | j d| }|r|S | jr| j|dS dS )a  Get PyPi token.

        First checks the environment variables for a token,
        then the configured username/password and the
        available keyring.

        :param repo_name:  Name of repository.
        :return: Returns a token as a string if found, otherwise None.
        rp   rq   N)rh   r*   rj   r:   rB   rt   r   r   r   get_pypi_token   s   
zPasswordManager.get_pypi_tokenc                 C  s,   | j s| jjd| S | j|d d S ro   )rj   rh   rr   remove_propertyr:   rG   )r    rm   r   r   r   delete_pypi_token   s
   z!PasswordManager.delete_pypi_tokenr   c                 C  sX   | j d| d}| j d| d}|d u r"| jr"| j||}t|p&d |p)d dS )Nhttp-basic.z	.usernamez	.passwordr9   )rh   r*   rj   r:   rB   r   )r    rm   r   r   r   r   r   get_http_auth   s
   zPasswordManager.get_http_authr   r   c                 C  sJ   d|i}| j s|   ||d< n| j||| | jjd| | d S )Nr   r   ry   )rj   rl   r:   rF   rh   rr   rs   )r    rm   r   r   authr   r   r   set_http_password  s   
z!PasswordManager.set_http_passwordc                 C  sh   |  |}|jd u rd S tt | j||j W d    n1 s#w   Y  | jjd|  d S )Nry   )	rz   r   r   r   r:   rG   rh   rr   rw   )r    rm   r{   r   r   r   delete_http_password  s   


z$PasswordManager.delete_http_passwordNr3   r4   c                G  s$   | j r| jj|d|iS t|d dS )Nr   r9   )rj   r:   r<   r   )r    r   r4   r   r   r   r<     s   zPasswordManager.get_credential)r%   r   r   r   rb   )r   r   )r   r   )rm   r   rn   r   r   r   )rm   r   r   r   )rm   r   r   r   )rm   r   r   r   )rm   r   r   r   r   r   r   r   ra   )r	   r
   r   r!   r   rj   r:   rc   rl   ru   rv   rx   rz   r|   r}   r<   r   r   r   r   rg      s     


	




rg   )
__future__r   r   re   logging
contextlibr   typingr   poetry.config.configr   poetry.utils.threadingr   rY   r:   
cleo.io.ior   	getLoggerr	   r=   	Exceptionr   	dataclassr   r   rg   r   r   r   r   <module>   s$    
 