Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion vault/controllers/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)

Expand Down
9 changes: 9 additions & 0 deletions vault/models/vault_inbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [
(
Expand All @@ -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")
Expand Down
1 change: 1 addition & 0 deletions vault/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from . import (
test_controller,
test_inbox,
test_log,
test_rights,
test_user,
Expand Down
14 changes: 14 additions & 0 deletions vault/tests/test_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
26 changes: 26 additions & 0 deletions vault/tests/test_inbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
10 changes: 9 additions & 1 deletion vault/views/vault_inbox_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
<record id="view_vault_inbox_tree" model="ir.ui.view">
<field name="model">vault.inbox</field>
<field name="arch" type="xml">
<list create="false">
<list create="false" decoration-muted="not writable">
<field name="writable" column_invisible="1" />
<field name="name" />
<field name="inbox_link" widget="url" />
</list>
Expand All @@ -15,10 +16,17 @@
<field name="arch" type="xml">
<form create="false">
<sheet>
<widget
name="web_ribbon"
title="Readonly"
bg_color="text-bg-danger"
invisible="not writable"
/>
<field name="user_id" invisible="1" />
<field name="iv" invisible="1" />
<field name="key" invisible="1" />
<field name="filename" invisible="1" />
<field name="writable" invisible="1" />
<group>
<field name="inbox_link" widget="url" />
<field name="name" />
Expand Down
Loading