From f1b2a2b977347f5b77bf8d58e7cf62bb3f9b49f5 Mon Sep 17 00:00:00 2001 From: fkantelberg Date: Thu, 29 Feb 2024 08:01:23 +0100 Subject: [PATCH] [MIG][16.0] vault_share: Migration and restructuring for 16.0 --- setup/vault_share/odoo/addons/vault_share | 1 + setup/vault_share/setup.py | 6 + vault_share/README.rst | 28 +- vault_share/__manifest__.py | 10 +- vault_share/controllers/main.py | 1 + vault_share/i18n/es.po | 16 +- vault_share/i18n/nl.po | 4 - .../migrations/16.0.1.0.0/post-migrate.py | 13 + vault_share/models/res_config_settings.py | 2 +- vault_share/models/vault_share.py | 12 +- vault_share/readme/DESCRIPTION.rst | 2 +- vault_share/readme/ROADMAP.rst | 1 + vault_share/static/description/index.html | 24 +- .../static/src/backend/fields/templates.xml | 46 +++ .../src/backend/fields/vault_field.esm.js | 45 +++ .../src/backend/fields/vault_pin_field.esm.js | 110 ++++++ .../backend/fields/vault_share_field.esm.js | 15 + .../backend/fields/vault_share_file.esm.js | 15 + .../backend/fields/vault_share_mixin.esm.js | 164 ++++++++ vault_share/static/src/backend/templates.xml | 57 --- vault_share/static/src/common/utils.esm.js | 6 +- vault_share/static/src/frontend/share.esm.js | 48 ++- vault_share/static/src/legacy/vault_fields.js | 55 --- .../static/src/legacy/vault_share_widget.js | 367 ------------------ vault_share/tests/test_share.py | 25 +- vault_share/views/templates.xml | 19 +- vault_share/views/vault_share_views.xml | 5 +- 27 files changed, 543 insertions(+), 554 deletions(-) create mode 120000 setup/vault_share/odoo/addons/vault_share create mode 100644 setup/vault_share/setup.py create mode 100644 vault_share/migrations/16.0.1.0.0/post-migrate.py create mode 100644 vault_share/readme/ROADMAP.rst create mode 100644 vault_share/static/src/backend/fields/templates.xml create mode 100644 vault_share/static/src/backend/fields/vault_field.esm.js create mode 100644 vault_share/static/src/backend/fields/vault_pin_field.esm.js create mode 100644 vault_share/static/src/backend/fields/vault_share_field.esm.js create mode 100644 vault_share/static/src/backend/fields/vault_share_file.esm.js create mode 100644 vault_share/static/src/backend/fields/vault_share_mixin.esm.js delete mode 100644 vault_share/static/src/backend/templates.xml delete mode 100644 vault_share/static/src/legacy/vault_fields.js delete mode 100644 vault_share/static/src/legacy/vault_share_widget.js diff --git a/setup/vault_share/odoo/addons/vault_share b/setup/vault_share/odoo/addons/vault_share new file mode 120000 index 0000000000..d8d730a844 --- /dev/null +++ b/setup/vault_share/odoo/addons/vault_share @@ -0,0 +1 @@ +../../../../vault_share \ No newline at end of file diff --git a/setup/vault_share/setup.py b/setup/vault_share/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/vault_share/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/vault_share/README.rst b/vault_share/README.rst index 499ee5f481..da29dd4d6c 100644 --- a/vault_share/README.rst +++ b/vault_share/README.rst @@ -2,10 +2,13 @@ Vault - Share ============= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:9a16926a6329561017dac0fa81e331bcd50b83bc373281609831a25e42fb3e0c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ Vault - Share :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--auth-lightgray.png?logo=github - :target: https://github.com/OCA/server-auth/tree/15.0/vault_share + :target: https://github.com/OCA/server-auth/tree/16.0/vault_share :alt: OCA/server-auth .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/server-auth-15-0/server-auth-15-0-vault_share + :target: https://translation.odoo-community.org/projects/server-auth-16-0/server-auth-16-0-vault_share :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/251/15.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-auth&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module implements possibilities to share specific secrets with external users. This bases on the vault implementation and the generated RSA key pair. @@ -37,13 +40,18 @@ This allows an user to share a secret with external users. A share can be genera .. contents:: :local: +Known issues / Roadmap +====================== + +* Secure the download of the encrypted file behind a challenge/response + Bug Tracker =========== Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -73,6 +81,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/server-auth `_ project on GitHub. +This module is part of the `OCA/server-auth `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/vault_share/__manifest__.py b/vault_share/__manifest__.py index 5af9ada04d..7e05ea658a 100644 --- a/vault_share/__manifest__.py +++ b/vault_share/__manifest__.py @@ -1,11 +1,11 @@ -# © 2021 Florian Kantelberg - initOS GmbH +# © 2021-2024 Florian Kantelberg - initOS GmbH # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Vault - Share", "summary": "Implementation of a mechanism to share secrets", "license": "AGPL-3", - "version": "15.0.1.1.1", + "version": "16.0.1.0.0", "website": "https://github.com/OCA/server-auth", "application": False, "author": "initOS GmbH, Odoo Community Association (OCA)", @@ -25,15 +25,11 @@ "vault_share/static/src/common/**/*.js", "vault_share/static/src/backend/**/*.js", "vault_share/static/src/backend/**/*.scss", - "vault_share/static/src/legacy/vault_fields.js", - "vault_share/static/src/legacy/vault_share_widget.js", + "vault_share/static/src/backend/**/*.xml", ], "vault_share.assets_frontend": [ "vault/static/src/common/*.js", "vault_share/static/src/frontend/*.js", ], - "web.assets_qweb": [ - "vault_share/static/src/backend/**/*.xml", - ], }, } diff --git a/vault_share/controllers/main.py b/vault_share/controllers/main.py index e51f703cbf..52eb94d1ef 100644 --- a/vault_share/controllers/main.py +++ b/vault_share/controllers/main.py @@ -30,6 +30,7 @@ def vault_share(self, token): "iv": secret.iv, "encrypted_file": secret.secret_file, "filename": secret.filename, + "iterations": secret.iterations, } ) return request.render("vault_share.share", ctx) diff --git a/vault_share/i18n/es.po b/vault_share/i18n/es.po index 4750864d5f..a73a93b1cb 100644 --- a/vault_share/i18n/es.po +++ b/vault_share/i18n/es.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-06-06 07:44+0000\n" -"PO-Revision-Date: 2023-06-13 11:09+0000\n" -"Last-Translator: Víctor Martínez \n" +"PO-Revision-Date: 2023-10-30 21:37+0000\n" +"Last-Translator: Ivorra78 \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -157,7 +157,7 @@ msgstr "Pin" #. module: vault_share #: model:ir.model.fields,field_description:vault_share.field_vault_share__salt msgid "Salt" -msgstr "" +msgstr "Sal" #. module: vault_share #. openerp-web @@ -245,13 +245,13 @@ msgstr "El secreto ha expirado" #: code:addons/vault_share/models/vault_share.py:0 #, python-format msgid "The share was accessed by %(name)s via %(ip)s" -msgstr "" +msgstr "%(name)s ha accedido a la acción a través de %(ip)s" #. module: vault_share #: code:addons/vault_share/models/vault_share.py:0 #, python-format msgid "The share was created by %(name)s" -msgstr "" +msgstr "La acción fue creada por %(name)s" #. module: vault_share #: model:ir.model.fields,field_description:vault_share.field_vault_share__token @@ -271,21 +271,21 @@ msgstr "Utilizando este enlace y el pin la gente puede acceder al secreto." #. module: vault_share #: model:ir.model.fields,field_description:vault_share.field_res_company__vault_share_delay msgid "Vault Share Delay" -msgstr "" +msgstr "Retraso de la Acción de la Bóveda" #. module: vault_share #: code:addons/vault_share/models/vault_share_log.py:0 #: model:ir.model,name:vault_share.model_vault_share_log #, python-format msgid "Vault share log" -msgstr "" +msgstr "Registro de compartición de la bóveda" #. module: vault_share #: code:addons/vault_share/models/vault_share.py:0 #: model:ir.model,name:vault_share.model_vault_share #, python-format msgid "Vault share outgoing secrets" -msgstr "" +msgstr "La bóveda comparte secretos de salida" #, python-format #~ msgid "The share was accessed by %s via %s" diff --git a/vault_share/i18n/nl.po b/vault_share/i18n/nl.po index 09968ce8c6..5ea11a1ac3 100644 --- a/vault_share/i18n/nl.po +++ b/vault_share/i18n/nl.po @@ -159,9 +159,6 @@ msgstr "" #. module: vault_share #. openerp-web #: code:addons/vault_share/static/src/backend/templates.xml:0 -#: code:addons/vault_share/static/src/backend/templates.xml:0 -#: code:addons/vault_share/static/src/backend/templates.xml:0 -#: code:addons/vault_share/static/src/backend/templates.xml:0 #, python-format msgid "Save in a vault" msgstr "Opslaan in een kluis" @@ -196,7 +193,6 @@ msgstr "Deel het geheim" #. module: vault_share #. openerp-web #: code:addons/vault_share/static/src/backend/templates.xml:0 -#: code:addons/vault_share/static/src/backend/templates.xml:0 #, python-format msgid "Share the secret with an external user" msgstr "Het geheim delen met een externe gebruiker" diff --git a/vault_share/migrations/16.0.1.0.0/post-migrate.py b/vault_share/migrations/16.0.1.0.0/post-migrate.py new file mode 100644 index 0000000000..15c3b22717 --- /dev/null +++ b/vault_share/migrations/16.0.1.0.0/post-migrate.py @@ -0,0 +1,13 @@ +# © 2024 Florian Kantelberg - initOS GmbH +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging + +_logger = logging.getLogger(__name__) + + +def migrate(cr, version): + # Before the migration the iterations were hardcoded to 4000 + _logger.info("Setting iterations for previous records") + + cr.execute("UPDATE vault_share SET iterations = 4000 WHERE iterations IS NULL") diff --git a/vault_share/models/res_config_settings.py b/vault_share/models/res_config_settings.py index 15b04def40..4a69c1c18b 100644 --- a/vault_share/models/res_config_settings.py +++ b/vault_share/models/res_config_settings.py @@ -20,5 +20,5 @@ class ResConfigSettings(models.TransientModel): ) @api.onchange("vault_share_delay") - def _on_change_mins(self): + def _onchange_vault_share_delay(self): self.vault_share_delay = max(0, self.vault_share_delay) diff --git a/vault_share/models/vault_share.py b/vault_share/models/vault_share.py index 4b0f119f8a..927e5e3269 100644 --- a/vault_share/models/vault_share.py +++ b/vault_share/models/vault_share.py @@ -27,6 +27,7 @@ class VaultShare(models.Model): secret_file = fields.Char() filename = fields.Char() salt = fields.Char(required=True) + iterations = fields.Integer() iv = fields.Char(required=True) pin = fields.Char(required=True, help="The pin needed to decrypt the share.") accesses = fields.Integer( @@ -70,12 +71,13 @@ def get(self, token, ip=None): return None - @api.model - def create(self, vals): - rec = super().create(vals) + @api.model_create_multi + def create(self, vals_list): + res = super().create(vals_list) log = _("The share was created by %(name)s") - rec.log_ids = [(0, 0, {"name": log % {"name": self.env.user.name}})] - return rec + for rec in res: + rec.log_ids = [(0, 0, {"name": log % {"name": self.env.user.name}})] + return res @api.model def clean(self): diff --git a/vault_share/readme/DESCRIPTION.rst b/vault_share/readme/DESCRIPTION.rst index 51e526ca52..6348479690 100644 --- a/vault_share/readme/DESCRIPTION.rst +++ b/vault_share/readme/DESCRIPTION.rst @@ -1,6 +1,6 @@ This module implements possibilities to share specific secrets with external users. This bases on the vault implementation and the generated RSA key pair. Share -===== +~~~~~ This allows an user to share a secret with external users. A share can be generated from a vault entry or directly created by an user. The secret is symmetrically encrypted by a key derived from a pin. To grant access the user has to transmit the link and pin with the external. If either the access counter reaches 0 or the share expires it will be deleted automatically. Due to the usage of a numeric pin and the browser side decryption a share is vulnerable to brute-force attacks and shouldn't be used as a permanent storage for secrets. For long time uses the user should create an account and a vault should be used. diff --git a/vault_share/readme/ROADMAP.rst b/vault_share/readme/ROADMAP.rst new file mode 100644 index 0000000000..3a2ad3154c --- /dev/null +++ b/vault_share/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Secure the download of the encrypted file behind a challenge/response diff --git a/vault_share/static/description/index.html b/vault_share/static/description/index.html index 4b080257b0..4f0f75df63 100644 --- a/vault_share/static/description/index.html +++ b/vault_share/static/description/index.html @@ -1,20 +1,20 @@ - + - + Vault - Share