o
    RDi"                     @  sr   d Z ddlmZ ddlZddlZddlZddlmZ eddZ	eddZ
G d	d
 d
eZG dd dejZdS )zThe secret detector detects sensitive information.

It masks secrets that might be leaked from two potential avenues
    1. Out of Band Telemetry
    2. Logging
    )annotationsN)
NamedTupleMIN_TOKEN_LEN    MIN_PWD_LEN   c                   @  s2   e Zd ZU dZded< dZded< dZded< dS )MaskedMessageDataFbool	is_maskedNz
str | Nonemasked_text	error_str)__name__
__module____qualname__r
   __annotations__r   r    r   r   \/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/secret_detector.pyr      s   
 r   c                      s  e Zd ZejdejdZejdejdZejdejdZejdej	ejB dZ
ejdej	ejB dZejdejdZejdejdZd	Zed&ddZed&ddZed&ddZed&ddZed&ddZed&ddZed&ddZed'ddZed(d!d"Zd) fd$d%Z  ZS )*SecretDetectorzK(aws_key_id|aws_secret_key|access_key_id|secret_access_key)\s*=\s*'([^']+)')flagszB(accessToken|tempToken|keySecret)"\s*:\s*"([a-z0-9/+]{32,}={0,2})"zM(sig|signature|AWSAccessKeyId|password|passcode)=(?P<secret>[a-z0-9%/+]{16,})zP-{3,}BEGIN [A-Z ]*PRIVATE KEY-{3,}\n([\s\S]*?)\n-{3,}END [A-Z ]*PRIVATE KEY-{3,}z)"privateKeyData": "([a-z0-9/+=\\n]{10,})"z=(token|assertion content)([\'\"\s:=]+)([a-z0-9=/_\-\+\.]{8,})z[(password|pwd)([\'\"\s:=]+)([a-z0-9!\"#\$%&\\\'\(\)\*\+\,-\./:;<=>\?\@\[\]\^_`\{\|\}~]{1,})z****textstrreturnc                 C     t jdt j  | S Nz\1\2)r   CONNECTION_TOKEN_PATTERNsubSECRET_STARRED_MASK_STRr   r   r   r   mask_connection_token<      z$SecretDetector.mask_connection_tokenc                 C  r   r   )r   PASSWORD_PATTERNr   r   r   r   r   r   mask_passwordB   r   zSecretDetector.mask_passwordc                 C  s   t jddt j d | S )N\1=')r   AWS_KEY_PATTERNr   r   r   r   r   r   mask_aws_keysH   s   zSecretDetector.mask_aws_keysc                 C  r   )Nr"   )r   SAS_TOKEN_PATTERNr   r   r   r   r   r   mask_sas_tokensN   r   zSecretDetector.mask_sas_tokensc                 C     t jd| S )Nz
\1":"XXXX")r   AWS_TOKEN_PATTERNr   r   r   r   r   mask_aws_tokensT   s   zSecretDetector.mask_aws_tokensc                 C  r(   )Nz>-----BEGIN PRIVATE KEY-----\\nXXXX\\n-----END PRIVATE KEY-----)r   PRIVATE_KEY_PATTERNr   r   r   r   r   mask_private_keyX      zSecretDetector.mask_private_keyc                 C  r(   )Nz"privateKeyData": "XXXX")r   PRIVATE_KEY_DATA_PATTERNr   r   r   r   r   mask_private_key_data^   r-   z$SecretDetector.mask_private_key_datar   c                 C  s   | du rt  S d}d}zttttttt| }|| kr)d}W n t	yF } zd}t
|}t
|}W Y d}~nd}~ww t |||S )zMasks any secrets. This is the method that should be used by outside classes.

        Args:
            text: A string which may contain a secret.

        Returns:
            The masked string data in MaskedMessageData.
        NFT)r   r   r   r!   r/   r,   r*   r'   r%   	Exceptionr   )r   maskederr_strr   exr   r   r   mask_secretsd   s8   
zSecretDetector.mask_secretsoriginal_recordlogging.LogRecorderror_messagec                 C  s   d | j| jdd| j|S )Nz{} - {} {} - {} - {} - {}zsecret_detector.pysanitize_log_str)formatasctime
threadName	levelname)r5   r7   r   r   r   create_formatting_error_log   s   z*SecretDetector.create_formatting_error_logrecordc              
     s   z't  |}t|\}}}|pd}|r"|dur%| ||}W |S W |S W |S  tyD } z| |dt| }W Y d}~|S d}~ww )a  Wrapper around logging module's formatter.

        This will ensure that the formatted message is free from sensitive credentials.

        Args:
            record: The logging record.

        Returns:
            Formatted desensitized log string.
         NzEXCEPTION - )superr9   r   r4   r=   r0   r   )selfr>   unsanitized_logr1   optional_sanitized_logr2   sanitized_logr3   	__class__r   r   r9      s(   
zSecretDetector.format)r   r   r   r   )r   r   r   r   )r5   r6   r7   r   r   r   )r>   r6   r   r   )r   r   r   recompile
IGNORECASEr$   r)   r&   	MULTILINEr+   r.   r   r    r   staticmethodr   r!   r%   r'   r*   r,   r/   r4   r=   r9   __classcell__r   r   rE   r   r      s`    
(r   )__doc__
__future__r   loggingosrG   typingr   getenvr   r   r   	Formatterr   r   r   r   r   <module>   s   