a
    7a                     @   s  d dl Z d dl mZmZmZmZ d dlmZ eZG dd dZe 	edZ
e 	edZe 	edZejZee_eeeeeefe_ejZee_eeege_ejZee_eee jge_e
jZee_eefe_e
jZee_eefe_e
jZee_efe_ejZee_efe_ejZee_efe_d	d
 Zdd Zdd Zdd Zdd ZG dd deZG dd deZG dd deZG dd deZ d"ddZ!dd Z"d d! Z#dS )#    N)c_void_pc_uint32c_int32byref)find_libraryc                   @   s    e Zd ZdZdZdZdZdZdS )errori,ii3i*i$N)__name__
__module____qualname__item_not_foundkeychain_deniedsec_auth_failedplist_missingZsec_interaction_not_allowed r   r   9lib/python3.9/site-packages/keyring/backends/macOS/api.pyr      s
   r   ZSecurityZCoreServicesZ
Foundationc                 C   s   t t| S )N)r   Zin_dll_secsr   r   r   k_B   s    r   c                 C   s   t d dtt| rdndS )N	      r   )CFNumberCreatectypesr   r   )br   r   r   create_cfboolF   s    r   c                 C   s   t d | ddS )Nutf8i  )CFStringCreateWithCStringencoder   r   r   r   create_cfstrJ   s    r   c                  K   sN   t d tt|  dd |  D  tt|  dd |  D  t| tjtjS )Nc                 S   s   g | ]}t |qS r   )r   ).0kr   r   r   
<listcomp>S       z create_query.<locals>.<listcomp>c                 S   s"   g | ]}t |trt|n|qS r   )
isinstancestrr   )r   vr   r   r   r!   U   r"   )CFDictionaryCreater   lenkeysvalues_foundZkCFTypeDictionaryKeyCallBacksZkCFTypeDictionaryValueCallBacks)kwargsr   r   r   create_queryP   s    
r,   c                 C   s   t t| t| dS )Nzutf-8)r   Z	string_atCFDataGetBytePtrCFDataGetLengthdecode)datar   r   r   cfstr_to_str]   s    r1   c                   @   s   e Zd Zedd ZdS )Errorc                 C   s`   |dkrd S |t jkr t|d|t jkr4t|d|t jksH|t jkrRt|d| |dd S )Nr   zItem not foundzKeychain Access DeniedzDSecurity Auth Failure: make sure python is signed with codesign utilzUnknown Error)r   r   NotFoundr   KeychainDeniedr   r   SecAuthFailure)clsstatusr   r   r   raise_for_statusd   s    



zError.raise_for_statusN)r   r	   r
   classmethodr8   r   r   r   r   r2   c   s   r2   c                   @   s   e Zd ZdS )r3   Nr   r	   r
   r   r   r   r   r3   u   s   r3   c                   @   s   e Zd ZdS )r4   Nr:   r   r   r   r   r4   y   s   r4   c                   @   s   e Zd ZdS )r5   Nr:   r   r   r   r   r5   }   s   r5   Fc                 C   sV   t tdtd||tdd}t }t|t|}|tjkrD|rDd S t	| t
|S )NkSecClassGenericPasswordZkSecMatchLimitOneT)	kSecClassZkSecMatchLimitkSecAttrServicekSecAttrAccountZkSecReturnData)r,   r   r   r   SecItemCopyMatchingr   r   r   r2   r8   r1   )Zkc_nameserviceusernamenot_found_okqr0   r7   r   r   r   find_generic_password   s    
rD   c                 C   sH   t | ||ddrt| || ttd|||d}t|d }t| d S )NT)rB   r;   )r<   r=   r>   ZkSecValueData)rD   delete_generic_passwordr,   r   
SecItemAddr2   r8   )namer@   rA   ZpasswordrC   r7   r   r   r   set_generic_password   s    
rH   c                 C   s(   t td||d}t|}t| d S )Nr;   )r<   r=   r>   )r,   r   SecItemDeleter2   r8   )rG   r@   rA   rC   r7   r   r   r   rE      s    rE   )F)$r   r   r   r   r   Zctypes.utilr   Z	OS_statusr   ZCDLLr   Z_corer*   r&   Zrestypeargtypesr   r   rF   r?   rI   r-   r.   r   r   r   r,   r1   	Exceptionr2   r3   r4   r5   rD   rH   rE   r   r   r   r   <module>   sb   	


