o
    l>j                     @   s   d dl 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m	Z	m
Z
 ddlmZ G dd deZG dd	 d	ZG d
d deeZdS )    N)
properties)Keyringdecodebytesencodebytes   )escapec                   @   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 )z<Directly return the password itself, ignore associated data. )selfpasswordassocr   r   F/home/thesage/.local/lib/python3.10/site-packages/keyrings/alt/file.pyencrypt      zPlaintextKeyring.encryptc                 C   r
   )z;Directly 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edd Z	d	d
 Z
dd ZdS )	Encryptedz0
    PyCryptodome-backed Encryption support
    z[PBKDF2] AES256.CFBr	       c                 C   s   t | |   d S r   )varsupdate_get_crypto_implr   r   r   r   __init__*   s   zEncrypted.__init__c                  C   sh   zdd l m}  ddlm} ddlm} W t
 S  ty3   dd lm}  ddlm} ddl	m} Y t
 S w )Nr   )AES)KDF)Cryptodome.RandomRandomCryptodome.Cipherr$   Cryptodome.Protocolr%   ImportErrorCrypto.RandomCrypto.CipherCrypto.Protocollocals)r'   r$   r%   r   r   r   r!   -   s   zEncrypted._get_crypto_implc                 C   s2   | j j||| jd}| j|d| j | jj|S )zK
        Create the cipher object to encrypt or decrypt a payload.
        )dkLenN)r%   PBKDF2
block_sizer$   newMODE_CFB)r   r   saltIVpwr   r   r   _create_cipher9   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_password@   s   

zEncrypted._get_new_passwordN)r   r   r   r   r   r   r1   r#   staticmethodr!   r7   r?   r   r   r   r   r   !   s    
r   c                   @   s   e Zd ZdZdZdZej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PyCryptodome File Keyringzcrypted_pass.cfgs   pw:c                 C   s4   z|    W n ty   tdw tstddS )z2Applicable for all platforms, but not recommended.zpycryptodome/x requiredz0JSON implementation such as simplejson required.g333333?)r!   r*   RuntimeErrorjson)clsr   r   r   r   T   s   zEncryptedKeyring.priorityc                 C   s$   |   r|   | jS |   | jS r   )_check_file_unlock
_init_filekeyring_keyr"   r   r   r   rH   _   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)r?   rH   set_password_write_config_valuer   r   r"   r   r   r   rG   h   s   
zEncryptedKeyring._init_filec              	   C   s   t j| js	dS |   t }|j| jdd z|t	dt	d W n tj
tjfy3   Y dS w z| | W n
 tyE   Y dS w | |S )zS
        Check if the file exists and has the expected password reference.
        Fzutf-8)encodingrI   rJ   T)ospathexists	file_path_migrateconfigparserRawConfigParserreadgetescape_for_iniNoSectionErrorNoOptionError_check_schemeAttributeError_check_versionr   configr   r   r   rE   u   s$   
zEncryptedKeyring._check_filec              	   C   st   z| tdtd}W n tjtjfy   tdw |dr'|dd }|| jkr8td| j d| d	dS )
zv
        check for a valid scheme

        raise ValueError otherwise
        raise AttributeError if missing
        rI   r   zEncryption scheme missingz	PyCrypto 	   Nz"Encryption scheme mismatch (exp.: z	, found: ))	rW   rX   rT   rY   rZ   r\   
startswithr   
ValueError)r   r_   r   r   r   r   r[      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
        rI   r   FT)rW   rX   file_versionrT   rY   rZ   r^   r   r   r   r]      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: rI   rJ   rK   zIncorrect PasswordN)r9   rH   get_passwordAssertionError_lockrc   )r   ref_pwr   r   r   rF      s   zEncryptedKeyring._unlockc                 C   s   | ` dS )z<
        Remove the keyring key from this instance.
        N)rH   r"   r   r   r   rg      s   zEncryptedKeyring._lockNc           	      C   s   | j | j}| j | jj}| | j||}|| j| }t|||d}|D ]}t	|| 
 d d ||< q(t| S )N)r4   r5   r   )r'   get_random_bytesr1   r$   r7   rH   r   	pw_prefixdictr   decoderC   dumpsencode)	r   r   r   r4   r5   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 )Nr4   r5   r      )
rC   loadsrm   r   ro   r7   rH   r   rb   rk   )r   r   r   rq   rr   rp   	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   rS      s    zEncryptedKeyring._migrater   )r   r   r   r   r   rk   r   classpropertyr   NonDataPropertyrH   rG   rE   r[   r]   rF   rg   r   r   rS   r   r   r   r   rA   N   s"    





rA   )rT   r9   rC   rO   r:   jaraco.classesr   keyrings.alt.file_baser   r   r   r   rX   r   r   rA   r   r   r   r   <module>   s    -