Skip to content

Commit 8130bb6

Browse files
committed
[FIX] vault: do not present exhausted inboxes as writable
An inbox that can no longer be written to (access counter at 0 or expired) still showed its writable inbox link, and submitting to it silently did nothing while the form reported 'Successfully stored'. This is misleading for received/delivered secrets which are created with accesses = 0. - Add a computed 'writable' flag (accesses left and not expired) and hide the inbox link in the list and form views when it is not writable. - Make the controller report 'This link is no longer active' when store_in_inbox performs no write instead of a false success message. - Cover the exhausted-inbox submit path in the controller test.
1 parent 1acf60a commit 8130bb6

5 files changed

Lines changed: 62 additions & 3 deletions

File tree

vault/controllers/main.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def vault_inbox(self, token):
5959
return request.render("vault.inbox", ctx)
6060

6161
try:
62-
inbox.store_in_inbox(
62+
result = inbox.store_in_inbox(
6363
name,
6464
secret,
6565
secret_file,
@@ -76,6 +76,10 @@ def vault_inbox(self, token):
7676
)
7777
return request.render("vault.inbox", ctx)
7878

79+
if not result:
80+
ctx["error"] = _("This link is no longer active")
81+
return request.render("vault.inbox", ctx)
82+
7983
ctx["message"] = _("Successfully stored")
8084
return request.render("vault.inbox", ctx)
8185

vault/models/vault_inbox.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class VaultInbox(models.Model):
4343
help="If expired the inbox can't be written using the link",
4444
)
4545
log_ids = fields.One2many("vault.inbox.log", "inbox_id", "Log", readonly=True)
46+
writable = fields.Boolean(compute="_compute_writable")
4647

4748
_sql_constraints = [
4849
(
@@ -52,6 +53,14 @@ class VaultInbox(models.Model):
5253
),
5354
]
5455

56+
@api.depends("accesses", "expiration")
57+
def _compute_writable(self):
58+
now = datetime.now()
59+
for rec in self:
60+
rec.writable = rec.accesses > 0 and (
61+
not rec.expiration or now < rec.expiration
62+
)
63+
5564
@api.depends("token")
5665
def _compute_inbox_link(self):
5766
base_url = self.env["ir.config_parameter"].sudo().get_param("web.base.url")

vault/tests/test_controller.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,20 @@ def load(response):
108108
self.assertEqual(self.inbox.secret, "secret")
109109
self.assertEqual(self.inbox.secret_file, b"file")
110110

111+
exhausted = self.env["vault.inbox"].create(
112+
{
113+
"user_id": self.user.id,
114+
"name": "Exhausted",
115+
"key": "4",
116+
"iv": "1",
117+
"secret": "kept secret",
118+
"accesses": 0,
119+
}
120+
)
121+
response = load(self.controller.vault_inbox(exhausted.token))
122+
self.assertEqual(response["error"], "This link is no longer active")
123+
self.assertEqual(exhausted.secret, "kept secret")
124+
111125
# Test a duplicate inbox
112126
self.inbox.copy().token = self.inbox.token
113127
response = load(self.controller.vault_inbox(self.inbox.token))

vault/tests/test_inbox.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,32 @@ def test_inbox(self):
7272
self.assertEqual(inbox, model.find_inbox(inbox.token))
7373
self.assertEqual(model, model.find_inbox(uuid4()))
7474

75+
def test_writable(self):
76+
model = self.env["vault.inbox"]
77+
user = self.env.user
78+
inbox = model.store_in_inbox(
79+
name=f"Inbox {user.name}",
80+
secret="secret",
81+
iv="iv",
82+
user=user,
83+
key="key",
84+
secret_file="",
85+
filename="",
86+
)
87+
88+
inbox.accesses = 5
89+
self.assertTrue(inbox.writable)
90+
91+
inbox.accesses = 0
92+
self.assertFalse(inbox.writable)
93+
94+
inbox.accesses = 5
95+
inbox.expiration = datetime(1970, 1, 1)
96+
self.assertFalse(inbox.writable)
97+
98+
inbox.expiration = False
99+
self.assertTrue(inbox.writable)
100+
75101
def test_send_wizard(self):
76102
user = self.env.user
77103
wiz = self.env["vault.send.wizard"].create(

vault/views/vault_inbox_views.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
<field name="model">vault.inbox</field>
55
<field name="arch" type="xml">
66
<list create="false">
7+
<field name="writable" column_invisible="1" />
78
<field name="name" />
8-
<field name="inbox_link" widget="url" />
9+
<field name="inbox_link" widget="url" invisible="not writable" />
910
</list>
1011
</field>
1112
</record>
@@ -19,8 +20,13 @@
1920
<field name="iv" invisible="1" />
2021
<field name="key" invisible="1" />
2122
<field name="filename" invisible="1" />
23+
<field name="writable" invisible="1" />
2224
<group>
23-
<field name="inbox_link" widget="url" />
25+
<field
26+
name="inbox_link"
27+
widget="url"
28+
invisible="not writable"
29+
/>
2430
<field name="name" />
2531
<field name="accesses" />
2632
<field name="expiration" />

0 commit comments

Comments
 (0)