2016-12-19 1 views
0

ich Linux Mint bin mit 17, basierend auf Ubuntu 14.04Get Attribute gnomekeyring Schlüssel mit Python 2.7 GTK3 auf Ubuntu 14.04

Ich habe installiert:

python-gnomekeyring 2.3.2 Python-gi 3,12 python-gtk2 2.24

Ich möchte den GnomeKeyring verwenden. Ich speichere und lese einen Schlüsselnamen ein Schlüsselpasswort, aber ich annot Zugriff auf die Attribute. Wenn ich versuche, auf sie zuzugreifen bekomme ich immer:

*** Fehler in `Python ': Doppel frei oder Korruption (out)

Hier ist mein Code, ich dies heute geschaffen, mit zu arbeiten die gnomekeyring:

#!/usr/bin/python 
# -*- coding: utf8 -*- 


import gi 
gi.require_version('Gtk', '3.0') 
gi.require_version('GnomeKeyring', '1.0') 
from gi.repository import Gtk 
from gi.repository import GnomeKeyring 

import logging 
from pprint import pprint 


class KeyringManager(): 

    def __init__(self): 
     pass 

    def create_key(self, keyring_name, key_name, attributes=None): 
     logging.warning("create_key: %s/%s", keyring_name, key_name) 
     self.unlock_keyring(keyring_name) 
     key_id = self.get_key_id(keyring_name, key_name) 
     if key_id: 
      logging.warning("key already exists, overwriting now, press return key to continue") 
      raw_input() 
     attrs = GnomeKeyring.Attribute.list_new() 
     for key, value in attributes.items(): 
      GnomeKeyring.Attribute.list_append_string(attrs, key, value) 
     GnomeKeyring.item_create_sync(keyring_name, GnomeKeyring.ItemType.GENERIC_SECRET, key_name, attrs, raw_input("please enter password for key '{}': ".format(key_name)), True) 

    def unlock_keyring(self, keyring_name): 
     logging.warning("unlock_keyring: %s", keyring_name) 
     # check if keyring exists 
     (result, info) = GnomeKeyring.get_info_sync(keyring_name) 
     if result == GnomeKeyring.Result.NO_SUCH_KEYRING: 
      logging.warning("keyring does not exists: %s", keyring_name) 
      self.create_keyring(keyring_name) 
     result = GnomeKeyring.unlock_sync(keyring_name, None) 
     pprint(result.value_name) 

    def create_keyring(self, keyring_name): 
     logging.warning("create_keyring: %s", keyring_name) 
     result = GnomeKeyring.create_sync(keyring_name, raw_input("please enter passwort for new keyring '{}': ".format(keyring_name))) 
     pprint(result) 

    def get_key_id(self, keyring_name, key_name): 
     logging.warning("get_key_id: %s/%s", keyring_name, key_name) 
     (result, key_ids) = GnomeKeyring.list_item_ids_sync(keyring_name) 
     for key_id in key_ids: 
      (result, item) = GnomeKeyring.item_get_info_sync(keyring_name, key_id) 
      if item.get_display_name() == key_name: 
       return key_id 

    def get_key_info(self, keyring_name, key_name): 
     logging.warning("get_key_info: %s/%s", keyring_name, key_name) 
     self.unlock_keyring(keyring_name) 
     key_id = self.get_key_id(keyring_name, key_name) 
     GnomeKeyring.item_get_info_sync (keyring_name, key_id) 
     (result, item) = GnomeKeyring.item_get_info_sync(keyring_name, key_id) 
     self.key_name = item.get_display_name() 
     self.secret = item.get_secret() 
     self.attrs = GnomeKeyring.Attribute.list_new() 
     result = GnomeKeyring.item_get_attributes_sync(keyring_name, key_id, self.attrs)# 
     try: 
      for attr in GnomeKeyring.Attribute.list_to_glist(self.attrs): 
       ## *** Error in `python': double free or corruption (out) 
       print '%s = %s ' % (attr.name, attr.get_string()) 
     except Exception, e: 
      logging.error(e.message, exc_info=True) 
      exit(e.message) 

    def delete_key(self, keyring_name="login", key_name="==THENAME"): 
     logging.warning("delete_key: %s/%s", keyring_name, key_name) 
     raw_input("press return key to continue") 
     logging.error("not implemented yet") 
     #GnomeKeyring.item_delete_sync(keyring, id) 


#KeyringManager().create_key("my_keyring", "my_key", {"user":"carl", "url":"apple.de", "port":"1212"}) 
KeyringManager().get_key_info("my_keyring", "my_key") 

einige Links:

https://github.com/lwindolf/liferea/blob/master/plugins/gnome-keyring.py

+0

Haben Sie mehr Kontext für den Fehler? Zum Beispiel, eine Zeilennummer? – oldtechaa

+0

Betrachtet man die Fehlermeldung, sieht es fast wie ein Fehler im Python-Interpreter aus, da es in Python kein 'free' gibt, oder? Nimm niemals einen Fehler in deinen Werkzeugen an. – oldtechaa

Antwort

1

das funktioniert:

def get_attributes(self, keyring_name, key_id): 
    attributes = {} 
    attrs_list = GnomeKeyring.Attribute.list_new() 
    (result, items)= GnomeKeyring.find_items_sync(GnomeKeyring.ItemType.GENERIC_SECRET, attrs_list) 
    for item in items: 
     if item.keyring == keyring_name: 
      if item.item_id == key_id: 
       for attr in GnomeKeyring.Attribute.list_to_glist(item.attributes): 
        if attr.name != "xdg:schema": 
         attributes[attr.name] = attr.get_string() 
    return attributes 
1

Ich sehe die Hauptfrage, die Sie bereits geklärt haben.

Der Fehler war, weil Sie GnomeKeyring.Attribute.list_new() als Argument für GnomeKeyring.Attribute.list_to_glist(…) anstelle von item.attributes eines GnomeKeyring.Found verwendet haben.