| Age | Commit message (Collapse) | Author | |
|---|---|---|---|
| 2026-08-03 | Remove pointer to wiki.github, it's dead | erdgeist | |
| 2026-08-03 | Restore public tags path under global scope | erdgeist | |
| 2026-08-03 | Reroute events, tags, menuitems under /admin and reture events-without-a-page view | erdgeist | |
| 2026-08-03 | Share one flag stack between the account roster and the events list | erdgeist | |
| 2026-08-03 | Render dates, booleans and counts through the locale files | erdgeist | |
| 2026-08-03 | Bump ruby to 3.4.10 | erdgeist | |
| 2026-08-03 | Believe the file over the browser about what was uploaded | erdgeist | |
| 2026-08-03 | Run ImageMagick under a policy that travels with the project | erdgeist | |
| 2026-08-03 | Update the HTML sanitizer and Rails to their security releases | erdgeist | |
| 2026-08-03 | Make tinymce use the admin chromes' light/dark scheme | erdgeist | |
| 2026-08-03 | Link each account to its own entries in the log | erdgeist | |
| 2026-08-03 | Display stale accounts in users#index | erdgeist | |
| 2026-08-03 | Display last login date in users#show | erdgeist | |
| 2026-08-02 | Log user logins and reconstruct last activity from logs | erdgeist | |
| 2026-08-02 | Report changing the end time of an event in action log | erdgeist | |
| 2026-08-02 | Let an event start without ending | erdgeist | |
| 2026-08-02 | Witness calendar entries | erdgeist | |
| 2026-08-02 | Prepare the user list for stacked account flags | erdgeist | |
| 2026-08-02 | Add #edit_grid class to translation editor so that CSS rules will match | erdgeist | |
| 2026-08-02 | Let pagination wrap | erdgeist | |
| 2026-08-02 | Witness account creation | erdgeist | |
| 2026-08-02 | Give the session cookie a lifetime so it survives app switches | erdgeist | |
| 2026-08-02 | Pick an existing translation when none has changed | erdgeist | |
| 2026-08-02 | Test the neighbour revision pair arithmetic | erdgeist | |
| 2026-08-02 | Say when a translation is unchanged and where to look instead | erdgeist | |
| 2026-08-02 | Test that aggregate? keeps the attributes the editor permits | erdgeist | |
| 2026-08-02 | Repair unreachable and one-sided locale keys | erdgeist | |
| 2026-08-02 | Keep the compared translation independent of the interface language | erdgeist | |
| 2026-08-02 | Let the sanitizer honour what the editor permits | erdgeist | |
| 2026-08-02 | Stop reporting line-ending differences as edits | erdgeist | |
| 2026-08-02 | Keep link titles when the editor reserialises | erdgeist | |
| 2026-08-01 | Remove superflous experimental border rule for disclosure | erdgeist | |
| 2026-08-01 | Fix the malformed font-size declaration in the disclosure row | erdgeist | |
| 2026-08-01 | Make the whole disclosure row reach its report | erdgeist | |
| 2026-08-01 | Add partial for disclosure realm | erdgeist | |
| 2026-08-01 | Report validation failures without the exception preamble | erdgeist | |
| 2026-08-01 | Derive the Atom feed timestamp from its entries | erdgeist | |
| 2026-08-01 | Require a second factor for elevation, not for holding admin | erdgeist | |
| 2026-08-01 | tidy up user list, make otp flag more visible | erdgeist | |
| 2026-08-01 | Allow aggregate to order by slug and paint chapters list more nicely | erdgeist | |
| 2026-08-01 | Fix some spacing issues in user table and the wrapper | erdgeist | |
| 2026-08-01 | Let Redaktion grant and revoke its own role | erdgeist | |
| Any holder may add or remove another account, witnessed as redaktion_grant/revoke so the vouching is legible. Not behind elevation: onboarding must not wait for a keyholder, and a compromised Redaktion account can already publish. | |||
| 2026-08-01 | Show and extend the elevation window | erdgeist | |
| A banner appears while elevated, counting down in minutes and carrying extend and drop controls. Three extensions of 30 minutes are allowed, so the window is at most two hours without a fresh code; a code resets the budget. The countdown is advisory, the server-side check authoritative, so it says "expired" rather than vanishing. The post-login flash tells an admin the timer has started. | |||
| 2026-08-01 | Require a fresh second factor for user management | erdgeist | |
| Administrative actions are gated behind a 30-minute elevation window: creating and retiring accounts, editing roles, clearing a second factor. Reading the list is not gated, and content work is untouched. elevated? is tied to is_admin?, so losing the role closes the window at once. The window opens when the second factor verifies at login, so an admin heading straight for user management is already elevated, and closes on logout with the other session state. Five wrong codes end the session, mirroring the login challenge. users#update carries no elevation filter, since self-service reaches it; the role field is gated in user_params instead and fails closed. | |||
| 2026-08-01 | Add rake users:clear_otp as the second-factor recovery path | erdgeist | |
| 2026-08-01 | Add escape hatch rake task should all admins lose their 2nd factor | erdgeist | |
| 2026-08-01 | Declare role requirements per controller | erdgeist | |
| RoleRequired supplies require_redaktion and require_admin for surfaces that are not nodes and so cannot be reached by Node#restricted?. Navigation is content rather than plumbing, so menu_items requires redaktion. User management is janitorial and requires admin: index, new, create, reset_otp, deactivate, reactivate. verify_status now also covers show, without which any logged-in user could read any account by walking a small id space. Editing your own account stays open. The dashboard hides the Users and Navigation buttons from those who cannot use them; everything else stays visible to everyone. Both denials share one message and land on the dashboard. Adds redella (redaktion) and alufa (redaktion + alumni) fixtures. | |||
| 2026-07-31 | Warn before the gate refuses, and check restore destinations | erdgeist | |
| nodes#new marks the kinds that place under /updates, derived from each kind's own path_prefix. The three parent pickers mark candidates the current user cannot publish into; menu_search returns needs_redaktion per result, computed per user rather than as a bare restricted flag, and the menu-item picker opts out. restore_from_trash! checks its destination: the restore is the move, applied rather than staged, so no later publish would have caught it. The node returns as a draft either way. | |||
| 2026-07-31 | Show the gate before it refuses, and check the destination | erdgeist | |
| nodes#show renders publish and trash as disabled_action spans with a hint naming what an editor can still do, matching how locked_by_other already reads. Editing and reverting stay live: drafting is free everywhere. | |||
| 2026-07-31 | Bind aggregates over scoped tags to their subtree | erdgeist | |
| CccConventions::TAG_SCOPES maps "update" and "pressemitteilung" to /updates and "disclosure" to /disclosure. Page.aggregate applies the mapping, so an aggregate over one of those tags is bounded by its subtree regardless of what the shortcode says. Tags stay unrestricted; positions are publish-gated. Both RSS actions call Page.aggregate rather than repeating its tag join. Empty feeds no longer crash: Atom falls back to the current time for the required <updated>, and the optional dc:date is omitted. | |||
