Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- gkgetsecret.py - This provides a handful of functions for retrieving
- secrets from GNOME Keyring using the libsecret API.
- Copyright (C) 2018 Charles Bos
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- '''
- from gi import require_version
- require_version('Secret', '1')
- from gi.repository import Secret
- def get_pw_from_desc(pw_desc) :
- '''
- This function returns the password for an item in the default keyring
- which contains the description provided.
- Use this function if you created a password using the dialogue in Seahorse
- '''
- # Get service
- service = Secret.Service.get_sync(Secret.ServiceFlags.LOAD_COLLECTIONS)
- # Get default keyring
- keyring = Secret.Collection.for_alias_sync(service, "default", \
- Secret.CollectionFlags.NONE, None)
- # Get keyring items
- items = keyring.get_items()
- # Load secrets
- Secret.Item.load_secrets_sync(items)
- # Loop through items, find the matching one and return its password
- password = None
- for item in items :
- if item.get_label() == pw_desc :
- password = item.get_secret().get_text()
- break
- # Close connection
- service.disconnect()
- return password
- def get_pw_from_attrs(*attr_val_pairs) :
- '''
- This function returns the password for an item in the default keyring
- which contains all of the attribute value pairs provided as arguments.
- Use this function if you created a password using the secret-tool command
- or another such program that interfaces with libsecret
- '''
- # Check the list of attr-val pairs is present and contains an even number
- # of elements
- if attr_val_pairs == () :
- raise TypeError("get_pw_from_attrs() at least 1 attribute-value pair " \
- "must be supplied")
- if len(attr_val_pairs) % 2 != 0 :
- raise TypeError("get_pw_from_attrs() incomplete attribute-value " \
- "pair was supplied")
- # Get service
- service = Secret.Service.get_sync(Secret.ServiceFlags.LOAD_COLLECTIONS)
- # Get default keyring
- keyring = Secret.Collection.for_alias_sync(service, "default", \
- Secret.CollectionFlags.NONE, None)
- # Get keyring items
- items = keyring.get_items()
- # Load secrets
- Secret.Item.load_secrets_sync(items)
- # Loop through items, find the one which contains all supplied attr_val
- # pairs and return its password
- password = None
- for item in items :
- attrs = item.get_attributes()
- match = True
- for x in range(0, len(attr_val_pairs), 2) :
- key = attr_val_pairs[x]
- value = attr_val_pairs[x + 1]
- try :
- if attrs[key] != value :
- match = False
- break
- except KeyError :
- match = False
- break
- if match :
- password = item.get_secret().get_text()
- break
- # Close connection
- service.disconnect()
- return password
- def get_val_from_attrs(attr, *attr_val_pairs) :
- '''
- This function returns the value for a given attribute. The first item
- found that contains that attribute will be the one that is used. To ensure
- that the correct item is chosen, any number of attribute-value pairs can
- be optionally supplied as arguments and only the item which contains all
- of those attr-val pairs (along with the main attr) will be used.
- Use this function if you created a password using the secret-tool command
- or another such program that interfaces with libsecret
- '''
- # Check the list of attr-val pairs contains an even number of elements
- # if it exists
- if attr_val_pairs != () :
- if len(attr_val_pairs) % 2 != 0 :
- raise TypeError("get_val_from_attrs() incomplete attribute-value " \
- "pair was supplied")
- # Get service
- service = Secret.Service.get_sync(Secret.ServiceFlags.LOAD_COLLECTIONS)
- # Get default keyring
- keyring = Secret.Collection.for_alias_sync(service, "default", \
- Secret.CollectionFlags.NONE, None)
- # Get keyring items
- items = keyring.get_items()
- # Loop through items, find the one which contains the supplied attribute
- # (plus any attr_val pairs if specified) and return that attribute's
- # value
- attr_value = None
- for item in items :
- attrs = item.get_attributes()
- try :
- attrs[attr]
- except KeyError :
- continue
- match = True
- for x in range(0, len(attr_val_pairs), 2) :
- key = attr_val_pairs[x]
- value = attr_val_pairs[x + 1]
- try :
- if attrs[key] != value :
- match = False
- break
- except KeyError :
- match = False
- break
- if match :
- attr_value = attrs[attr]
- break
- # Close connection
- service.disconnect()
- return attr_value
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement