
    en                        d dl Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ dZ	 d dlZd d	lmZ d d
lmZ  ej"                  dd       d dlmZ dZ e j,                  e      Z G d dej2                  e      Zy# eeef$ r Y 3w xY w)    N   )backend)
properties)KeyringBackend)SimpleCredential)PasswordDeleteErrorPasswordSetErrorKeyringLockedF)Gio)GLibSecret1)r   Tc                       e Zd ZdZdZed        Zej                  d        Z	ej                  defd       Zd Zd Zd	 Zd
 Zy)Keyringzlibsecret KeyringzPython keyring libraryc           	      (   t         j                  j                  dt         j                  j                  | j                  t         j                  j                  t         j                  j                  t         j                  j                              S )Nzorg.freedesktop.Secret.Genericapplication)r   SchemanewSchemaFlagsNONE_querySchemaAttributeTypeSTRINGselfs    </usr/lib/python3/dist-packages/keyring/backends/libsecret.pyschemazKeyring.schema"   si    }}  ,##KK**11**11"66==  
 	
    c                 "    t         j                  S )N)r   COLLECTION_DEFAULTr   s    r   
collectionzKeyring.collection.   s    (((r   returnc                     t         st        d      	 t        j                  j	                  t        j
                  j                  d        y# t        j                  $ r}t        d      |d }~ww xY w)Nzlibsecret requiredz*Can't open a session to the secret serviceg333333@)		availableRuntimeErrorr   Serviceget_syncServiceFlagsOPEN_SESSIONr   Error)clserrors     r   priorityzKeyring.priority2   sc    344	XNN##F$7$7$D$DdK  zz 	XKLRWW	Xs   8A A0A++A0c                    | j                  ||| j                        }	 t        j                  | j                  |t        j
                  j                  d      }|D ]"  }	 |j                         j!                         c S  y# t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j                        rt        d      | d}~ww xY w# t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j"                        rt        d      | d}~ww xY w)z,Get password of the username for the servicer   Ng-io-error-quarkFailed to unlock the item!secret-error)r   appidr   password_search_syncr   SearchFlagsUNLOCKr   r+   quark_try_stringmatchesr   IOErrorEnumFAILEDr
   retrieve_secret_syncget_text	IS_LOCKED)r   serviceusername
attributesitemsr-   quarkitems           r   get_passwordzKeyring.get_password?   s   [[(

[K
	//Z););)B)BDE  	D002;;==	 zz 	))*<=E}}UCOO$:$:;#$@AuL		 :: --n===(>(>?'(DE5P	s1   :B  C)C&AC!!C&)E<AEEc                 @   | j                  ||| j                        }dj                  ||      }	 t        j                  | j
                  || j                  ||d      }|st!        d      y# t        j                  $ r}t        j                  d      }|j                  |t        j                  j                        rt        d      |t        j                  d      }|j                  |t        j                  j                        rt        d      | d}~ww xY w)z,Set password for the username of the servicer   zPassword for '{}' on '{}'Nr2   z Failed to unlock the collection!r0   zFailed to store password!)r   r3   formatr   password_store_syncr   r"   r   r+   r7   r8   r=   r
   r   r9   r:   r	   )	r   r>   r?   passwordr@   labelstoredr-   rB   s	            r   set_passwordzKeyring.set_passwordT   s    [[(

[K
+228WE	//Z%4F "#>??  zz 	)).9E}}UFLL$:$:;#$FGUR))*<=E}}UCOO$:$:;#$FGUR	s   .A. .DBDDc                    | j                  ||| j                        }	 t        j                  | j                  |t        j
                  j                  d      }|D ]5  }	 t        j                  | j                  |j!                         d      }|c S  t%        d      # t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j                        rt        d      | d}~ww xY w# t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j"                        rt        d      | d}~ww xY w)z/Delete the stored password (only the first one)r   Nr0   r1   r2   zNo such password!)r   r3   r   r4   r   r5   r6   r   r+   r7   r8   r   r9   r:   r
   password_clear_syncget_attributesr=   r   )	r   r>   r?   r@   rA   r-   rB   rC   removeds	            r   delete_passwordzKeyring.delete_passwordg   s5   [[(

[K
	//Z););)B)BDE  
	D 44KK!4!4!6 N
	 ""566! zz 	))*<=E}}UCOO$:$:;#$@AuL		 :: --n===(>(>?'(DE5P	s1   :B  /DD2AC>>DE*AE%%E*c                    | j                  ||      }	 t        j                  | j                  |t        j                  j
                  d      }|D ]K  }|j                         j                  d      }	 t!        ||j#                         j%                               c S  y# t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j                        rt        d      | d}~ww xY w# t        j                  $ rQ}t        j                  d      }|j                  |t        j                  j&                        rt        d      | d}~ww xY w)aW  Get the first username and password for a service.
        Return a Credential instance

        The username can be omitted, but if there is one, it will use get_password
        and return a SimpleCredential containing  the username and password
        Otherwise, it will return the first username and password combo that it finds.
        Nr0   r1   r?   r2   )r   r   r4   r   r5   r6   r   r+   r7   r8   r   r9   r:   r
   rN   getr   r;   r<   r=   )r   r>   r?   queryrA   r-   rB   rC   s           r   get_credentialzKeyring.get_credential   s3    GX.	//UF$6$6$=$=tE  
	D**,00<H'd779BBD 
	 zz 	))*<=E}}UCOO$:$:;#$@AuL		 :: --n===(>(>?'(DE5P	s1   :B 3'DD2AC>>DE*AE%%E*N)__name__
__module____qualname____doc__r3   propertyr   r   NonDataPropertyr"   classpropertyfloatr.   rD   rK   rP   rT    r   r   r   r      sl    $E	
 	
 )  ) 
 
 
*@&72r   r   )logging r   _compatr   r   credentialsr   errorsr   r	   r
   r%   gigi.repositoryr   r   require_versionr   AttributeErrorImportError
ValueError	getLoggerrU   logSchemeSelectabler   r]   r   r   <module>rl      s        $ *  	
	!"Bx%$I g!g&&  	Z0 		s   +A> >B	B	