o
    ‹¨Êh&  ã                   @   sš   d dl mZ d dl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mZmZ G dd„ deƒZG d	d
„ d
eƒZG dd„ deeƒZdS )é    )Úwith_statementN)Úconfigparser)Ú
properties)Úescape)ÚKeyringÚdecodebytesÚencodebytesc                   @   s6   e Zd ZdZdZ	 dZdZdZddd„Zdd	d
„Z	dS )ÚPlaintextKeyringz&Simple File Keyring with no encryptiong      à?zkeyring_pass.cfgzno encyptionú1.0Nc                 C   ó   |S )zEDirectly return the password itself, ignore associated data.
        © )ÚselfÚpasswordÚassocr   r   úC/var/www/html/env/lib/python3.10/site-packages/keyrings/alt/file.pyÚencrypt   ó   zPlaintextKeyring.encryptc                 C   r   )zDDirectly return encrypted password, ignore associated data.
        r   )r   Úpassword_encryptedr   r   r   r   Údecrypt!   r   zPlaintextKeyring.decrypt©N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpriorityÚfilenameÚschemeÚversionr   r   r   r   r   r   r	      s    
r	   c                   @   s,   e Zd ZdZdZdZdZdd„ Zdd„ Zd	S )
Ú	Encryptedz,
    PyCrypto-backed Encryption support
    z[PBKDF2] AES256.CFBr
   é    c                 C   sB   ddl m} ddlm} |||| jd�}| |d| j… |j|¡S )zK
        Create the cipher object to encrypt or decrypt a payload.
        r   )ÚPBKDF2©ÚAES)ÚdkLenN)ÚCrypto.Protocol.KDFr    ÚCrypto.Cipherr"   Ú
block_sizeÚnewÚMODE_CFB)r   r   ÚsaltÚIVr    r"   Úpwr   r   r   Ú_create_cipher/   s   zEncrypted._create_cipherc                 C   sJ   	 t   d¡}t   d¡}||krtj d¡ q d| ¡ kr#tj d¡ q |S )NTz,Please set a password for your new keyring: zPlease confirm the password: z#Error: Your passwords didn't match
Ú z'Error: blank passwords aren't allowed.
)ÚgetpassÚsysÚstderrÚwriteÚstrip)r   r   Úconfirmr   r   r   Ú_get_new_password8   s   ÿ
zEncrypted._get_new_passwordN)	r   r   r   r   r   r   r&   r,   r4   r   r   r   r   r   '   s    	r   c                   @   sŠ   e Zd ZdZdZd ¡ Zeje	dd„ ƒƒZ
ejdd„ ƒZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zddd„Zddd„ZdS )ÚEncryptedKeyringzPyCrypto File Keyringzcrypted_pass.cfgzpw:c                 C   sD   zt dƒ t dƒ t dƒ W n ty   tdƒ‚w ts tdƒ‚dS )z2Applicable for all platforms, but not recommended.zCrypto.Cipher.AESzCrypto.Protocol.KDFzCrypto.RandomzPyCrypto requiredz0JSON implementation such as simplejson required.g333333ã?)Ú
__import__ÚImportErrorÚRuntimeErrorÚjson©r   r   r   r   r   M   s   ÿÿzEncryptedKeyring.priorityc                 C   s$   |   ¡ r|  ¡  | jS |  ¡  | jS r   )Ú_check_fileÚ_unlockÚ
_init_fileÚkeyring_keyr:   r   r   r   r>   \   s
   ÿzEncryptedKeyring.keyring_keyc                 C   s<   |   ¡ | _|  ddd¡ |  dd| j¡ |  dd| j¡ dS )zP
        Initialize a new password file and set the reference password.
        úkeyring-settingúpassword referenceúpassword reference valuer   r   N)r4   r>   Úset_passwordÚ_write_config_valuer   r   r:   r   r   r   r=   e   s   
þþþzEncryptedKeyring._init_filec              	   C   s’   t j | j¡s	dS |  ¡  t ¡ }| | j¡ z| t	dƒt	dƒ¡ W n tj
tjfy1   Y dS w z|  |¡ W n
 tyC   Y dS w |  |¡S )zS
        Check if the file exists and has the expected password reference.
        Fr?   r@   T)ÚosÚpathÚexistsÚ	file_pathÚ_migrater   ÚRawConfigParserÚreadÚgetÚescape_for_iniÚNoSectionErrorÚNoOptionErrorÚ_check_schemeÚAttributeErrorÚ_check_version©r   Úconfigr   r   r   r;   v   s&   þÿþ
zEncryptedKeyring._check_filec              	   C   sn   z|  tdƒtdƒ¡}W n tjtjfy   tdƒ‚w | d¡r'|dd… }|| jkr5td| j|f ƒ‚dS )zv
        check for a valid scheme

        raise ValueError otherwise
        raise AttributeError if missing
        r?   r   zEncryption scheme missingz	PyCrypto é	   Nz0Encryption scheme mismatch (exp.: %s, found: %s))	rK   rL   r   rM   rN   rP   Ú
startswithr   Ú
ValueError)r   rS   r   r   r   r   rO   �   s   þÿ

ÿÿzEncryptedKeyring._check_schemec              	   C   s:   z|  tdƒtdƒ¡| _W dS  tjtjfy   Y dS w )z©
        check for a valid version
        an existing scheme implies an existing version as well

        return True, if version is valid, and False otherwise
        r?   r   FT)rK   rL   Úfile_versionr   rM   rN   rR   r   r   r   rQ   ¤   s   þþÿzEncryptedKeyring._check_versionc                 C   sJ   t   d¡| _z|  dd¡}|dksJ ‚W dS  ty$   |  ¡  tdƒ‚w )zd
        Unlock this keyring by getting the password for the keyring from the
        user.
        z-Please enter password for encrypted keyring: r?   r@   rA   zIncorrect PasswordN)r.   r>   Úget_passwordÚAssertionErrorÚ_lockrV   )r   Úref_pwr   r   r   r<   ´   s   ÿþzEncryptedKeyring._unlockc                 C   s   | ` dS )z<
        Remove the keyring key from this instance.
        N)r>   r:   r   r   r   rZ   Â   s   zEncryptedKeyring._lockNc                 C   sŽ   ddl m} || jƒ}ddlm} ||jƒ}|  | j||¡}| | j| ¡}t	|||d�}	|	D ]}
t
|	|
 ƒ ¡ d d… |	|
< q/t |	¡ ¡ S )Nr   )Úget_random_bytesr!   )r)   r*   r   éÿÿÿÿ)ÚCrypto.Randomr\   r&   r%   r"   r,   r>   r   Ú	pw_prefixÚdictr   Údecoder9   ÚdumpsÚencode)r   r   r   r\   r)   r"   r*   Úcipherr   ÚdataÚkeyr   r   r   r   È   s   

ÿzEncryptedKeyring.encryptc                 C   sn   t  | ¡ ¡}|D ]}t||  ¡ ƒ||< q	|  | j|d |d ¡}| |d ¡}| | j	¡s1J ‚|dd … S )Nr)   r*   r   é   )
r9   Úloadsra   r   rc   r,   r>   r   rU   r_   )r   r   r   re   rf   rd   Ú	plaintextr   r   r   r   Ù   s   ÿzEncryptedKeyring.decryptc                 C   s   dS )z?
        Convert older keyrings to the current format.
        Nr   )r   Úkeyring_passwordr   r   r   rH   ä   s    zEncryptedKeyring._migrater   )r   r   r   r   r   rc   r_   r   ÚClassPropertyÚclassmethodr   ÚNonDataPropertyr>   r=   r;   rO   rQ   r<   rZ   r   r   rH   r   r   r   r   r5   G   s$    


r5   )Ú
__future__r   rD   r/   r9   r.   Ú	six.movesr   Úkeyring.utilr   Úkeyring.util.escaper   rL   Úkeyrings.alt.file_baser   r   r   r	   Úobjectr   r5   r   r   r   r   Ú<module>   s     