Mourad Elhadj Mimoune
7 years ago
7 changed files with 163 additions and 119 deletions
-
4keychain/README.rst
-
1keychain/models/__init__.py
-
68keychain/models/keychain.py
-
74keychain/models/keychain_backend.py
-
1keychain/tests/__init__.py
-
48keychain/tests/test_keychain.py
-
82keychain/tests/test_keychain_backend.py
@ -1 +1,2 @@ |
|||
from . import keychain |
|||
from . import keychain_backend |
@ -0,0 +1,74 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Akretion Sebastien Beau |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from odoo import models, fields |
|||
from odoo.tools.config import config |
|||
|
|||
|
|||
class KeychainBackend(models.AbstractModel): |
|||
_name = 'keychain.backend' |
|||
_backend_name = None |
|||
|
|||
name = fields.Char(required=True) |
|||
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 = {} |
@ -1 +1,2 @@ |
|||
from . import test_keychain |
|||
from . import test_keychain_backend |
@ -0,0 +1,82 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Akretion Mourad EL HADJ MIMOUNE |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from odoo.tests.common import TransactionCase |
|||
from odoo.tools.config import config |
|||
|
|||
import logging |
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
try: |
|||
from cryptography.fernet import Fernet |
|||
except ImportError as err: |
|||
_logger.debug(err) |
|||
|
|||
|
|||
class TestKeychain(TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestKeychain, self).setUp() |
|||
|
|||
self.keychain = self.env['keychain.account'] |
|||
self.keychain_backend = self.env['keychain.backend'] |
|||
|
|||
def _init_data(self): |
|||
return { |
|||
"c": True, |
|||
"a": "b", |
|||
"d": "", |
|||
} |
|||
|
|||
def _validate_data(self, data): |
|||
return 'c' in data |
|||
|
|||
keychain_clss = self.keychain.__class__ |
|||
keychain_clss._test_backend_init_data = _init_data |
|||
keychain_clss._test_backend_validate_data = _validate_data |
|||
|
|||
keychain_backend_clss = self.keychain_backend.__class__ |
|||
keychain_backend_clss._backend_name = 'test_backend' |
|||
|
|||
self.keychain._fields['namespace'].selection.append( |
|||
('test_backend', 'test backend') |
|||
) |
|||
|
|||
def test_keychain_bakend(self): |
|||
"""It should work with valid data.""" |
|||
config['keychain_key_dev'] = Fernet.generate_key() |
|||
config['running_env'] = 'dev' |
|||
vals = { |
|||
'name': 'backend_test', |
|||
'password': 'test', |
|||
'data': '{"a": "o", "c": "b"}' |
|||
} |
|||
# we use new because keychain.backend is an abstract model |
|||
backend = self.keychain_backend.new(vals) |
|||
backend._inverse_keychain() |
|||
account = backend._get_existing_keychain() |
|||
self.assertEqual( |
|||
account.data, '{"a": "o", "c": "b"}', |
|||
'Account data is not correct') |
|||
backend._inverse_password() |
|||
self.assertTrue(account, 'Account was not created') |
|||
self.assertEqual( |
|||
account.clear_password, u'test', |
|||
'Account clear password is not correct') |
|||
self.assertEqual(backend.password, u'test') |
|||
backend._compute_password() |
|||
self.assertEqual( |
|||
backend.password, u'******', 'Backend password was not computed') |
|||
self.assertEqual( |
|||
account.name, u'backend_test dev', 'Account name is not correct') |
|||
self.assertEqual( |
|||
account.namespace, u'test_backend', |
|||
'Account namespace is not correct') |
|||
self.assertEqual( |
|||
account.environment, u'dev', 'Account environment is not correct') |
|||
self.assertEqual( |
|||
account.technical_name, '%s,%s' % (backend._name, backend.id), |
|||
'Account technical_name is not correct') |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue