add ValueBackendPassword which supports keyrings

This commit is contained in:
Romain Bignon 2011-05-21 10:26:01 +02:00
commit 67b795c585

View file

@ -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')