mirror of
https://github.com/tiennm99/DocsGPT.git
synced 2026-10-13 14:15:52 +00:00
fix(pat): close restricted-token paths through workflows, chat, schedules and conversations
A resource restriction was checked on ids in the request, not on what the addressed row pulls in or belongs to. Closed: - Workflow writes for tokens restricted on sources, tools or prompts (a graph names those inside its nodes), and attaching a workflow to an agent unless the token is restricted on workflows too. - Chat for tools-restricted tokens (chat executes tools; rejected at token creation as well), and agent-less chat for tokens restricted on prompts or workflows. - conversation_id on chat: it must belong to the agent being run, or to no agent for agent-less chat. Otherwise the server continued, appended to, or resumed pending tool calls of another agent's conversation. - Schedules for tokens restricted on anything but agents; schedule-id routes for every restricted token. - Conversations and analytics for every restricted token, not only agent-restricted ones. Also: create, first publish and adopt return the agent API key masked to a token without agents:keys; token ids must be canonical UUIDs (urn:uuid: gave a 500); an expired token is reported as expired; token creation takes a per-user advisory lock so the cap cannot be raced; admin revoke-sessions writes a pat_revoked event per token. The UI drops a row whose revoke returns 404 and does not offer a tools restriction next to chat:run.
This commit is contained in:
1 parent
b1ff8f516e
commit
94b5924e36
15 files changed
+393
-64
No files matched your search
@@ -250,9 +250,18 @@ class AdminUserSessionsResource(Resource):
|
||||
ok = denylist.deny_user(user_id)
|
||||
with db_session() as conn:
|
||||
# A forced logout that left API credentials alive would not be one.
|
||||
tokens_revoked = PersonalAccessTokensRepository(conn).revoke_all_for_user(
|
||||
revoked_token_ids = PersonalAccessTokensRepository(conn).revoke_all_for_user(
|
||||
user_id, reason="admin_sessions_revoked"
|
||||
)
|
||||
# One pat_revoked event per token, like every other revocation path.
|
||||
for token_id in revoked_token_ids:
|
||||
AuthEventsRepository(conn).insert(
|
||||
user_id,
|
||||
"pat_revoked",
|
||||
ip=request.remote_addr,
|
||||
user_agent=request.headers.get("User-Agent"),
|
||||
metadata={"token_id": token_id, "by": _actor(), "via": "admin_sessions_revoked"},
|
||||
)
|
||||
AuthEventsRepository(conn).insert(
|
||||
user_id,
|
||||
"admin_sessions_revoked",
|
||||
@@ -262,7 +271,7 @@ class AdminUserSessionsResource(Resource):
|
||||
"by": _actor(),
|
||||
"via": "admin_api",
|
||||
"persisted": ok,
|
||||
"personal_access_tokens_revoked": tokens_revoked,
|
||||
"personal_access_tokens_revoked": len(revoked_token_ids),
|
||||
},
|
||||
)
|
||||
return make_response(jsonify({"success": True, "revoked": ok}), 200)
|
||||
|
||||
Reference in new issue
Block a user