diff --git a/vault/controllers/main.py b/vault/controllers/main.py index 56a6486b1f..fa311c71d4 100644 --- a/vault/controllers/main.py +++ b/vault/controllers/main.py @@ -55,7 +55,7 @@ def vault_inbox(self, token): return request.render("vault.inbox", ctx) try: - inbox.store_in_inbox( + result = inbox.store_in_inbox( name, secret, secret_file, @@ -72,6 +72,10 @@ def vault_inbox(self, token): ) return request.render("vault.inbox", ctx) + if not result: + ctx["error"] = _("This link is no longer active") + return request.render("vault.inbox", ctx) + ctx["message"] = _("Successfully stored") return request.render("vault.inbox", ctx) diff --git a/vault/models/vault_inbox.py b/vault/models/vault_inbox.py index cdae12e616..fe0d14ab90 100644 --- a/vault/models/vault_inbox.py +++ b/vault/models/vault_inbox.py @@ -43,6 +43,7 @@ class VaultInbox(models.Model): help="If expired the inbox can't be written using the link", ) log_ids = fields.One2many("vault.inbox.log", "inbox_id", "Log", readonly=True) + writable = fields.Boolean(compute="_compute_writable") _sql_constraints = [ ( @@ -52,6 +53,14 @@ class VaultInbox(models.Model): ), ] + @api.depends("accesses", "expiration") + def _compute_writable(self): + now = datetime.now() + for rec in self: + rec.writable = rec.accesses > 0 and ( + not rec.expiration or now < rec.expiration + ) + @api.depends("token") def _compute_inbox_link(self): base_url = self.env["ir.config_parameter"].sudo().get_param("web.base.url") diff --git a/vault/tests/__init__.py b/vault/tests/__init__.py index 59ea2f2ef1..2dc77f6fea 100644 --- a/vault/tests/__init__.py +++ b/vault/tests/__init__.py @@ -3,6 +3,7 @@ from . import ( test_controller, + test_inbox, test_log, test_rights, test_user, diff --git a/vault/tests/test_controller.py b/vault/tests/test_controller.py index 3cf770ae2d..7add784398 100644 --- a/vault/tests/test_controller.py +++ b/vault/tests/test_controller.py @@ -98,6 +98,20 @@ def load(response): self.assertEqual(self.inbox.secret, "secret") self.assertEqual(self.inbox.secret_file, b"file") + exhausted = self.env["vault.inbox"].create( + { + "user_id": self.user.id, + "name": "Exhausted", + "key": "4", + "iv": "1", + "secret": "kept secret", + "accesses": 0, + } + ) + response = load(self.controller.vault_inbox(exhausted.token)) + self.assertEqual(response["error"], "Invalid token") + self.assertEqual(exhausted.secret, "kept secret") + # Test a duplicate inbox self.inbox.copy().token = self.inbox.token response = load(self.controller.vault_inbox(self.inbox.token)) diff --git a/vault/tests/test_inbox.py b/vault/tests/test_inbox.py index a095b782be..7456c9a11a 100644 --- a/vault/tests/test_inbox.py +++ b/vault/tests/test_inbox.py @@ -72,6 +72,32 @@ def test_inbox(self): self.assertEqual(inbox, model.find_inbox(inbox.token)) self.assertEqual(model, model.find_inbox(uuid4())) + def test_writable(self): + model = self.env["vault.inbox"] + user = self.env.user + inbox = model.store_in_inbox( + name=f"Inbox {user.name}", + secret="secret", + iv="iv", + user=user, + key="key", + secret_file="", + filename="", + ) + + inbox.accesses = 5 + self.assertTrue(inbox.writable) + + inbox.accesses = 0 + self.assertFalse(inbox.writable) + + inbox.accesses = 5 + inbox.expiration = datetime(1970, 1, 1) + self.assertFalse(inbox.writable) + + inbox.expiration = False + self.assertTrue(inbox.writable) + def test_send_wizard(self): user = self.env.user wiz = self.env["vault.send.wizard"].create( diff --git a/vault/views/vault_inbox_views.xml b/vault/views/vault_inbox_views.xml index 461edec8c2..707d8598a7 100644 --- a/vault/views/vault_inbox_views.xml +++ b/vault/views/vault_inbox_views.xml @@ -3,7 +3,8 @@ vault.inbox - + + @@ -15,10 +16,17 @@
+ +