
    Dj                         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e          Z G d d	          Z G d
 dee          ZdS )    N)
properties)Keyringdecodebytesencodebytes   )escapec                   4    e Zd ZdZdZ	 dZdZdZd	dZd	dZ	dS )
PlaintextKeyringz&Simple File Keyring with no encryptiong      ?zkeyring_pass.cfgzno encyption1.0Nc                     |S )z<Directly return the password itself, ignore associated data. )selfpasswordassocs      L/home/thesage/.hermes/venv/lib/python3.11/site-packages/keyrings/alt/file.pyencryptzPlaintextKeyring.encrypt   s        c                     |S )z;Directly return encrypted password, ignore associated data.r   )r   password_encryptedr   s      r   decryptzPlaintextKeyring.decrypt   s    !!r   N)
__name__
__module____qualname____doc__priorityfilenameschemeversionr   r   r   r   r   r
   r
      sY        00H7!HFG   " " " " " "r   r
   c                   F    e Zd ZdZdZdZdZd Zed             Z	d Z
d Zd	S )
	Encryptedz0
    PyCryptodome-backed Encryption support
    z[PBKDF2] AES256.CFBr       c                 n    t          |                               |                                            d S r   )varsupdate_get_crypto_implr   s    r   __init__zEncrypted.__init__*   s.    T

$//1122222r   c                      	 dd l m}  ddlm} ddlm} n"# t          $ r dd lm}  ddlm} ddl	m} Y nw xY wt                      S )Nr   )AES)KDF)Cryptodome.RandomRandomCryptodome.Cipherr*   Cryptodome.Protocolr+   ImportErrorCrypto.RandomCrypto.CipherCrypto.Protocollocals)r-   r*   r+   s      r   r&   zEncrypted._get_crypto_impl-   s    	,......------/////// 	, 	, 	,******))))))++++++++	, xxs    44c                     | j                             ||| j                  }| 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pws        r   _create_cipherzEncrypted._create_cipher9   sI     X__Xt4?_CCx||B001483DbIIIr   c                    	 t          j         d          }t          j         d          }||k    r t          j                            d           Od|                                k    r t          j                            d           |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   confirms      r   _get_new_passwordzEncrypted._get_new_password@   s    
	'UVVHo&EFFG7""
  !GHHHX^^%%%%
  !KLLLOr   N)r   r   r   r   r   r   r8   r(   staticmethodr&   r>   rG   r   r   r   r!   r!   !   sz          #FGJ3 3 3 	 	 \	J J J    r   r!   c                       e Zd ZdZdZdZej        d             Zej	        d             Z
d Zd Zd Zd	 Zd
 Zd ZddZddZddZdS )EncryptedKeyringzPyCryptodome File Keyringzcrypted_pass.cfgs   pw:c                     	 |                                   n# t          $ r t          d          w xY 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&   r0   RuntimeErrorjson)clss    r   r   zEncryptedKeyring.priorityT   sc    	:  """" 	: 	: 	:8999	: 	SQRRRss    1c                     |                                  r|                                  n|                                  | j        S r   )_check_file_unlock
_init_filekeyring_keyr'   s    r   rS   zEncryptedKeyring.keyring_key_   s@      	LLNNNNOOr   c                     |                                  | _        |                     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)rG   rS   set_password_write_config_valuer   r   r'   s    r   rR   zEncryptedKeyring._init_fileh   sy      1133 	35O	
 	
 	
 	  !2HdkJJJ  !2It|LLLLLr   c                    t           j                            | j                  sdS |                                  t          j                    }|                    | j        d           	 |                    t          d          t          d                     n"# t
          j
        t
          j        f$ r Y dS w xY w	 |                     |           n# t          $ r Y dS w xY w|                     |          S )zS
        Check if the file exists and has the expected password reference.
        Fzutf-8)encodingrU   rV   T)ospathexists	file_path_migrateconfigparserRawConfigParserreadgetescape_for_iniNoSectionErrorNoOptionError_check_schemeAttributeError_check_versionr   configs     r   rP   zEncryptedKeyring._check_fileu   s    w~~dn-- 	5-//DNW555	JJ011>BV3W3W    +\-GH 	 	 	55		v&&&& 	 	 	44	 ""6***s$   +0B B;:B;?C 
C#"C#c                 P   	 |                     t          d          t          d                    }n.# t          j        t          j        f$ r t          d          w xY w|                    d          r
|dd         }|| j        k    rt          d| j         d| d	          dS )
zv
        check for a valid scheme

        raise ValueError otherwise
        raise AttributeError if missing
        rU   r   zEncryption scheme missingz	PyCrypto 	   Nz"Encryption scheme mismatch (exp.: z	, found: ))	rd   re   ra   rf   rg   ri   
startswithr   
ValueError)r   rl   r   s      r   rh   zEncryptedKeyring._check_scheme   s    	>ZZ011>(3K3K FF +\-GH 	> 	> 	> !<===	> [)) 	 ABBZFT[  WWWfWWW   ! s	   03 +Ac                     	 |                     t          d          t          d                    | _        n"# t          j        t          j        f$ r Y dS w xY wdS )z
        check for a valid version
        an existing scheme implies an existing version as well

        return True, if version is valid, and False otherwise
        rU   r   FT)rd   re   file_versionra   rf   rg   rk   s     r   rj   zEncryptedKeyring._check_version   sj    	 &

011>)3L3L! !D +\-GH 	 	 	55	ts   58 AAc                     t          j         d          | _        	 |                     dd          }|dk    sJ dS # t          $ r$ |                                  t          d          w xY w)zd
        Unlock this keyring by getting the password for the keyring from the
        user.
        z-Please enter password for encrypted keyring: rU   rV   rW   zIncorrect PasswordN)rA   rS   get_passwordAssertionError_lockrq   )r   ref_pws     r   rQ   zEncryptedKeyring._unlock   s    
 #?;
 
	3&&'8:NOOF7777777 	3 	3 	3JJLLL1222	3s	   ; .A)c                 
    | ` dS )z<
        Remove the keyring key from this instance.
        N)rS   r'   s    r   rw   zEncryptedKeyring._lock   s     r   Nc                    | j                             | j                  }| j                             | j        j                  }|                     | j        ||          }|                    | j        |z             }t          |||          }|D ]4}t          ||                   
                                d d         ||<   5t          j        |                                          S )N)r;   r<   r   )r-   get_random_bytesr8   r*   r>   rS   r   	pw_prefixdictr   decoderM   dumpsencode)	r   r   r   r;   r<   cipherr   datakeys	            r   r   zEncryptedKeyring.encrypt   s    {++DO<<[))$(*=>>$$T%5tR@@#^^DNX,EFF"9KLLL 	= 	=C#DI..5577<DIIz$&&(((r   c                 ~   t          j        |                                          }|D ],}t          ||                                                   ||<   -|                     | j        |d         |d                   }|                    |d                   }|                    | j	                  sJ |dd          S )Nr;   r<   r      )
rM   loadsr   r   r   r>   rS   r   rp   r}   )r   r   r   r   r   r   	plaintexts          r   r   zEncryptedKeyring.decrypt   s    z,335566 	8 	8C#DI$4$4$6$677DII$$T%5tF|T$ZPPNN4(<#=>>	##DN33333}r   c                     dS )z?
        Convert older keyrings to the current format.
        Nr   )r   keyring_passwords     r   r`   zEncryptedKeyring._migrate   s      r   r   )r   r   r   r   r   r}   r   classpropertyr   NonDataPropertyrS   rR   rP   rh   rj   rQ   rw   r   r   r`   r   r   r   rJ   rJ   N   s        ##!HI         M M M+ + +,  .  3 3 3  ) ) ) )        r   rJ   )ra   rA   rM   r\   rB   jaraco.classesr   keyrings.alt.file_baser   r   r   r   re   r
   r!   rJ   r   r   r   <module>r      s
         				 



 % % % % % % D D D D D D D D D D , , , , , ," " " " "w " " "&* * * * * * * *ZR R R R Ry' R R R R Rr   