<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/app/controllers/concerns, branch master</title>
<subtitle>[no description]</subtitle>
<id>http://erdgeist.org/gitweb/cccms/atom?h=master</id>
<link rel='self' href='http://erdgeist.org/gitweb/cccms/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/'/>
<updated>2026-07-31T23:10:35Z</updated>
<entry>
<title>Require a fresh second factor for user management</title>
<updated>2026-07-31T23:10:35Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-31T23:10:35Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=f6c1f0f08f031778a491465d35ac694bfcdc12b0'/>
<id>urn:sha1:f6c1f0f08f031778a491465d35ac694bfcdc12b0</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Declare role requirements per controller</title>
<updated>2026-07-31T22:27:34Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-31T22:27:34Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=8bcacace28df52fd972c54e6850aa3b93f5c8bdf'/>
<id>urn:sha1:8bcacace28df52fd972c54e6850aa3b93f5c8bdf</id>
<content type='text'>
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.
</content>
</entry>
<entry>
<title>Pin admin content reads to the default locale</title>
<updated>2026-07-27T09:16:14Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-27T09:16:14Z</published>
<link rel='alternate' type='text/html' href='http://erdgeist.org/gitweb/cccms/commit/?id=6c20570d2a4c6cb698d0a08dbcb86ecc2a25a131'/>
<id>urn:sha1:6c20570d2a4c6cb698d0a08dbcb86ecc2a25a131</id>
<content type='text'>
</content>
</entry>
</feed>
