From 67b795c5853e6089e04688434e2790dc1896e244 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Sat, 21 May 2011 10:26:01 +0200 Subject: [PATCH] add ValueBackendPassword which supports keyrings --- weboob/tools/value.py | 89 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 9 deletions(-) diff --git a/weboob/tools/value.py b/weboob/tools/value.py index a01753f8..ddb41e79 100644 --- a/weboob/tools/value.py +++ b/weboob/tools/value.py @@ -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')