B
    oh\                 @   s   d dl mZ d dlZd dlZddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ yd dlZd dlmZ W n& ek
r   Y n ek
r   Y nX G d	d
 d
eZG dd deZdS )    )absolute_importN   )KeyringBackend)PasswordDeleteError)PasswordSetError	InitErrorKeyringLocked)
properties)DBusGMainLoopc                   s|   e Zd ZdZejejd p dZ	dZ
dZdZejedd Z fd	d
Zdd Zdd Zdd Zdd Zdd Z  ZS )DBusKeyringz!
    KDE KWallet 5 via D-Bus
    r   zPython keyring libraryNzorg.kde.kwalletd5z/modules/kwalletd5c          
   C   s   dt  krtdytjt d}W n0 tjk
rT } zt| W d d }~X Y nX y|| j| j	 W n0 tjk
r   d}|j
| jd}t|Y nX dtddd	krd
S dS )Ndbuszpython-dbus not installed)mainloopzcannot connect to {bus_name})bus_nameZKDEZXDG_CURRENT_DESKTOP :gffffff@g@)globalsRuntimeErrorr   
SessionBusr
   DBusExceptionZget_dbus_message
get_objectr   object_pathformatosgetenvsplit)clsbusexcZtmplmsg r   7lib/python3.7/site-packages/keyring/backends/kwallet.pypriority   s    
zDBusKeyring.priorityc                s   t t| j|| d| _d S )N)superr   __init__handle)selfargkw)	__class__r   r    r$   2   s    zDBusKeyring.__init__c       	      C   s   d}g }| j | j|| jr| j | j|d| j}xf| D ]Z}|d }|d }|dd\}}| j | j|||| j}|dkr<| j | j||| j q<W | j | j|d| j}|s| j 	| j|| j d S )NPythonz*@*r      @*)
ifaceZ	hasFolderr%   appidZreadPasswordListitemsrsplitwritePasswordremoveEntryZremoveFolder)	r&   serviceZ
old_folderZ
entry_listentrykeypasswordusernameZretr   r   r    _migrate6   s$    zDBusKeyring._migratec          
   C   s   | j dkr| j| j rdS tjt d}d}y<|| j| j}t	|d| _| j
| j || j| _ W n0 tjk
r } ztd| W d d }~X Y nX | j dk rdS | | dS )Nr   T)r   zorg.kde.KWalletzFailed to open keyring: %s.F)r%   r.   ZisOpenr   r   r
   r   r   r   Z	InterfaceopenZnetworkWalletr/   r   r   r9   )r&   r4   r   ZwIdZ
remote_objer   r   r    	connectedM   s     


zDBusKeyring.connectedc             C   sJ   |  |std| j| j||| js,dS | j| j||| j}t|S )z5Get password of the username for the service
        zFailed to unlock the keyring!N)r<   r   r.   hasEntryr%   r/   ZreadPasswordstr)r&   r4   r8   r7   r   r   r    get_passworda   s    
zDBusKeyring.get_passwordc             C   s.   |  |std| j| j|||| j dS )z5Set password for the username of the service
        zCancelled by userN)r<   r   r.   r2   r%   r/   )r&   r4   r8   r7   r   r   r    set_passwordm   s    
zDBusKeyring.set_passwordc             C   sJ   |  |std| j| j||| js0td| j| j||| j dS )z=Delete the password for the username of the service.
        zCancelled by userzPassword not foundN)r<   r   r.   r=   r%   r/   r3   )r&   r4   r8   r   r   r    delete_passwordv   s
    
zDBusKeyring.delete_password)__name__
__module____qualname____doc__r   pathbasenamesysargvr/   Zwalletr   r   r	   ClassPropertyclassmethodr!   r$   r9   r<   r?   r@   rA   __classcell__r   r   )r)   r    r      s   	r   c                   s2   e Zd ZdZdZdZeje fddZ	  Z
S )DBusKeyringKWallet4z!
    KDE KWallet 4 via D-Bus
    zorg.kde.kwalletdz/modules/kwalletdc                s   t t| jd S )Nr+   )r#   rM   r!   )r   )r)   r   r    r!      s    zDBusKeyringKWallet4.priority)rB   rC   rD   rE   r   r   r	   rJ   rK   r!   rL   r   r   )r)   r    rM      s
   rM   )Z
__future__r   rH   r   Zbackendr   errorsr   r   r   r   utilr	   r   Zdbus.mainloop.glibr
   ImportErrorAttributeErrorr   rM   r   r   r   r    <module>   s   l