diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-31 18:14:30 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-31 18:14:30 +0200 |
| commit | 464af1625349d557f688da9f845471ef8b80a5f9 (patch) | |
| tree | aab415abf115f20ccbcdfad49c27ce5d1bd61134 /app/controllers/assets_controller.rb | |
| parent | 8c6a6516e1dc5c1b4f12740a6f7b32765b530bb7 (diff) | |
Gate live-content changes on restricted surfaces
publish_draft!, trash!, destroy_from_trash!, attach_asset! and
Asset#destroy_witnessed! now refuse unless the acting user holds redaktion,
and only when the subject is on a restricted surface: the front page, the
updates tree that feeds ~100k subscribers, or disclosure. Drafting,
autosaving, tagging and creating stay free everywhere for everyone.
Enforcement is in the models rather than the controllers, since attach_asset!
and the rest are reachable from rake tasks and internal paths. It follows the
errors.add-plus-bare-raise pattern the rest of Node already uses, so every
existing RecordInvalid rescue reports it with a localised message; only
assets_controller#destroy needed a rescue added.
A nil user is treated as a system context and bypasses the gate. The default
nil on three of those verbs is what makes that reachable, and removing those
defaults once every call site passes a user is the next tightening.
Diffstat (limited to 'app/controllers/assets_controller.rb')
| -rw-r--r-- | app/controllers/assets_controller.rb | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb index 988d56d1..03780c69 100644 --- a/app/controllers/assets_controller.rb +++ b/app/controllers/assets_controller.rb | |||
| @@ -93,6 +93,12 @@ class AssetsController < ApplicationController | |||
| 93 | format.html { redirect_to(assets_url) } | 93 | format.html { redirect_to(assets_url) } |
| 94 | format.xml { head :ok } | 94 | format.xml { head :ok } |
| 95 | end | 95 | end |
| 96 | rescue ActiveRecord::RecordInvalid => e | ||
| 97 | flash[:error] = e.message | ||
| 98 | respond_to do |format| | ||
| 99 | format.html { redirect_to(asset_path(@asset)) } | ||
| 100 | format.xml { head :forbidden } | ||
| 101 | end | ||
| 96 | end | 102 | end |
| 97 | 103 | ||
| 98 | private | 104 | private |
