hataa
47d8ff13b2
feat(authz): account disable/enable across every authentication surface ( #4063 gap 3) ( #6566 )
...
* feat(authz): account disable/enable across every authentication surface (#4063 gap 3)
Vertical slice 1 of the user-lifecycle work: an operator can suspend an
account and every authentication surface rejects it, while the row —
credentials, role, OAuth linkage — is retained so re-enabling restores
exactly what was suspended.
- users.disabled (NOT NULL, server default 0) via migration
0036_user_disabled; User/UserResponse carry and expose it.
- Enforcement at all four surfaces: password login (no credential
comparison happens), JWT session resolution (401 ACCOUNT_DISABLED —
sessions die at the next request), PAT resolution (the generic 401, no
oracle), OAuth provisioning (403 with a contact-admin message; the
link is kept so re-enable restores access).
- SQLiteUserRepository.set_disabled: single-column, serialized write
(same idiom as update_system_role) with the last-ACTIVE-admin guard —
disabled admins cannot authenticate, so they cannot restore management
access; re-enabling is always allowed. Field-scoping completed both
ways: the credential writer mirrors and never writes disabled, so
a stale password-change snapshot cannot re-enable a suspended account.
- PATCH /api/v1/admin/users/{id} becomes a partial account update
(system_role and/or disabled), each field routed to its field-scoped
writer; empty bodies 422.
Tests 11->18: route (disable/re-enable, last-active-admin 409, empty
422, combined update), real-repo (field isolation both directions,
disabled-admin-not-active, guard inside the serialized write, re-enable
always), login rejection with the CORRECT password (only the disabled
gate can reject) plus resolver-visible flag. Mutations verified red:
guard removed (M19), login gate removed (M20 — after hardening the test
with a real hash so the gate is load-bearing).
* fix(authz): portable boolean default, alternate-authenticator suspension, active-admin role guard
Review round 1 on #6566 — three P1s:
- [PG default] sa.text("0") is a raw integer expression PostgreSQL
rejects as a BOOLEAN default, breaking startup migration and fresh
create_all bootstraps alike. Both the migration and the ORM model now
use sa.false()/false() — dialect-rendered, portable.
- [alternate authenticators] WebSockets bypass AuthMiddleware, so a
disabled user's still-valid cookie could open a NEW browser/stream
connection and drive the retained session; the standalone LangGraph
authenticate callback accepted the same suspended JWT. Both now route
through a shared post-lookup validator (validate_resolved_session_user
in deps.py — token_version + disabled in one place) that the HTTP
dependency also uses, so a lifecycle change lands everywhere at once.
- [active-admin role guard] update_system_role counted every admin row,
so 'disable B, then demote self' — or a combined {system_role, disabled}
self-update — could strand the deployment with zero administrators able
to authenticate or re-enable anyone. The demotion guard now counts
ACTIVE admins only (disabled admins cannot authenticate), under the same
serialization boundary.
Tests 18->22: shared-validator verdicts, WS admission after suspension
(real token, real repo), LangGraph-callback admission after suspension,
disable-then-demote-self + combined self-update both rejected (fake-repo
route level and real-repo update_system_role level). Mutations verified
red: helper's disabled check removed (M21 — three admission tests fail),
active-admin predicate reverted to all-admins (M22 — repo-level strand
scenario fails). 366 tests green on the affected surface.
* fix(migrations): chain 0036_user_disabled after upstream 0037
The maintainer main-merge brought 0037_project_document_summaries,
which branched from 0035 independently of this PR's 0036 — alembic now
sees two heads and every engine bootstrap fails. Chain 0036 after 0037
(single head; revision numbers are labels, the graph is what matters).
* fix(migrations): renumber user_disabled to 0038 and follow the chain-test convention
Upstream landed its own 0036 (run_idempotency_request) with 0037 chained
after it while this PR was in review — my 0036_user_disabled collided on
the number and my interim chain-fix (0036 revises 0037) left the graph
in a state upstream's chain tests reject (heads == [0037] hardcoded).
- 0036_user_disabled -> 0038_user_disabled, revises
0037_project_document_summaries: single head 0038.
- Chain tests follow the repo convention (each migration PR appends the
new head): 0032/0035 gain the DOC_SUMMARIES link and CURRENT_HEAD =
0038; 0037's single-head assertion moves to CURRENT_HEAD with its
own-revision link check unchanged.
* fix(migrations): pin the remaining chain tests to the 0038_user_disabled head
The 0027/0028, 0029 and 0034 chain tests still pinned the single head to
0037_project_document_summaries (and 0034 asserted the head's parent was
0036_run_idempotency_request), so the renumbered lifecycle migration broke
two unit-test shards. Follow the chain-test convention: every pinned head
moves to 0038_user_disabled and 0034 walks the chain through 0037.
* fix(authz): enforce account suspension on the internal-auth dispatch surface
Round-3 review finding: the internal-auth principal is synthesized from
trusted headers without a users-row lookup, so a suspended user with an
active channel binding kept driving the agent, and scheduler-owned runs
(their fabricated in-process requests skip AuthMiddleware entirely) kept
launching. Two gates now enforce the lifecycle there:
- AuthMiddleware rejects owner-bound internal calls whose users row is
disabled (401 account_disabled) at the single gate every internal HTTP
call passes through. Auth-disabled mode is exempt (no suspendable
accounts, and its owner header carries the synthetic identity), and
owner ids without a users row stay allowed — a nonexistent account
cannot be suspended.
- start_run re-asserts it at run admission after the owner is resolved
for attribution: the scheduler records the rejection as the
occurrence's launch error and no run record is created.
Also addresses the remaining round-3 nits: drop the inline token_version
check duplicated by validate_resolved_session_user, correct the
local_provider comment (login never surfaces ACCOUNT_DISABLED), refresh
the stale 0038 docstring header, and restore the deps module caches in
the two suspension tests instead of leaking a closed engine.
* fix(auth): carry the disabled field on the frontend synthetic users
UserResponse now always includes disabled, so the auth-disabled contract
e2e (gateway /auth/me deep-equals the frontend synthetic user) failed
without the field on AUTH_DISABLED_USER. Add disabled to both synthetic
users and declare it optional on the zod schema — absent still parses as
not disabled for pre-gap-3 backends.
* fix(authz): log when the internal-owner suspension check is skipped
The middleware gate's users-lookup failure path silently degraded to
allow; keep the fail-open behavior but leave a WARNING with the
exception, so a store that cannot be read is observable in production
logs instead of invisible.
---------
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
2026-10-10 16:43:04 +08:00
..
2026-10-10 14:00:00 +08:00
2026-09-27 11:09:41 +08:00
2026-07-19 18:26:26 +08:00
2026-10-07 18:37:31 +08:00
2026-05-12 23:18:54 +08:00
2026-10-08 09:55:54 +08:00
2026-09-14 11:10:41 +08:00
2026-10-07 10:22:15 +08:00
2026-07-26 14:43:08 +08:00
2026-09-29 16:53:18 +08:00
2026-06-01 15:50:39 +08:00
2026-10-07 07:47:32 +08:00
2026-10-07 17:16:48 +08:00
2026-09-15 07:26:08 +08:00
2026-10-10 10:32:31 +08:00
2026-09-01 16:49:39 +08:00
2026-07-21 11:46:33 +08:00
2026-09-22 10:38:16 +08:00
2026-06-21 20:56:42 +08:00
2026-06-08 12:35:03 +08:00
2026-10-08 19:55:26 +08:00
2026-07-22 14:47:08 +08:00
2026-08-30 10:30:34 +08:00
2026-10-09 16:09:17 +08:00
2026-07-17 15:11:15 +08:00
2026-10-10 16:43:04 +08:00
2026-09-27 08:06:03 +08:00
2026-09-12 11:09:41 +08:00
2026-10-10 09:52:40 +08:00
2026-09-20 16:31:35 +08:00
2026-09-14 18:17:54 +08:00
2026-10-07 09:39:26 +08:00
2026-09-20 16:31:35 +08:00
2026-10-05 19:45:54 +08:00
2026-09-19 12:14:24 +08:00
2026-10-06 10:20:38 +08:00
2026-10-10 07:56:09 +08:00
2026-09-04 23:46:57 +08:00
2026-10-10 07:56:09 +08:00
2026-09-04 23:46:57 +08:00
2026-09-22 19:49:00 +08:00
2026-10-10 07:56:09 +08:00
2026-10-03 14:29:41 +08:00
2026-06-23 10:39:40 +08:00
2026-10-07 09:39:26 +08:00
2026-09-12 07:12:37 +08:00
2026-09-27 11:09:41 +08:00
2026-10-10 10:07:50 +08:00
2026-10-10 10:07:50 +08:00
2026-09-27 11:09:41 +08:00
2026-09-27 11:09:41 +08:00
2026-09-27 11:09:41 +08:00
2026-10-04 19:39:50 +08:00
2026-09-12 07:41:24 +08:00
2026-05-29 23:05:59 +08:00
2026-09-17 22:13:53 +08:00
2026-05-16 09:24:40 +08:00
2026-09-23 15:37:26 +08:00
2026-10-10 16:43:04 +08:00
2026-10-07 14:59:16 +08:00
2026-10-09 17:22:45 +08:00
2026-10-01 18:26:58 +08:00
2026-08-23 09:57:12 +08:00
2026-07-17 14:49:51 +08:00
2026-07-17 14:49:51 +08:00
2026-09-23 15:37:26 +08:00
2026-07-23 22:51:35 +08:00
2026-07-23 22:51:35 +08:00
2026-10-10 08:53:51 +08:00
2026-09-23 08:33:20 +08:00
2026-06-24 13:57:12 +08:00
2026-09-28 15:13:34 +08:00
2026-10-01 18:26:58 +08:00
2026-10-07 18:37:31 +08:00
2026-10-07 18:43:31 +08:00
2026-09-25 21:40:41 +08:00
2026-09-01 22:36:31 +08:00
2026-09-12 21:09:05 +08:00
2026-09-03 08:17:26 +08:00
2026-09-12 16:20:31 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-08-29 14:36:38 +08:00
2026-09-20 20:01:28 +08:00
2026-09-27 10:43:19 +08:00
2026-10-10 00:20:45 +08:00
2026-10-04 06:46:13 +08:00
2026-09-08 19:21:57 +08:00
2026-09-03 08:17:26 +08:00
2026-10-09 18:22:06 +08:00
2026-09-22 11:18:57 +08:00
2026-10-04 09:09:15 +08:00
2026-10-05 13:38:17 +08:00
2026-07-26 08:00:48 +08:00
2026-10-10 09:52:40 +08:00
2026-09-28 14:35:42 +08:00
2026-10-04 19:27:54 +08:00
2026-10-04 16:36:01 +08:00
2026-09-15 08:14:42 +08:00
2026-10-07 07:07:53 +08:00
2026-10-05 12:15:21 +08:00
2026-10-03 10:05:47 +08:00
2026-10-08 21:14:26 +08:00
2026-10-10 14:05:35 +08:00
2026-09-19 12:14:24 +08:00
2026-10-10 14:00:00 +08:00
2026-08-05 08:29:22 +08:00
2026-08-31 23:18:34 +08:00
2026-09-24 15:16:08 +08:00
2026-08-02 22:25:02 +08:00
2026-07-14 07:37:59 +08:00
2026-09-19 12:14:24 +08:00
2026-09-19 12:14:24 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 08:26:53 +08:00
2026-10-07 10:22:15 +08:00
2026-06-18 10:15:31 +08:00
2026-10-07 10:22:15 +08:00
2026-10-09 20:56:26 +08:00
2026-10-10 14:00:00 +08:00
2026-09-24 15:11:49 +08:00
2026-10-08 22:29:49 +08:00
2026-10-10 07:43:05 +08:00
2026-09-19 10:29:02 +08:00
2026-10-10 14:00:00 +08:00
2026-10-10 14:00:00 +08:00
2026-09-30 14:56:03 +08:00
2026-06-18 10:45:33 +08:00
2026-10-10 14:00:00 +08:00
2026-10-08 17:44:10 +08:00
2026-08-02 22:25:02 +08:00
2026-08-02 22:25:02 +08:00
2026-08-02 22:25:02 +08:00
2026-08-02 22:25:02 +08:00
2026-10-09 20:30:19 +08:00
2026-08-23 09:57:12 +08:00
2026-07-26 10:44:50 +08:00
2026-09-08 19:21:57 +08:00
2026-09-18 16:46:19 +08:00
2026-09-14 18:17:54 +08:00
2026-07-12 08:15:32 +08:00
2026-09-30 09:40:02 +08:00
2026-08-13 23:55:30 +08:00
2026-08-24 07:37:35 +08:00
2026-09-20 18:57:49 +08:00
2026-10-05 20:21:31 +08:00
2026-10-05 15:39:32 +08:00
2026-10-06 09:05:55 +08:00
2026-10-08 18:16:21 +08:00
2026-10-08 10:24:16 +08:00
2026-09-28 16:16:15 +08:00
2026-07-22 14:02:56 +08:00
2026-09-27 08:06:03 +08:00
2026-09-02 11:54:40 +08:00
2026-07-29 22:16:48 +08:00
2026-10-08 08:20:16 +08:00
2026-10-04 12:44:05 +08:00
2026-10-06 08:11:05 +08:00
2026-10-06 16:53:45 +08:00
2026-08-30 15:37:38 +08:00
2026-10-09 17:22:45 +08:00
2026-10-07 07:28:29 +08:00
2026-10-06 11:21:51 +08:00
2026-08-23 15:08:39 +08:00
2026-09-27 07:36:35 +08:00
2026-09-29 22:10:29 +08:00
2026-09-12 11:24:46 +08:00
2026-10-04 06:46:13 +08:00
2026-08-23 09:57:12 +08:00
2026-09-14 18:17:54 +08:00
2026-09-15 08:25:08 +08:00
2026-10-04 06:46:13 +08:00
2026-09-15 08:25:08 +08:00
2026-09-14 10:51:01 +08:00
2026-09-16 15:37:57 +08:00
2026-10-03 10:29:56 +08:00
2026-10-07 18:43:31 +08:00
2026-10-05 14:47:14 +08:00
2026-09-28 16:16:15 +08:00
2026-09-30 17:41:11 +08:00
2026-10-06 10:20:38 +08:00
2026-08-12 09:25:05 +08:00
2026-08-08 21:07:55 +08:00
2026-10-08 20:29:15 +08:00
2026-09-25 21:43:48 +08:00
2026-09-23 18:29:12 +08:00
2026-07-13 17:57:34 +08:00
2026-06-02 22:43:22 +08:00
2026-06-05 15:21:41 +08:00
2026-07-12 00:17:11 +08:00
2026-07-04 23:09:29 +08:00
2026-06-02 22:43:22 +08:00
2026-07-01 22:49:17 +08:00
2026-09-27 09:50:30 +08:00
2026-09-24 15:16:08 +08:00
2026-07-28 23:21:23 +08:00
2026-10-04 17:04:17 +08:00
2026-10-08 20:20:22 +08:00
2026-09-14 06:55:57 +08:00
2026-10-07 18:22:15 +08:00
2026-07-29 22:33:45 +08:00
2026-10-01 10:51:37 +08:00
2026-07-29 22:33:45 +08:00
2026-09-14 06:55:57 +08:00
2026-10-10 14:00:00 +08:00
2026-10-03 17:14:19 +08:00
2026-10-06 07:56:10 +08:00
2026-10-06 15:49:27 +08:00
2026-09-19 11:10:32 +08:00
2026-08-18 23:14:17 +08:00
2026-10-08 09:10:30 +08:00
2026-09-27 13:38:32 +08:00
2026-09-28 15:21:01 +08:00
2026-08-11 21:52:12 +08:00
2026-10-10 10:15:46 +08:00
2026-09-23 09:53:49 +08:00
2026-10-03 23:11:48 +08:00
2026-09-25 09:08:21 +08:00
2026-09-12 10:59:31 +08:00
2026-10-08 10:21:18 +08:00
2026-10-03 21:16:01 +08:00
2026-10-03 21:16:01 +08:00
2026-08-04 22:33:26 +08:00
2026-09-22 11:18:57 +08:00
2026-09-01 16:49:39 +08:00
2026-08-11 16:33:22 +08:00
2026-09-27 10:43:19 +08:00
2026-09-16 21:18:05 +08:00
2026-08-04 22:33:26 +08:00
2026-08-04 22:33:26 +08:00
2026-08-23 09:57:12 +08:00
2026-10-02 21:35:56 +08:00
2026-09-25 15:24:09 +08:00
2026-10-06 20:35:54 +08:00
2026-09-27 11:09:41 +08:00
2026-10-01 18:26:58 +08:00
2026-08-13 23:55:30 +08:00
2026-09-23 15:25:45 +08:00
2026-09-23 15:25:45 +08:00
2026-10-06 20:12:39 +08:00
2026-09-30 16:10:29 +08:00
2026-10-01 18:26:58 +08:00
2026-08-11 16:33:22 +08:00
2026-10-08 10:22:48 +08:00
2026-10-01 18:26:58 +08:00
2026-08-23 15:08:39 +08:00
2026-10-07 09:39:26 +08:00
2026-09-28 15:25:06 +08:00
2026-10-07 18:28:48 +08:00
2026-09-22 10:38:16 +08:00
2026-10-06 09:06:33 +08:00
2026-10-02 23:49:22 +08:00
2026-10-07 10:22:15 +08:00
2026-09-18 18:32:42 +08:00
2026-10-10 14:00:00 +08:00
2026-10-04 07:24:55 +08:00
2026-09-25 14:22:34 +08:00
2026-09-16 18:46:18 +08:00
2026-09-12 12:50:22 +08:00
2026-09-19 10:08:09 +08:00
2026-10-08 10:10:07 +08:00
2026-10-04 14:54:08 +08:00
2026-10-05 13:20:00 +08:00
2026-09-12 14:28:15 +08:00
2026-09-08 17:06:28 +08:00
2026-09-29 21:01:18 +08:00
2026-10-02 23:49:22 +08:00
2026-07-31 21:57:22 +08:00
2026-09-25 14:58:06 +08:00
2026-09-24 15:56:38 +08:00
2026-09-19 11:23:12 +08:00
2026-10-08 06:56:33 +08:00
2026-09-01 22:04:17 +08:00
2026-09-18 16:59:31 +08:00
2026-10-07 10:22:15 +08:00
2026-09-18 17:19:10 +08:00
2026-09-14 11:01:31 +08:00
2026-08-13 23:55:30 +08:00
2026-09-17 21:26:52 +08:00
2026-08-13 23:55:30 +08:00
2026-08-14 23:50:40 +08:00
2026-08-13 23:55:30 +08:00
2026-10-10 16:43:04 +08:00
2026-09-12 14:32:05 +08:00
2026-10-07 07:28:29 +08:00
2026-09-30 17:41:11 +08:00
2026-10-02 22:32:21 +08:00
2026-07-04 22:56:24 +08:00
2026-07-04 22:56:24 +08:00
2026-07-04 22:56:24 +08:00
2026-10-10 14:00:00 +08:00
2026-07-04 22:56:24 +08:00
2026-07-14 22:56:50 +08:00
2026-07-04 22:56:24 +08:00
2026-10-10 14:00:00 +08:00
2026-07-16 09:12:29 +08:00
2026-09-30 17:41:11 +08:00
2026-10-10 00:20:45 +08:00
2026-10-10 00:20:45 +08:00
2026-10-04 06:46:13 +08:00
2026-10-10 00:20:45 +08:00
2026-10-10 00:20:45 +08:00
2026-10-10 00:20:45 +08:00
2026-10-10 00:20:45 +08:00
2026-09-28 14:35:42 +08:00
2026-08-23 09:57:12 +08:00
2026-08-23 15:46:10 +08:00
2026-08-23 15:08:39 +08:00
2026-10-08 21:20:45 +08:00
2026-10-06 11:21:51 +08:00
2026-10-07 07:10:05 +08:00
2026-09-30 09:16:00 +08:00
2026-10-09 18:26:23 +08:00
2026-09-13 20:28:32 +08:00
2026-09-27 11:18:03 +08:00
2026-07-27 14:05:31 +08:00
2026-09-26 15:21:47 +08:00
2026-10-05 22:34:57 +08:00
2026-09-25 20:58:17 +08:00
2026-09-28 15:50:42 +08:00
2026-09-25 20:58:17 +08:00
2026-09-24 16:30:36 +08:00
2026-10-08 19:44:52 +08:00
2026-07-08 17:10:27 +08:00
2026-09-27 13:38:32 +08:00
2026-09-20 18:57:49 +08:00
2026-07-04 13:54:04 +08:00
2026-06-17 15:29:22 +08:00
2026-10-07 09:39:26 +08:00
2026-09-24 16:36:30 +08:00
2026-09-24 20:02:36 +08:00
2026-09-25 19:58:36 +08:00
2026-09-25 21:27:25 +08:00
2026-09-25 14:38:59 +08:00
2026-10-09 19:23:51 +08:00
2026-10-09 21:55:42 +08:00
2026-10-06 15:10:39 +08:00
2026-10-09 21:55:42 +08:00
2026-09-28 15:13:34 +08:00
2026-10-07 14:34:24 +08:00
2026-09-18 18:32:42 +08:00
2026-10-10 08:00:47 +08:00
2026-09-16 15:18:29 +08:00
2026-10-10 08:00:47 +08:00
2026-10-10 00:02:23 +08:00
2026-09-14 18:24:51 +08:00
2026-09-19 07:44:05 +08:00
2026-09-18 16:59:31 +08:00
2026-09-18 16:59:31 +08:00
2026-09-18 16:59:31 +08:00
2026-09-30 17:41:11 +08:00
2026-08-15 21:20:34 +08:00
2026-08-16 23:54:06 +08:00
2026-10-02 22:45:26 +08:00
2026-10-03 15:58:01 +08:00
2026-10-10 07:56:09 +08:00
2026-10-10 14:28:10 +08:00
2026-10-07 17:02:23 +08:00
2026-10-01 18:26:58 +08:00
2026-09-30 16:10:29 +08:00
2026-10-07 07:47:32 +08:00
2026-07-28 23:21:23 +08:00
2026-09-30 17:54:42 +08:00
2026-10-04 21:14:35 +08:00
2026-09-06 10:21:58 +08:00
2026-09-18 16:59:31 +08:00
2026-10-03 14:51:05 +08:00
2026-10-04 14:52:04 +08:00
2026-10-08 18:16:21 +08:00
2026-09-24 09:08:32 +08:00
2026-10-10 15:47:30 +08:00
2026-07-20 23:33:09 +08:00
2026-09-18 11:30:11 +08:00
2026-10-09 17:25:35 +08:00
2026-09-14 07:30:34 +08:00
2026-09-25 21:27:25 +08:00
2026-09-25 21:27:25 +08:00
2026-09-14 11:01:31 +08:00
2026-09-26 15:06:48 +08:00
2026-10-08 22:35:19 +08:00
2026-10-08 22:35:19 +08:00
2026-10-02 07:30:10 +08:00
2026-09-28 22:37:30 +08:00
2026-07-26 14:43:08 +08:00
2026-10-06 15:32:46 +08:00
2026-09-23 17:58:00 +08:00
2026-10-05 21:28:08 +08:00
2026-08-29 14:54:02 +08:00
2026-09-22 17:53:21 +08:00
2026-09-22 17:53:21 +08:00
2026-09-30 10:06:53 +08:00
2026-08-24 11:04:23 +08:00
2026-08-24 11:04:23 +08:00
2026-10-08 09:02:47 +08:00
2026-10-10 11:03:26 +08:00
2026-09-24 17:19:01 +08:00
2026-10-09 16:41:29 +08:00
2026-09-22 11:15:06 +08:00
2026-10-10 11:03:26 +08:00
2026-09-01 23:24:49 +08:00
2026-09-23 08:33:20 +08:00
2026-10-09 17:08:56 +08:00
2026-08-31 15:07:30 +08:00
2026-10-08 10:44:10 +08:00
2026-09-14 18:07:21 +08:00
2026-07-09 16:26:31 +08:00
2026-07-09 16:26:31 +08:00
2026-07-28 22:59:14 +08:00
2026-09-29 16:53:18 +08:00
2026-10-06 09:08:25 +08:00
2026-10-06 09:08:25 +08:00
2026-08-05 08:56:18 +08:00
2026-10-07 18:43:31 +08:00
2026-08-15 14:26:38 +08:00
2026-09-23 08:33:20 +08:00
2026-10-06 10:27:44 +08:00
2026-09-28 16:02:34 +08:00
2026-09-26 15:37:52 +08:00
2026-09-23 08:33:20 +08:00
2026-09-30 09:12:11 +08:00
2026-09-24 17:19:01 +08:00
2026-09-30 09:12:11 +08:00
2026-10-06 09:08:25 +08:00
2026-10-08 14:24:51 +08:00
2026-08-15 14:26:38 +08:00
2026-10-10 08:53:51 +08:00
2026-10-10 08:53:51 +08:00
2026-10-06 09:08:25 +08:00
2026-07-14 09:49:43 +08:00
2026-09-01 23:24:49 +08:00
2026-09-30 16:50:07 +08:00
2026-09-03 08:00:25 +08:00
2026-08-01 08:39:28 +08:00
2026-08-17 08:20:42 +08:00
2026-09-14 07:22:38 +08:00
2026-10-08 09:25:12 +08:00
2026-09-18 11:32:04 +08:00
2026-07-26 21:16:36 +08:00
2026-07-22 07:46:03 +08:00
2026-09-01 16:49:39 +08:00
2026-09-23 18:29:12 +08:00
2026-09-25 20:05:36 +08:00
2026-09-27 20:28:05 +08:00
2026-09-27 20:28:05 +08:00
2026-09-23 18:29:12 +08:00
2026-07-26 21:16:36 +08:00
2026-09-27 20:28:05 +08:00
2026-10-07 06:58:59 +08:00
2026-09-18 11:32:04 +08:00
2026-09-24 15:38:52 +08:00
2026-10-08 21:20:45 +08:00
2026-10-02 21:41:50 +08:00
2026-08-01 08:39:28 +08:00
2026-07-15 11:21:04 +08:00
2026-08-17 08:20:42 +08:00
2026-10-04 12:37:33 +08:00
2026-07-22 07:46:03 +08:00
2026-10-04 07:29:56 +08:00
2026-09-09 15:52:09 +08:00
2026-10-06 20:43:27 +08:00
2026-10-07 07:23:56 +08:00
2026-10-08 09:25:12 +08:00
2026-07-15 11:21:04 +08:00
2026-09-23 18:29:12 +08:00
2026-09-01 15:26:33 +08:00
2026-10-08 20:22:28 +08:00
2026-07-26 21:16:36 +08:00
2026-08-17 08:20:42 +08:00
2026-09-22 10:38:16 +08:00
2026-10-01 18:26:58 +08:00
2026-09-06 22:50:58 +08:00
2026-09-27 11:09:41 +08:00
2026-09-09 15:52:09 +08:00
2026-09-09 15:52:09 +08:00
2026-07-27 23:07:40 +08:00
2026-09-09 15:52:09 +08:00
2026-08-29 23:50:45 +08:00
2026-09-03 08:17:26 +08:00
2026-09-08 17:00:26 +08:00
2026-09-09 15:52:09 +08:00
2026-09-12 07:35:07 +08:00
2026-10-04 06:46:13 +08:00
2026-10-04 06:46:13 +08:00
2026-10-10 07:11:02 +08:00
2026-10-08 22:35:19 +08:00
2026-10-01 17:59:30 +08:00
2026-10-10 16:43:04 +08:00
2026-10-10 16:43:04 +08:00
2026-10-07 10:22:15 +08:00
2026-10-10 16:43:04 +08:00
2026-10-07 18:37:31 +08:00
2026-10-10 16:43:04 +08:00
2026-10-10 16:43:04 +08:00
2026-10-09 17:11:00 +08:00
2026-10-10 16:43:04 +08:00
2026-10-10 16:43:04 +08:00
2026-10-08 10:27:10 +08:00
2026-10-08 19:30:44 +08:00
2026-07-31 21:57:22 +08:00
2026-09-27 20:52:13 +08:00
2026-09-20 19:28:21 +08:00
2026-07-26 14:43:08 +08:00
2026-09-16 22:07:42 +08:00
2026-10-09 21:55:42 +08:00
2026-10-10 09:45:17 +08:00
2026-09-24 20:39:30 +08:00
2026-07-31 17:55:24 +08:00
2026-10-10 14:00:00 +08:00
2026-10-08 22:35:19 +08:00
2026-10-05 07:07:04 +08:00
2026-06-22 18:55:20 +08:00
2026-08-01 22:19:59 +08:00
2026-09-27 10:58:54 +08:00
2026-10-10 15:47:30 +08:00
2026-09-27 10:58:54 +08:00
2026-10-04 10:43:05 +08:00
2026-10-07 10:22:15 +08:00
2026-10-08 09:26:31 +08:00
2026-10-07 17:10:45 +08:00
2026-10-07 21:16:46 +08:00
2026-09-30 17:21:43 +08:00
2026-10-01 07:43:16 +08:00
2026-09-01 15:51:37 +08:00
2026-09-28 15:16:16 +08:00
2026-08-11 13:56:02 +08:00
2026-10-07 07:23:56 +08:00
2026-07-11 16:05:30 +08:00
2026-09-17 11:35:13 +08:00
2026-09-16 18:46:18 +08:00
2026-09-18 07:29:34 +08:00
2026-05-28 18:24:32 +08:00
2026-10-09 16:00:32 +08:00
2026-06-09 18:01:43 +08:00
2026-09-27 10:13:05 +08:00
2026-06-24 13:57:12 +08:00
2026-09-22 22:17:11 +08:00
2026-10-05 15:33:29 +08:00
2026-09-09 15:52:09 +08:00
2026-06-24 13:57:12 +08:00
2026-07-30 13:51:17 +08:00
2026-09-09 15:52:09 +08:00
2026-09-23 10:14:35 +08:00
2026-09-20 19:19:29 +08:00
2026-09-28 22:46:39 +08:00
2026-09-12 07:35:07 +08:00
2026-08-23 09:57:12 +08:00
2026-10-06 11:33:58 +08:00
2026-09-22 10:59:41 +08:00
2026-05-21 16:22:09 +08:00
2026-09-23 15:37:26 +08:00
2026-10-07 14:59:16 +08:00
2026-10-03 10:29:56 +08:00
2026-10-08 14:24:51 +08:00
2026-07-30 13:51:17 +08:00
2026-10-06 12:16:18 +08:00
2026-09-25 14:46:12 +08:00
2026-09-22 11:18:57 +08:00
2026-09-25 14:46:12 +08:00
2026-09-25 14:46:12 +08:00
2026-10-03 21:16:01 +08:00
2026-10-10 15:47:30 +08:00
2026-09-22 10:38:16 +08:00
2026-10-07 17:26:57 +08:00
2026-09-28 09:04:26 +08:00
2026-08-05 07:43:54 +08:00
2026-08-05 07:43:54 +08:00
2026-09-16 18:46:18 +08:00
2026-10-06 08:09:15 +08:00
2026-10-10 07:11:02 +08:00
2026-10-05 18:38:22 +08:00
2026-10-05 13:34:19 +08:00
2026-09-16 18:46:18 +08:00
2026-10-10 07:11:02 +08:00
2026-10-10 07:11:02 +08:00
2026-09-18 09:05:26 +08:00
2026-09-16 18:46:18 +08:00
2026-10-10 07:11:02 +08:00
2026-09-16 18:46:18 +08:00
2026-09-08 17:00:26 +08:00
2026-09-16 18:46:18 +08:00
2026-07-20 07:24:34 +08:00
2026-09-25 09:51:11 +08:00
2026-08-31 14:35:08 +08:00
2026-10-10 07:56:09 +08:00
2026-10-10 07:56:09 +08:00
2026-10-10 07:56:09 +08:00
2026-10-10 14:00:00 +08:00
2026-10-03 14:32:44 +08:00
2026-10-03 14:32:44 +08:00
2026-10-10 14:00:00 +08:00
2026-09-18 16:59:31 +08:00
2026-09-19 15:09:36 +08:00
2026-09-25 14:46:12 +08:00
2026-10-09 17:46:35 +08:00
2026-10-09 17:46:35 +08:00
2026-10-07 07:07:53 +08:00
2026-09-15 08:25:08 +08:00
2026-10-01 14:40:04 +08:00
2026-10-01 14:40:04 +08:00
2026-09-16 23:57:38 +08:00
2026-10-07 07:07:53 +08:00
2026-09-24 09:43:16 +08:00
2026-09-24 20:39:30 +08:00
2026-08-29 16:56:56 +08:00
2026-10-10 16:32:00 +08:00
2026-09-01 16:49:39 +08:00
2026-09-22 10:56:49 +08:00
2026-10-10 07:51:46 +08:00
2026-10-10 07:56:09 +08:00
2026-10-10 14:29:57 +08:00
2026-09-20 19:07:48 +08:00
2026-06-08 17:32:41 +08:00
2026-06-09 21:58:31 +08:00
2026-09-14 11:10:41 +08:00
2026-10-10 08:58:26 +08:00
2026-10-04 06:46:13 +08:00
2026-08-27 14:59:31 +08:00
2026-08-25 08:22:57 +08:00
2026-06-24 17:47:04 +08:00
2026-10-01 20:11:10 +08:00
2026-07-02 07:43:09 +08:00
2026-10-08 20:29:15 +08:00
2026-10-10 08:04:01 +08:00
2026-10-05 10:23:55 +08:00
2026-09-23 15:25:45 +08:00
2026-09-24 17:49:52 +08:00
2026-10-07 17:20:11 +08:00
2026-10-09 22:08:59 +08:00
2026-09-17 07:38:38 +08:00
2026-09-01 16:49:39 +08:00
2026-05-21 14:48:28 +08:00
2026-10-10 14:00:00 +08:00
2026-10-09 17:11:00 +08:00
2026-07-27 22:27:16 +08:00
2026-08-05 08:56:18 +08:00
2026-09-14 18:17:54 +08:00
2026-08-22 16:53:32 +08:00
2026-10-09 20:57:43 +08:00
2026-09-22 11:02:16 +08:00
2026-08-01 19:42:44 +08:00
2026-09-24 08:11:47 +08:00
2026-06-24 10:24:36 +08:00
2026-09-24 17:34:06 +08:00
2026-09-12 07:41:24 +08:00
2026-09-22 10:38:16 +08:00
2026-07-19 22:12:30 +08:00
2026-09-21 22:06:41 +08:00
2026-07-23 22:56:12 +08:00
2026-09-15 22:22:12 +08:00
2026-05-22 21:20:28 +08:00
2026-10-05 19:36:05 +08:00
2026-10-10 07:56:09 +08:00
2026-10-06 11:22:46 +08:00
2026-09-29 21:50:59 +08:00
2026-08-30 10:30:34 +08:00
2026-09-17 22:33:18 +08:00
2026-10-10 07:56:09 +08:00
2026-10-06 09:45:47 +08:00
2026-06-03 22:02:27 +08:00
2026-10-10 07:56:09 +08:00
2026-09-04 23:46:57 +08:00
2026-09-27 07:58:15 +08:00
2026-09-04 23:46:57 +08:00
2026-09-27 11:16:38 +08:00
2026-09-24 18:11:35 +08:00
2026-09-14 14:05:21 +08:00
2026-06-25 08:06:17 +08:00
2026-10-10 07:56:09 +08:00
2026-09-23 09:53:49 +08:00
2026-10-06 11:22:46 +08:00
2026-10-09 17:04:22 +08:00
2026-09-20 14:34:37 +08:00
2026-09-12 10:54:39 +08:00
2026-10-08 10:31:06 +08:00
2026-07-04 13:54:04 +08:00
2026-06-12 10:20:38 +08:00
2026-10-08 21:30:07 +08:00
2026-10-08 09:10:30 +08:00
2026-10-07 10:22:15 +08:00
2026-10-04 06:46:13 +08:00
2026-09-12 07:35:07 +08:00
2026-07-04 21:51:57 +08:00
2026-10-07 07:47:32 +08:00
2026-09-27 21:00:09 +08:00
2026-10-07 07:47:32 +08:00
2026-10-07 10:22:15 +08:00
2026-07-04 21:51:57 +08:00
2026-08-24 15:38:32 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 07:47:32 +08:00
2026-10-07 07:47:32 +08:00
2026-07-04 21:51:57 +08:00
2026-10-07 07:47:32 +08:00
2026-10-07 07:47:32 +08:00
2026-09-30 09:50:39 +08:00
2026-10-07 10:22:15 +08:00
2026-10-04 06:46:13 +08:00
2026-10-07 07:47:32 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 07:47:32 +08:00
2026-09-12 07:35:07 +08:00
2026-09-12 07:35:07 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 10:22:15 +08:00
2026-10-07 07:47:32 +08:00
2026-10-04 06:46:13 +08:00
2026-10-07 07:47:32 +08:00
2026-10-08 23:34:32 +08:00
2026-10-08 23:34:32 +08:00
2026-10-07 14:46:23 +08:00
2026-10-07 07:47:32 +08:00
2026-10-09 23:54:04 +08:00
2026-09-28 14:35:42 +08:00
2026-08-24 21:27:43 +08:00
2026-06-19 11:23:07 +08:00
2026-10-03 21:58:50 +08:00
2026-10-08 21:08:03 +08:00
2026-10-10 10:10:28 +08:00
2026-10-08 21:08:03 +08:00
2026-09-28 14:35:42 +08:00
2026-08-28 10:44:30 +08:00
2026-10-10 15:47:30 +08:00
2026-09-14 06:55:57 +08:00
2026-09-25 22:49:12 +08:00
2026-07-07 23:09:06 +08:00
2026-07-23 08:03:21 +08:00
2026-05-12 23:18:54 +08:00
2026-07-23 08:03:21 +08:00
2026-09-24 15:10:25 +08:00
2026-09-24 20:39:30 +08:00
2026-10-08 19:43:04 +08:00
2026-06-19 21:57:03 +08:00
2026-10-03 14:35:09 +08:00
2026-09-17 07:59:58 +08:00
2026-07-04 11:27:19 +08:00
2026-09-24 15:47:33 +08:00
2026-09-02 17:05:36 +08:00
2026-09-22 17:27:01 +08:00
2026-09-27 09:25:00 +08:00
2026-09-12 14:32:05 +08:00
2026-09-26 18:14:34 +08:00
2026-07-13 10:40:22 +08:00
2026-10-06 07:17:22 +08:00
2026-09-08 09:21:38 +08:00
2026-09-05 14:03:00 +08:00
2026-08-31 14:35:08 +08:00
2026-10-08 22:50:45 +08:00
2026-10-05 21:28:08 +08:00
2026-09-14 11:01:31 +08:00
2026-07-11 15:58:07 +08:00
2026-09-26 11:44:48 +08:00
2026-08-25 19:46:04 +08:00
2026-10-08 10:31:06 +08:00
2026-09-30 23:09:05 +08:00
2026-09-24 17:49:52 +08:00
2026-10-09 16:09:17 +08:00
2026-09-22 22:39:49 +08:00
2026-10-08 19:43:04 +08:00
2026-10-10 10:32:31 +08:00
2026-10-10 10:32:31 +08:00
2026-10-06 07:17:22 +08:00
2026-09-19 12:14:24 +08:00
2026-08-28 08:58:59 +08:00
2026-09-24 15:47:33 +08:00
2026-10-08 19:43:04 +08:00
2026-09-18 08:02:52 +08:00
2026-09-24 15:47:33 +08:00
2026-10-06 21:18:53 +08:00
2026-10-08 09:57:13 +08:00
2026-10-08 09:57:13 +08:00
2026-10-07 21:16:46 +08:00
2026-10-04 21:15:18 +08:00
2026-10-05 12:25:41 +08:00
2026-10-01 10:00:53 +08:00
2026-07-08 21:58:33 +08:00
2026-10-08 19:44:52 +08:00
2026-09-28 14:35:42 +08:00
2026-09-25 09:51:11 +08:00
2026-10-07 10:22:15 +08:00
2026-09-28 16:00:52 +08:00
2026-10-07 10:22:15 +08:00
2026-10-04 07:46:59 +08:00
2026-07-31 17:25:07 +08:00
2026-10-07 07:47:32 +08:00
2026-07-22 09:20:54 +08:00
2026-10-08 06:56:33 +08:00
2026-09-25 12:43:04 +08:00
2026-09-01 15:51:37 +08:00
2026-09-08 16:11:49 +08:00
2026-10-07 17:24:12 +08:00
2026-10-09 15:33:58 +08:00
2026-10-09 15:33:58 +08:00
2026-08-25 07:49:38 +08:00
2026-09-30 16:10:29 +08:00
2026-09-16 22:05:20 +08:00
2026-10-01 18:26:58 +08:00
2026-09-28 08:58:55 +08:00
2026-06-08 23:17:22 +08:00
2026-07-14 08:14:21 +08:00
2026-10-01 10:05:39 +08:00
2026-09-02 11:54:40 +08:00
2026-10-05 21:55:01 +08:00
2026-09-15 22:22:12 +08:00
2026-08-24 11:04:23 +08:00
2026-08-30 11:39:25 +08:00
2026-07-30 07:21:55 +08:00
2026-09-18 14:27:33 +08:00
2026-09-01 16:13:41 +08:00
2026-07-11 15:41:57 +08:00
2026-07-13 19:26:07 +08:00
2026-06-19 21:42:42 +08:00
2026-09-17 09:05:25 +08:00
2026-10-04 12:41:13 +08:00
2026-10-01 20:13:57 +08:00
2026-09-24 16:11:46 +08:00
2026-09-24 16:11:46 +08:00
2026-09-30 10:38:19 +08:00
2026-10-05 22:04:36 +08:00
2026-09-08 16:00:45 +08:00
2026-07-27 11:47:49 +08:00
2026-07-27 11:47:49 +08:00
2026-10-09 17:33:18 +08:00
2026-10-07 07:28:29 +08:00
2026-10-07 18:37:31 +08:00
2026-09-14 06:55:57 +08:00
2026-09-14 11:01:31 +08:00
2026-08-23 09:57:12 +08:00
2026-09-27 09:10:20 +08:00
2026-09-30 20:03:35 +08:00
2026-09-29 17:24:29 +08:00
2026-05-21 21:18:10 +08:00
2026-09-26 11:43:32 +08:00
2026-10-06 07:00:09 +08:00
2026-10-02 22:31:40 +08:00
2026-08-27 18:12:05 +08:00
2026-10-03 08:19:14 +08:00
2026-09-18 07:29:34 +08:00
2026-10-08 20:59:50 +08:00
2026-10-07 10:22:15 +08:00
2026-09-06 22:30:26 +08:00
2026-09-25 14:18:09 +08:00
2026-10-10 00:20:45 +08:00
2026-09-16 18:46:18 +08:00
2026-08-01 19:42:44 +08:00
2026-07-27 22:46:51 +08:00
2026-08-11 22:00:57 +08:00
2026-10-07 14:34:24 +08:00
2026-10-07 10:22:15 +08:00
2026-10-10 00:20:45 +08:00
2026-10-09 17:11:00 +08:00
2026-10-05 10:23:55 +08:00
2026-10-05 10:23:55 +08:00
2026-10-04 07:46:59 +08:00
2026-10-05 10:23:55 +08:00
2026-09-09 14:56:31 +08:00
2026-06-02 22:43:22 +08:00
2026-09-27 11:09:41 +08:00
2026-09-18 09:39:14 +08:00
2026-07-28 23:21:23 +08:00
2026-10-10 00:20:45 +08:00
2026-10-06 10:03:56 +08:00
2026-07-15 11:21:04 +08:00
2026-10-02 19:25:14 +08:00
2026-09-12 09:22:27 +08:00
2026-09-22 17:45:01 +08:00
2026-10-01 10:37:09 +08:00
2026-09-16 15:52:17 +08:00
2026-07-04 23:14:46 +08:00
2026-05-10 22:00:57 +08:00
2026-10-05 12:21:39 +08:00
2026-07-28 23:21:23 +08:00
2026-09-24 20:30:45 +08:00
2026-09-13 18:04:51 +08:00
2026-09-15 22:22:12 +08:00
2026-08-22 16:53:32 +08:00
2026-09-27 11:09:41 +08:00
2026-07-04 11:27:19 +08:00
2026-10-06 20:44:49 +08:00
2026-10-03 16:38:00 +08:00
2026-10-06 09:06:33 +08:00
2026-10-07 17:07:59 +08:00
2026-09-16 23:57:38 +08:00
2026-09-16 15:52:17 +08:00
2026-09-15 08:45:08 +08:00
2026-09-25 14:46:12 +08:00
2026-08-29 16:56:56 +08:00
2026-08-29 16:56:56 +08:00
2026-09-15 08:45:08 +08:00
2026-09-01 09:49:32 +08:00
2026-07-14 09:49:43 +08:00
2026-08-23 09:57:12 +08:00
2026-09-01 16:49:39 +08:00
2026-10-10 14:00:00 +08:00
2026-09-01 16:49:39 +08:00
2026-07-14 08:58:06 +08:00
2026-07-14 08:58:06 +08:00
2026-07-03 08:01:46 +08:00
2026-10-08 10:21:18 +08:00
2026-10-04 17:04:58 +08:00
2026-09-30 19:48:32 +08:00
2026-08-13 23:55:30 +08:00
2026-09-18 07:48:24 +08:00
2026-10-03 08:29:29 +08:00
2026-10-04 17:04:58 +08:00
2026-10-06 15:11:35 +08:00
2026-06-25 20:10:49 +08:00
2026-06-25 20:10:49 +08:00
2026-06-25 20:10:49 +08:00
2026-06-25 20:10:49 +08:00
2026-06-25 20:10:49 +08:00
2026-06-25 20:10:49 +08:00
2026-10-06 15:11:35 +08:00
2026-07-15 22:27:00 +08:00
2026-10-07 17:16:48 +08:00
2026-10-04 19:28:32 +08:00
2026-08-05 08:15:28 +08:00
2026-07-20 23:56:37 +08:00
2026-09-27 20:28:05 +08:00
2026-09-27 20:28:05 +08:00
2026-09-27 20:28:05 +08:00
2026-10-02 22:56:24 +08:00
2026-09-28 15:08:49 +08:00
2026-05-12 23:18:54 +08:00
2026-09-12 11:09:41 +08:00
2026-07-26 21:16:36 +08:00
2026-07-26 21:16:36 +08:00
2026-10-06 07:10:55 +08:00
2026-10-02 22:50:30 +08:00
2026-10-09 20:56:26 +08:00
2026-10-01 20:36:35 +08:00
2026-10-10 07:56:09 +08:00
2026-10-03 10:29:56 +08:00
2026-07-28 22:59:14 +08:00
2026-09-03 08:17:26 +08:00
2026-10-07 10:22:15 +08:00
2026-09-26 15:56:54 +08:00
2026-10-09 15:57:18 +08:00
2026-09-19 10:56:21 +08:00
2026-08-13 23:55:30 +08:00
2026-08-23 15:43:37 +08:00
2026-10-10 14:05:35 +08:00
2026-10-05 19:06:16 +08:00
2026-09-10 15:48:55 +08:00
2026-09-24 20:38:12 +08:00
2026-09-24 20:38:12 +08:00
2026-09-10 15:48:55 +08:00
2026-10-05 19:06:16 +08:00
2026-10-08 20:41:40 +08:00
2026-09-28 16:00:52 +08:00
2026-10-04 07:01:13 +08:00
2026-07-20 23:05:47 +08:00
2026-09-25 20:58:17 +08:00
2026-09-08 10:50:03 +08:00
2026-10-06 21:17:11 +08:00
2026-10-07 08:18:55 +08:00
2026-10-06 07:45:18 +08:00
2026-09-20 17:21:49 +08:00
2026-09-12 09:59:58 +08:00
2026-07-12 07:52:45 +08:00
2026-09-27 08:06:03 +08:00
2026-10-01 18:26:58 +08:00
2026-09-27 21:04:39 +08:00
2026-07-12 11:51:31 +08:00
2026-09-14 18:17:54 +08:00
2026-10-05 10:23:55 +08:00
2026-10-09 07:10:54 +08:00
2026-06-07 17:47:11 +08:00