add ValueBackendPassword which supports keyrings
This commit is contained in:
parent
9bef9d5666
commit
67b795c585
1 changed files with 80 additions and 9 deletions
|
|
@ -57,21 +57,94 @@ class Value(object):
|
|||
raise ValueError('Value "%s" is not in list: %s' % (
|
||||
v, ', '.join(unicode(s) for s in self.choices.iterkeys())))
|
||||
|
||||
def set_value(self, v):
|
||||
def load(self, domain, v, callbacks):
|
||||
return self.set(v)
|
||||
|
||||
def set(self, v):
|
||||
self.check_valid(v)
|
||||
self._value = v
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
def dump(self):
|
||||
return self.get()
|
||||
|
||||
def get(self):
|
||||
return self._value
|
||||
|
||||
class ValueBackendPassword(Value):
|
||||
_domain = None
|
||||
_callbacks = {}
|
||||
_stored = True
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['masked'] = True
|
||||
self.noprompt = kwargs.pop('noprompt', False)
|
||||
Value.__init__(self, *args, **kwargs)
|
||||
|
||||
def load(self, domain, password, callbacks):
|
||||
self._domain = domain
|
||||
self._value = password
|
||||
self._callbacks = callbacks
|
||||
|
||||
def check_valid(self, passwd):
|
||||
if passwd == '':
|
||||
# always allow empty passwords
|
||||
return True
|
||||
return Value.check_valid(self, passwd)
|
||||
|
||||
def set(self, passwd):
|
||||
self.check_valid(passwd)
|
||||
if passwd is None:
|
||||
# no change
|
||||
return
|
||||
self._value = ''
|
||||
if passwd == '':
|
||||
return
|
||||
if self._domain is None:
|
||||
self._value = passwd
|
||||
return
|
||||
|
||||
try:
|
||||
import keyring
|
||||
keyring.set_password(self._domain, self.id, passwd)
|
||||
except str, e:
|
||||
print str(e)
|
||||
self._value = passwd
|
||||
else:
|
||||
self._value = ''
|
||||
|
||||
def dump(self):
|
||||
if self._stored:
|
||||
return self._value
|
||||
else:
|
||||
return ''
|
||||
|
||||
def get(self):
|
||||
if self._value == '' and self._domain is not None:
|
||||
try:
|
||||
import keyring
|
||||
except ImportError:
|
||||
return ''
|
||||
else:
|
||||
passwd = keyring.get_password(self._domain, self.id)
|
||||
if passwd is None:
|
||||
if not self.noprompt and 'login' in self._callbacks:
|
||||
self._value = self._callbacks['login'](self._domain, self)
|
||||
if self._value is None:
|
||||
self._value = ''
|
||||
else:
|
||||
self._stored = False
|
||||
return self._value
|
||||
else:
|
||||
return passwd
|
||||
else:
|
||||
return self._value
|
||||
|
||||
class ValueInt(Value):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs['regexp'] = '^\d+$'
|
||||
Value.__init__(self, *args, **kwargs)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
def get(self):
|
||||
return int(self._value)
|
||||
|
||||
class ValueFloat(Value):
|
||||
|
|
@ -85,8 +158,7 @@ class ValueFloat(Value):
|
|||
except ValueError:
|
||||
raise ValueError('Value "%s" is not a float value')
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
def get(self):
|
||||
return float(self._value)
|
||||
|
||||
class ValueBool(Value):
|
||||
|
|
@ -100,7 +172,6 @@ class ValueBool(Value):
|
|||
'n', 'no', '0', 'false', 'off'):
|
||||
raise ValueError('Value "%s" is not a boolean (y/n)' % v)
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
def get(self):
|
||||
return (isinstance(self._value, bool) and self._value) or \
|
||||
unicode(self._value).lower() in ('y', 'yes', '1', 'true', 'on')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue