Skip to content

Commit

Permalink
CredentialManager: Store passwords in system keyring
Browse files Browse the repository at this point in the history
Credential Manager is used for safely storing passwords in system's keyring services.
  • Loading branch information
nikicc authored and kernc committed Oct 7, 2016
1 parent 55748e5 commit 99c65fa
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
38 changes: 38 additions & 0 deletions Orange/widgets/credentials.py
@@ -0,0 +1,38 @@
import keyring

SERVICE_NAME = 'Orange3 - {}'


class CredentialManager:
"""
Class for storage of passwords in the system keyring service.
All attributes of this class are safely stored.
Args:
service_name (str): service name used for storing in keyring.
Examples:
>>> cm = CredentialManager('Widget Name')
>>> cm.username = 'Orange' # store username
>>> cm.password = 'Secret' # store password
>>> cm.username # get username
'Orange'
>>> cm.password # get password
'Secret'
"""
def __init__(self, service_name):
self.__dict__['__service_name'] = SERVICE_NAME.format(service_name)

@property
def service_name(self):
return self.__dict__['__service_name']

def __setattr__(self, key, value):
keyring.set_password(self.service_name, key, value)

def __getattr__(self, item):
return keyring.get_password(self.service_name, item)

def __delattr__(self, item):
keyring.delete_password(self.service_name, item)
12 changes: 12 additions & 0 deletions Orange/widgets/tests/test_credentials.py
@@ -0,0 +1,12 @@
import unittest

from Orange.widgets.credentials import CredentialManager


class CredentialManagerTests(unittest.TestCase):
def test_credential_manager(self):
cm = CredentialManager('Orange')
cm.key = 'Foo'
self.assertEqual(cm.key, 'Foo')
del cm.key
self.assertEqual(cm.key, None)
2 changes: 2 additions & 0 deletions requirements-core.txt
Expand Up @@ -8,3 +8,5 @@ xlrd>=0.9.2
chardet>=2.3.0
# Multiprocessing abstraction
joblib>=0.9.4
keyring
keyrings.alt # for alternative keyring implementations

0 comments on commit 99c65fa

Please sign in to comment.