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' % (
|
raise ValueError('Value "%s" is not in list: %s' % (
|
||||||
v, ', '.join(unicode(s) for s in self.choices.iterkeys())))
|
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.check_valid(v)
|
||||||
self._value = v
|
self._value = v
|
||||||
|
|
||||||
@property
|
def dump(self):
|
||||||
def value(self):
|
return self.get()
|
||||||
|
|
||||||
|
def get(self):
|
||||||
return self._value
|
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):
|
class ValueInt(Value):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
kwargs['regexp'] = '^\d+$'
|
kwargs['regexp'] = '^\d+$'
|
||||||
Value.__init__(self, *args, **kwargs)
|
Value.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
@property
|
def get(self):
|
||||||
def value(self):
|
|
||||||
return int(self._value)
|
return int(self._value)
|
||||||
|
|
||||||
class ValueFloat(Value):
|
class ValueFloat(Value):
|
||||||
|
|
@ -85,8 +158,7 @@ class ValueFloat(Value):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError('Value "%s" is not a float value')
|
raise ValueError('Value "%s" is not a float value')
|
||||||
|
|
||||||
@property
|
def get(self):
|
||||||
def value(self):
|
|
||||||
return float(self._value)
|
return float(self._value)
|
||||||
|
|
||||||
class ValueBool(Value):
|
class ValueBool(Value):
|
||||||
|
|
@ -100,7 +172,6 @@ class ValueBool(Value):
|
||||||
'n', 'no', '0', 'false', 'off'):
|
'n', 'no', '0', 'false', 'off'):
|
||||||
raise ValueError('Value "%s" is not a boolean (y/n)' % v)
|
raise ValueError('Value "%s" is not a boolean (y/n)' % v)
|
||||||
|
|
||||||
@property
|
def get(self):
|
||||||
def value(self):
|
|
||||||
return (isinstance(self._value, bool) and self._value) or \
|
return (isinstance(self._value, bool) and self._value) or \
|
||||||
unicode(self._value).lower() in ('y', 'yes', '1', 'true', 'on')
|
unicode(self._value).lower() in ('y', 'yes', '1', 'true', 'on')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue