fix: /api/workspace/projects uses per-user Gitea token instead of global admin token
A local account without Gitea connection was seeing all Gitea repos because the endpoint used the module-level gitea client (global admin token). Now it checks get_user_gitea_client(request) and returns empty gitea_repos if the user has no OAuth token for Gitea.
This commit is contained in:
+22
-16
@@ -6,7 +6,7 @@ import logging
|
|||||||
from fastapi import APIRouter, Request, Query
|
from fastapi import APIRouter, Request, Query
|
||||||
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
|
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
|
||||||
|
|
||||||
from app.services.gitea_client import gitea
|
from app.services.gitea_client import gitea, get_user_gitea_client
|
||||||
from app.auth.session import SessionManager
|
from app.auth.session import SessionManager
|
||||||
from app.db import get_conn
|
from app.db import get_conn
|
||||||
|
|
||||||
@@ -473,7 +473,10 @@ async def gitea_workspace_page(request: Request):
|
|||||||
|
|
||||||
@router.get("/api/workspace/projects")
|
@router.get("/api/workspace/projects")
|
||||||
async def list_workspace_projects(request: Request):
|
async def list_workspace_projects(request: Request):
|
||||||
"""List all projects: built-in + Gitea + GitHub."""
|
"""List all projects: built-in + Gitea + GitHub.
|
||||||
|
Uses the user's own Gitea token if connected, not the global admin token."""
|
||||||
|
user = SessionManager.decode_session(request.cookies.get("flowdeck_session", ""))
|
||||||
|
|
||||||
builtin = []
|
builtin = []
|
||||||
with get_conn() as conn:
|
with get_conn() as conn:
|
||||||
rows = conn.execute(
|
rows = conn.execute(
|
||||||
@@ -484,20 +487,23 @@ async def list_workspace_projects(request: Request):
|
|||||||
builtin.append({"id": str(r["id"]), "name": r["title"] or "Untitled", "pageCount": count, "forge": "builtin"})
|
builtin.append({"id": str(r["id"]), "name": r["title"] or "Untitled", "pageCount": count, "forge": "builtin"})
|
||||||
|
|
||||||
gitea_repos = []
|
gitea_repos = []
|
||||||
try:
|
# Use per-user token if available, otherwise return empty
|
||||||
repos = await gitea.get_user_repos(page=1, limit=50)
|
user_gitea = get_user_gitea_client(request) if user else None
|
||||||
for repo in repos:
|
if user_gitea:
|
||||||
gitea_repos.append({
|
try:
|
||||||
"id": str(repo.get("id", "")),
|
repos = await user_gitea.get_user_repos(page=1, limit=50)
|
||||||
"name": repo.get("name", ""),
|
for repo in repos:
|
||||||
"full_name": repo.get("full_name", ""),
|
gitea_repos.append({
|
||||||
"description": repo.get("description", ""),
|
"id": str(repo.get("id", "")),
|
||||||
"html_url": repo.get("html_url", ""),
|
"name": repo.get("name", ""),
|
||||||
"language": repo.get("language", ""),
|
"full_name": repo.get("full_name", ""),
|
||||||
"forge": "gitea",
|
"description": repo.get("description", ""),
|
||||||
})
|
"html_url": repo.get("html_url", ""),
|
||||||
except Exception:
|
"language": repo.get("language", ""),
|
||||||
pass
|
"forge": "gitea",
|
||||||
|
})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
return {"builtin": builtin, "gitea": gitea_repos, "github": []}
|
return {"builtin": builtin, "gitea": gitea_repos, "github": []}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user