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_missingZsec_interaction_not_allowed r   r   </usr/lib/python3/dist-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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_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   r0   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
   classmethodr7   r   r   r   r   r1   c   s    r1   c                   @      e Zd ZdS )r2   Nr   r	   r
   r   r   r   r   r2   u       r2   c                   @   r9   )r3   Nr:   r   r   r   r   r3   y   r;   r3   c                   @   r9   )r4   Nr:   r   r   r   r   r4   }   r;   r4   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kSecClassGenericPasswordZkSecMatchLimitOneT)	kSecClassZkSecMatchLimitkSecAttrServicekSecAttrAccountZkSecReturnData)r+   r   r   r   SecItemCopyMatchingr   r   r   r1   r7   r0   )Zkc_nameserviceusernamenot_found_okqr/   r6   r   r   r   find_generic_password   s   
rE   c                 C   sH   t | ||ddrt| || ttd|||d}t|d }t| d S )NT)rC   r<   )r=   r>   r?   ZkSecValueData)rE   delete_generic_passwordr+   r   
SecItemAddr1   r7   )namerA   rB   ZpasswordrD   r6   r   r   r   set_generic_password   s   
rI   c                 C   s(   t td||d}t|}t| d S )Nr<   )r=   r>   r?   )r+   r   SecItemDeleter1   r7   )rH   rA   rB   rD   r6   r   r   r   rF      s   rF   )F)$r   r   r   r   r   Zctypes.utilr   Z	OS_statusr   ZCDLLr   Z_corer)   r%   Zrestypeargtypesr   r   rG   r@   rJ   r,   r-   r   r   r   r+   r0   	Exceptionr1   r2   r3   r4   rE   rI   rF   r   r   r   r   <module>   sd    	


