akihitohyh and Claude Opus 5
b56c61eccd
feat(admin): let admins restrict which public groups a user may access
...
Public groups have always been bindable by every user: CanBindGroup returned
true for any non-exclusive group, and user_allowed_groups only ever carried the
exclusive groups an admin had granted. Admins had no way to hand a single user
a subset of the public groups short of converting a group to exclusive, which
changes it for everyone already using it.
A user now carries restrict_public_groups. While it is false, which is the
default and what every existing row migrates to, nothing changes: every public
group stays bindable. Once an admin turns it on for a user, that user's public
groups are narrowed to the ones listed in user_allowed_groups, the same table
that already gates exclusive groups.
The flag is an administrative control, so it rides on the admin user DTO only
and leaves the shape of the end-user endpoints alone.
The model plaza filter honours the flag as well, so a restricted user is not
shown groups they would be refused when binding a key. Anonymous visitors have
no user record and keep the previous view.
Enforcement rides on the existing CanBindGroup choke point, so it covers key
creation, key updates, and per-request authorization together. An API key bound
to a group that is later withdrawn stops working at request time rather than
lingering as a key that can be listed but not used.
The admin dialog gains a toggle over the public group list. Turning it off
re-checks every public group, so an admin cannot save a list that reads as
restrictive while the restriction itself is disabled.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-28 02:40:17 +08:00
..
2026-08-23 16:53:28 +08:00
2026-08-17 20:25:28 +08:00
2026-08-19 19:03:39 +08:00
2026-08-19 19:03:39 +08:00
2026-08-17 13:34:41 +08:00
2026-08-15 10:37:51 +00:00
2026-08-17 20:25:28 +08:00
2026-08-19 06:35:11 -07:00
2026-08-19 06:35:11 -07:00
2026-08-24 15:58:47 +08:00
2026-08-21 16:37:25 +08:00
2026-08-21 16:37:25 +08:00
2026-08-17 20:25:28 +08:00
2026-08-20 18:40:05 +08:00
2026-08-25 21:28:57 +09:00
2026-08-24 13:28:33 +08:00
2026-08-21 02:33:00 +08:00
2026-08-22 13:34:05 +08:00
2026-08-20 13:57:25 +08:00
2026-08-24 13:28:33 +08:00
2026-08-12 03:22:06 +00:00
2026-08-19 14:58:32 +08:00
2026-08-17 13:34:41 +08:00
2026-08-19 14:58:32 +08:00
2026-08-19 04:40:32 +00:00
2026-08-28 02:40:17 +08:00
2026-08-28 02:40:17 +08:00
2026-08-15 10:37:51 +00:00
2026-08-24 16:07:27 +08:00
2026-08-25 13:13:08 +08:00
2026-08-25 13:13:08 +08:00
2026-08-14 02:40:18 +08:00
2026-08-22 11:21:39 +09:00
2026-08-24 16:07:27 +08:00
2026-08-24 14:20:18 +08:00
2026-08-24 14:20:18 +08:00
2026-08-24 16:07:27 +08:00
2026-08-24 16:07:27 +08:00
2026-08-28 02:40:17 +08:00
2026-08-14 00:25:55 +08:00
2026-08-14 00:25:55 +08:00
2026-08-28 02:40:17 +08:00
2026-08-28 02:40:17 +08:00
2026-08-25 10:40:02 +08:00
2026-08-25 10:40:02 +08:00
2026-08-17 13:49:46 +08:00
2026-08-18 15:02:25 +08:00
2026-08-18 15:02:25 +08:00
2026-08-12 21:36:41 +08:00
2026-08-12 21:36:41 +08:00
2026-08-15 10:37:51 +00:00
2026-08-24 11:16:00 +08:00
2026-08-24 11:16:00 +08:00
2026-08-13 07:49:08 +08:00
2026-08-24 11:05:57 +08:00
2026-08-17 19:45:07 +08:00
2026-08-25 11:02:29 +08:00
2026-08-24 10:50:52 +08:00
2026-08-24 10:50:52 +08:00
2026-08-24 10:50:52 +08:00
2026-08-24 10:50:52 +08:00
2026-08-18 04:03:13 +00:00
2026-08-18 04:51:06 +00:00
2026-08-18 05:57:41 +00:00
2026-08-18 10:28:28 +00:00
2026-08-18 10:28:28 +00:00
2026-08-18 10:28:28 +00:00
2026-08-18 10:28:28 +00:00
2026-08-18 04:51:02 +00:00
2026-08-18 10:28:28 +00:00
2026-08-18 05:57:41 +00:00
2026-08-18 10:28:28 +00:00
2026-08-19 06:35:11 -07:00
2026-08-19 13:01:25 +08:00
2026-08-19 06:35:11 -07:00
2026-08-23 00:30:27 +08:00
2026-08-23 00:30:27 +08:00
2026-08-20 15:31:35 +08:00
2026-08-15 10:37:51 +00:00
2026-08-20 18:18:45 +08:00
2026-08-20 18:18:45 +08:00
2026-08-18 10:28:28 +00:00
2026-08-17 04:07:06 +00:00
2026-08-17 04:07:06 +00:00
2026-08-18 10:28:28 +00:00
2026-08-20 18:40:05 +08:00
2026-08-22 14:43:40 +09:00
2026-08-25 21:28:57 +09:00
2026-08-24 23:09:30 +08:00
2026-08-25 21:28:57 +09:00
2026-08-22 14:43:40 +09:00
2026-08-23 00:30:27 +08:00
2026-08-23 00:30:27 +08:00
2026-08-14 23:25:31 +08:00
2026-08-14 22:34:43 +08:00
2026-08-14 22:34:43 +08:00
2026-08-14 22:34:43 +08:00
2026-08-14 22:34:43 +08:00
2026-08-24 09:03:37 +08:00
2026-08-20 22:01:20 -07:00
2026-08-15 10:37:51 +00:00
2026-08-24 11:05:57 +08:00
2026-08-25 11:02:29 +08:00
2026-08-21 14:24:32 +08:00
2026-08-21 17:49:07 +08:00
2026-08-21 14:24:32 +08:00
2026-08-24 13:05:12 +08:00
2026-08-19 23:13:29 -07:00
2026-08-23 16:53:28 +08:00
2026-08-22 14:43:40 +09:00
2026-08-22 14:43:40 +09:00
2026-08-16 08:29:12 +08:00
2026-08-23 16:53:28 +08:00
2026-08-19 06:35:11 -07:00
2026-08-19 06:35:11 -07:00
2026-08-22 14:43:40 +09:00
2026-08-25 21:28:57 +09:00
2026-08-24 11:05:57 +08:00
2026-08-25 11:02:29 +08:00
2026-08-24 10:50:52 +08:00
2026-08-21 14:24:32 +08:00
2026-08-18 11:24:39 +08:00
2026-08-18 11:24:39 +08:00
2026-08-23 18:38:11 +08:00
2026-08-23 18:38:11 +08:00
2026-08-17 16:48:36 +08:00
2026-08-13 08:38:10 +08:00
2026-08-20 09:50:23 -07:00
2026-08-20 09:12:52 -07:00
2026-08-20 09:12:52 -07:00
2026-08-20 09:12:52 -07:00
2026-08-13 07:49:14 +08:00
2026-08-13 01:23:37 +08:00
2026-08-13 01:23:37 +08:00
2026-08-24 22:14:45 +08:00
2026-08-13 07:49:14 +08:00
2026-08-13 07:49:14 +08:00
2026-08-24 22:14:45 +08:00
2026-08-13 07:49:14 +08:00
2026-08-20 06:43:31 -07:00
2026-08-20 06:43:31 -07:00
2026-08-20 09:12:52 -07:00
2026-08-21 08:49:44 +08:00
2026-08-20 08:07:04 -07:00
2026-08-20 08:07:04 -07:00
2026-08-24 22:14:45 +08:00
2026-08-13 07:49:08 +08:00
2026-08-20 01:02:49 -07:00
2026-08-19 09:03:37 -07:00
2026-08-24 13:05:12 +08:00
2026-08-17 10:59:43 +08:00
2026-08-24 10:50:52 +08:00
2026-08-24 10:50:52 +08:00
2026-08-19 06:35:11 -07:00
2026-08-19 06:35:11 -07:00
2026-08-24 16:07:27 +08:00
2026-08-24 14:20:18 +08:00
2026-08-24 14:20:18 +08:00
2026-08-20 21:06:48 -07:00
2026-08-25 20:25:22 +08:00
2026-08-25 20:25:22 +08:00
2026-08-19 23:13:29 -07:00
2026-08-14 18:18:53 +08:00
2026-08-24 01:25:54 +08:00
2026-08-24 13:28:33 +08:00
2026-08-22 16:06:04 +08:00
2026-08-17 19:45:07 +08:00
2026-08-22 16:06:04 +08:00
2026-08-24 14:54:05 +08:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 13:57:25 +08:00
2026-08-20 13:57:25 +08:00
2026-08-17 13:34:41 +08:00
2026-08-19 23:13:29 -07:00
2026-08-14 16:23:52 +08:00
2026-08-19 23:13:29 -07:00
2026-08-22 16:06:04 +08:00
2026-08-22 16:06:04 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-20 21:06:48 -07:00
2026-08-18 15:20:08 +08:00
2026-08-18 15:20:08 +08:00
2026-08-25 21:02:47 +09:00
2026-08-23 15:43:57 +09:00
2026-08-26 12:46:31 +09:00
2026-08-26 12:46:31 +09:00
2026-08-18 13:03:22 +08:00
2026-08-18 15:20:08 +08:00
2026-08-25 12:14:52 +08:00
2026-08-19 23:13:29 -07:00
2026-08-20 22:01:20 -07:00
2026-08-20 21:06:48 -07:00
2026-08-19 09:03:37 -07:00
2026-08-15 16:34:47 +08:00
2026-08-18 15:20:08 +08:00
2026-08-25 12:14:52 +08:00
2026-08-19 23:13:29 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-19 23:13:29 -07:00
2026-08-15 16:35:08 +08:00
2026-08-15 16:35:08 +08:00
2026-08-15 21:30:56 +08:00
2026-08-15 21:30:56 +08:00
2026-08-19 23:13:29 -07:00
2026-08-14 18:18:53 +08:00
2026-08-22 16:06:04 +08:00
2026-08-21 18:11:18 +08:00
2026-08-21 18:11:18 +08:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-19 23:13:29 -07:00
2026-08-24 09:03:37 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-24 11:52:48 +08:00
2026-08-15 21:30:56 +08:00
2026-08-17 04:07:06 +00:00
2026-08-17 04:07:06 +00:00
2026-08-25 12:14:52 +08:00
2026-08-26 09:42:28 +08:00
2026-08-24 10:59:52 +08:00
2026-08-24 10:59:52 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 10:59:52 +08:00
2026-08-24 22:14:45 +08:00
2026-08-19 23:13:29 -07:00
2026-08-26 09:42:28 +08:00
2026-08-25 19:40:39 +08:00
2026-08-19 10:41:47 +08:00
2026-08-24 09:03:37 +08:00
2026-08-26 15:29:01 +08:00
2026-08-13 01:23:37 +08:00
2026-08-21 08:49:44 +08:00
2026-08-24 09:03:37 +08:00
2026-08-19 19:04:53 +08:00
2026-08-19 19:04:53 +08:00
2026-08-19 23:13:29 -07:00
2026-08-20 00:19:59 -07:00
2026-08-24 22:14:45 +08:00
2026-08-20 15:46:53 +08:00
2026-08-20 12:37:39 +08:00
2026-08-24 22:14:45 +08:00
2026-08-20 08:16:17 -04:00
2026-08-24 13:05:12 +08:00
2026-08-24 11:52:48 +08:00
2026-08-19 23:13:29 -07:00
2026-08-26 09:42:28 +08:00
2026-08-15 10:37:51 +00:00
2026-08-22 09:26:23 +08:00
2026-08-22 12:38:05 +08:00
2026-08-22 12:38:05 +08:00
2026-08-22 12:38:05 +08:00
2026-08-19 23:13:29 -07:00
2026-08-25 20:25:22 +08:00
2026-08-23 16:53:28 +08:00
2026-08-25 21:28:57 +09:00
2026-08-25 21:28:57 +09:00
2026-08-19 23:13:29 -07:00
2026-08-20 21:06:48 -07:00
2026-08-19 23:13:29 -07:00
2026-08-23 20:49:36 +08:00
2026-08-24 09:03:37 +08:00
2026-08-26 15:29:01 +08:00
2026-08-24 11:52:48 +08:00
2026-08-22 01:04:11 +08:00
2026-08-25 21:28:38 +08:00
2026-08-17 19:45:07 +08:00
2026-08-19 09:03:37 -07:00
2026-08-21 17:38:39 +08:00
2026-08-25 21:28:38 +08:00
2026-08-26 09:42:28 +08:00
2026-08-25 20:25:22 +08:00
2026-08-24 13:28:33 +08:00
2026-08-21 14:24:32 +08:00
2026-08-22 12:14:19 +08:00
2026-08-22 12:14:19 +08:00
2026-08-22 11:21:39 +09:00
2026-08-24 14:37:48 +00:00
2026-08-24 14:37:48 +00:00
2026-08-24 14:37:48 +00:00
2026-08-19 23:13:29 -07:00
2026-08-24 09:03:37 +08:00
2026-08-21 18:01:16 +08:00
2026-08-21 18:01:16 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-25 12:14:52 +08:00
2026-08-24 09:03:37 +08:00
2026-08-14 16:23:52 +08:00
2026-08-22 12:14:19 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-24 13:28:33 +08:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 15:46:53 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 11:34:18 +08:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-25 12:14:52 +08:00
2026-08-25 12:14:52 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-24 17:03:44 +08:00
2026-08-24 17:03:44 +08:00
2026-08-23 20:49:36 +08:00
2026-08-25 12:14:52 +08:00
2026-08-20 21:06:48 -07:00
2026-08-19 23:13:29 -07:00
2026-08-22 16:06:04 +08:00
2026-08-19 23:13:29 -07:00
2026-08-15 16:48:40 +08:00
2026-08-20 20:10:57 +08:00
2026-08-20 20:10:57 +08:00
2026-08-20 21:06:48 -07:00
2026-08-24 09:03:37 +08:00
2026-08-15 21:30:56 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-25 12:14:52 +08:00
2026-08-20 20:10:57 +08:00
2026-08-25 12:14:52 +08:00
2026-08-25 17:08:27 +08:00
2026-08-25 17:08:27 +08:00
2026-08-22 16:06:04 +08:00
2026-08-25 21:45:24 +08:00
2026-08-22 12:14:19 +08:00
2026-08-24 11:52:48 +08:00
2026-08-24 14:54:05 +08:00
2026-08-19 18:51:21 +08:00
2026-08-22 16:06:04 +08:00
2026-08-25 21:28:57 +09:00
2026-08-25 21:28:57 +09:00
2026-08-19 23:13:29 -07:00
2026-08-17 19:45:07 +08:00
2026-08-17 20:25:28 +08:00
2026-08-17 20:25:28 +08:00
2026-08-19 23:13:29 -07:00
2026-08-21 23:43:09 +08:00
2026-08-19 23:13:29 -07:00
2026-08-19 23:13:29 -07:00
2026-08-20 22:01:20 -07:00
2026-08-20 22:01:20 -07:00
2026-08-20 21:06:48 -07:00
2026-08-20 21:06:48 -07:00
2026-08-25 12:14:52 +08:00
2026-08-25 12:14:52 +08:00
2026-08-22 19:35:31 +08:00
2026-08-22 19:35:31 +08:00
2026-08-17 10:52:57 +08:00
2026-08-17 10:52:57 +08:00
2026-08-20 21:06:48 -07:00
2026-08-20 22:01:20 -07:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 10:02:06 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:50:46 +08:00
2026-08-24 09:03:37 +08:00
2026-08-24 12:21:06 +08:00
2026-08-25 19:40:39 +08:00
2026-08-25 19:40:39 +08:00
2026-08-22 11:21:39 +09:00
2026-08-15 16:48:40 +08:00
2026-08-22 10:26:56 -07:00
2026-08-25 19:40:39 +08:00
2026-08-13 09:22:38 +08:00
2026-08-19 13:01:25 +08:00
2026-08-19 14:05:52 +08:00
2026-08-19 14:05:52 +08:00
2026-08-19 14:05:52 +08:00
2026-08-19 14:58:32 +08:00
2026-08-23 16:53:28 +08:00
2026-08-23 16:53:28 +08:00
2026-08-20 05:44:21 -07:00
2026-08-20 04:26:15 -07:00
2026-08-19 23:13:29 -07:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-20 04:26:15 -07:00
2026-08-18 04:51:02 +00:00
2026-08-19 23:13:29 -07:00
2026-08-24 09:03:37 +08:00
2026-08-24 09:03:37 +08:00
2026-08-17 10:59:43 +08:00
2026-08-17 10:59:43 +08:00
2026-08-20 21:06:48 -07:00
2026-08-15 10:37:51 +00:00
2026-08-20 13:57:25 +08:00
2026-08-20 13:57:25 +08:00
2026-08-26 12:46:31 +09:00
2026-08-26 12:46:31 +09:00
2026-08-19 11:34:18 +08:00
2026-08-23 16:53:28 +08:00
2026-08-23 16:53:28 +08:00
2026-08-24 11:52:48 +08:00
2026-08-19 06:35:11 -07:00
2026-08-19 06:35:11 -07:00
2026-08-28 02:40:17 +08:00
2026-08-28 02:40:17 +08:00
2026-08-28 02:40:17 +08:00
2026-08-24 14:39:59 +08:00