o
    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_missingsec_interaction_not_allowed r   r   </usr/lib/python3/dist-packages/keyring/backends/macOS/api.pyr      s    r   SecurityCoreServices
Foundationc                 C   s   t t| S )N)r   in_dll_secsr   r   r   k_B   s   r   c                 C   s$   t d dtt| rdS 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   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   s   " )CFDictionaryCreater   lenkeysvalues_foundkCFTypeDictionaryKeyCallBackskCFTypeDictionaryValueCallBacks)kwargsr   r   r   create_queryP   s   
r2   c                 C   s   t t| t| dS )Nzutf-8)r   	string_atCFDataGetBytePtrCFDataGetLengthdecode)datar   r   r   cfstr_to_str]   s   r8   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rt|d|t jks$|t jkr)t|d| |d)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
   classmethodr?   r   r   r   r   r9   c   s    r9   c                   @      e Zd ZdS )r:   Nr   r	   r
   r   r   r   r   r:   u       r:   c                   @   rA   )r;   NrB   r   r   r   r   r;   y   rC   r;   c                   @   rA   )r<   NrB   r   r   r   r   r<   }   rC   r<   Fc                 C   sV   t tdtd||tdd}t }t|t|}|tjkr"|r"d S t	| t
|S )NkSecClassGenericPasswordkSecMatchLimitOneT)	kSecClasskSecMatchLimitkSecAttrServicekSecAttrAccountkSecReturnData)r2   r   r   r   SecItemCopyMatchingr   r   r   r9   r?   r8   )kc_nameserviceusernamenot_found_okqr7   r>   r   r   r   find_generic_password   s   
rQ   c                 C   sH   t | ||ddrt| || ttd|||d}t|d }t| d S )NT)rO   rD   )rF   rH   rI   kSecValueData)rQ   delete_generic_passwordr2   r   
SecItemAddr9   r?   )namerM   rN   passwordrP   r>   r   r   r   set_generic_password   s   
rW   c                 C   s(   t td||d}t|}t| d S )NrD   )rF   rH   rI   )r2   r   SecItemDeleter9   r?   )rU   rM   rN   rP   r>   r   r   r   rS      s   rS   )F)$r   r   r   r   r   ctypes.utilr   	OS_statusr   CDLLr   _corer.   r*   restypeargtypesr!   r   rT   rK   rX   r4   r5   r   r   r#   r2   r8   	Exceptionr9   r:   r;   r<   rQ   rW   rS   r   r   r   r   <module>   sd    	


