[IMP] add a keychain backend abstract model, the aim is to simplify the integration of keychain when you already have /need the concept of backend
This commit is contained in:
parent
fb497372cc
commit
5e90a6396f
|
|
@ -200,3 +200,70 @@ class KeychainAccount(models.Model):
|
|||
"Use a key similar to: %s" % (envs[0], Fernet.generate_key())
|
||||
))
|
||||
return MultiFernet(keys)
|
||||
|
||||
|
||||
class KeychainBackend(models.AbstractModel):
|
||||
_name = 'keychain.backend'
|
||||
_backend_name = None
|
||||
|
||||
password = fields.Char(
|
||||
compute="_compute_password",
|
||||
inverse="_inverse_password",
|
||||
required=True)
|
||||
data = fields.Serialized(
|
||||
compute="_compute_keychain",
|
||||
inverse="_inverse_keychain")
|
||||
|
||||
def _get_technical_name(self):
|
||||
return '%s,%s' % (self._name, self.id)
|
||||
|
||||
def _get_existing_keychain(self):
|
||||
self.ensure_one()
|
||||
return self.env['keychain.account'].retrieve([
|
||||
('namespace', '=', self._backend_name),
|
||||
('technical_name', '=', self._get_technical_name())
|
||||
])
|
||||
|
||||
def _prepare_keychain(self):
|
||||
env = config.get('running_env')
|
||||
return {
|
||||
'name': "%s %s" % (self.name, env),
|
||||
'technical_name': self._get_technical_name(),
|
||||
'namespace': self._backend_name,
|
||||
'environment': env,
|
||||
}
|
||||
|
||||
def _get_keychain_account(self):
|
||||
self.ensure_one()
|
||||
account = self._get_existing_keychain()
|
||||
if not account:
|
||||
vals = self._prepare_keychain()
|
||||
account = self.env['keychain.account'].create(vals)
|
||||
return account
|
||||
|
||||
def _inverse_password(self):
|
||||
for record in self:
|
||||
account = self._get_keychain_account()
|
||||
if record.password and record.password != '******':
|
||||
account.clear_password = record.password
|
||||
|
||||
def _compute_password(self):
|
||||
for record in self:
|
||||
account = record._get_existing_keychain()
|
||||
if account and account.password:
|
||||
record.password = "******"
|
||||
else:
|
||||
record.password = ""
|
||||
|
||||
def _inverse_keychain(self):
|
||||
for record in self:
|
||||
account = record._get_keychain_account()
|
||||
account.data = account._serialize_data(record.data)
|
||||
|
||||
def _compute_keychain(self):
|
||||
for record in self:
|
||||
account = record._get_existing_keychain()
|
||||
if account:
|
||||
record.data = account.get_data()
|
||||
else:
|
||||
record.data = {}
|
||||
|
|
|
|||
Loading…
Reference in New Issue