o
    b                     @   sT   d dl mZ d dl mZ d dlmZ ddlmZ G dd deZG dd	 d	eZ	d
S )    )Gio)GLib)log   )
vmmGObjectc                   @   s&   e Zd ZdddZdd Zdd ZdS )	
_vmmSecretNc                 C   s   || _ || _|| _d S N)namesecret
attributes)selfr	   r
   r    r   2/usr/share/virt-manager/virtManager/lib/keyring.py__init__   s   
z_vmmSecret.__init__c                 C      | j S r   )r
   r   r   r   r   
get_secret      z_vmmSecret.get_secretc                 C   r   r   )r	   r   r   r   r   get_name   r   z_vmmSecret.get_name)NN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    
r   c                   @   s~   e Zd ZdZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd ZdddZdd ZdS )
vmmKeyringz,
    freedesktop Secret API abstraction
    c                 C   s   | j st | _ | j S r   )	_instancer   )clsr   r   r   get_instance   s   zvmmKeyring.get_instancec              	   C   s   t |  d | _z>ttjjd | _tj	| jdd dddd | _
| j
ddtddd	 | _tj	| jdd dd
dd | _td| j W d S  tyU   td Y d S w )Nr   org.freedesktop.secretsz/org/freedesktop/secretszorg.freedesktop.Secret.Servicez(sv)plains    z(/org/freedesktop/secrets/aliases/defaultz!org.freedesktop.Secret.CollectionzUsing keyring session %szError determining keyring)r   r   _collectionr   bus_get_syncBusTypeSESSION_dbus	DBusProxynew_sync_serviceOpenSessionr   Variant_sessionr   debug	Exception	exceptionr   r   r   r   r   %   s.   


zvmmKeyring.__init__c                 C   s   d S r   r   r   r   r   r   _cleanup=   s   zvmmKeyring._cleanupc                 C   s:   ||d}| j d|\}}|s|rtd d S |d S )Nuuidhvuriz(a{ss})zItem found, but it's lockedr   )r(   SearchItemsr   warning)r   r1   r2   r   unlockedlockedr   r   r   _find_secret_item_path@   s   z!vmmKeyring._find_secret_item_pathc              	   C   s6   |dkrd S t j| jdd d|dd }|dd d S )N/r   r   zorg.freedesktop.Secret.Promptz(s)r   )r   r&   r'   r%   Prompt)r   pathifacer   r   r   _do_prompt_if_neededM   s   zvmmKeyring._do_prompt_if_neededc                 C   s   z3t d| t d|jd}| jg dd | D df}d}| jd|||\}}| | W d S  t	yB   t
d	 Y d S w )
Nr   za{ss})z!org.freedesktop.Secret.Item.Labelz&org.freedesktop.Secret.Item.Attributesc                 S      g | ]}t |qS r   )ord).0vr   r   r   
<listcomp>]       z*vmmKeyring._add_secret.<locals>.<listcomp>ztext/plain; charset=utf8Tz(a{sv}(oayays)b)zFailed to add keyring secret)r   r*   r   r   r+   r   r!   
CreateItemr<   r-   r   r.   )r   r
   propsparamsreplacedummypromptr   r   r   _add_secretV   s    zvmmKeyring._add_secretc              	   C   sl   z&|  ||}|d u rW d S tj| jdd d|dd }| }| | W d S  ty5   t	d Y d S w )Nr   r   org.freedesktop.Secret.ItemzFailed to delete keyring secret)
r7   r   r&   r'   r%   Deleter<   r-   r   r.   )r   r1   r2   r:   r;   rH   r   r   r   _del_secretg   s   zvmmKeyring._del_secretc              	   C   s   d }z_|  ||}|d u rW d S tj| jdd d|dd }|d| jd }|d 	d}|d }d	
d
d |D }	i }
| D ]\}}|dvrPqGd| |
d| < qGt||	|
}W |S  tyr   td|| Y |S w )Nr   r   rJ   z(o)r   Label'
Attributesr   c                 S   r=   r   )chr)r?   cr   r   r   rA      rB   z*vmmKeyring._get_secret.<locals>.<listcomp>)r2   r1   z%sz-Failed to get keyring secret uuid=%r hvuri=%r)r7   r   r&   r'   r%   	GetSecretr+   get_cached_propertyunpackstripjoinitemsr   r-   r   r.   )r   r1   r2   retr:   r;   secretbyteslabel	dbusattrsr
   attrskeyvalr   r   r   _get_secretu   s0   zvmmKeyring._get_secretc                 C   s
   | j d uS r   )r!   r   r   r   r   is_available   s   
zvmmKeyring.is_availablec                 C   s   d|   S )Nzvm-console-)get_uuidr   vmr   r   r   _get_secret_name   s   zvmmKeyring._get_secret_namec                 C   sB   |   sdS | | |j }|d u rdS | | pdfS )N)r   r   r   )r`   r_   ra   connget_urir   get_console_username)r   rc   r
   r   r   r   get_console_password   s   zvmmKeyring.get_console_passwordr   c                 C   sF   |   sd S t| ||| |j d}|| | | d S )Nr0   )r`   r   rd   ra   re   rf   set_console_usernamerI   )r   rc   passwordusernamer
   r   r   r   set_console_password   s   
zvmmKeyring.set_console_passwordc                 C   s.   |   sd S | | |j  |  d S r   )r`   rL   ra   re   rf   del_console_usernamerb   r   r   r   del_console_password   s   zvmmKeyring.del_console_passwordN)r   )r   r   r   __doc__classmethodr   r   r/   r7   r<   rI   rL   r_   r`   rd   rh   rl   rn   r   r   r   r   r      s     
	"

r   N)
gi.repositoryr   r   virtinstr   	baseclassr   objectr   r   r   r   r   r   <module>   s   