feat(admin-panel): update url

feat(admin-panel): update some of the ui
feat(oauth-screen): make oauth success screen match the rest of the app
This commit is contained in:
Alois 2026-08-30 12:55:20 +02:00
commit f6ed4f1e2e
Signed by: alois
SSH key fingerprint: SHA256:GBzT2DXvAuGV9XIV5W3WrzVpjU54FThmxHXdbz95J24
8 changed files with 79 additions and 34 deletions

View file

@ -33,8 +33,8 @@ var corsExposedResponseHeaders = []string{
var corsExposedResponseHeadersJoined = strings.Join(corsExposedResponseHeaders, ", ")
const (
exampleAPIKeyManagementPath = "/management.html"
exampleAPIKeyManagementURL = "/management.html?safe-mode=configure"
exampleAPIKeyManagementPath = "/admin"
exampleAPIKeyManagementURL = "/admin?safe-mode=configure"
)
func (s *Server) homeHeartbeatMiddleware() gin.HandlerFunc {
@ -45,7 +45,11 @@ func (s *Server) homeHeartbeatMiddleware() gin.HandlerFunc {
}
if c != nil && c.Request != nil {
path := c.Request.URL.Path
if strings.HasPrefix(path, "/v0/management/") || path == "/v0/management" || strings.HasPrefix(path, "/v0/resource/plugins/") || path == "/management.html" {
if strings.HasPrefix(path, "/v0/management/") ||
path == "/v0/management" ||
strings.HasPrefix(path, "/v0/resource/plugins/") ||
path == exampleAPIKeyManagementPath ||
strings.HasPrefix(path, exampleAPIKeyManagementPath+"/") {
c.Next()
return
}
@ -87,7 +91,7 @@ func (s *Server) exampleAPIKeySafeModeMiddleware() gin.HandlerFunc {
c.Header("X-CPA-SAFE-MODE", "example-api-key")
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{
"error": "unsafe_example_api_key",
"message": "Proxy API endpoints are disabled because api-keys contains template values. Open /management.html?safe-mode=configure, update api-keys in Management, then retry.",
"message": "Proxy API endpoints are disabled because api-keys contains template values. Open /admin?safe-mode=configure, update api-keys in Management, then retry.",
})
}
}

View file

@ -8,8 +8,6 @@ import (
"github.com/router-for-me/CLIProxyAPI/v7/sdk/api/handlers/openai"
)
const oauthCallbackSuccessHTML = `<html><head><meta charset="utf-8"><title>Authentication successful</title><script>setTimeout(function(){window.close();},5000);</script></head><body><h1>Authentication successful!</h1><p>You can close this window.</p><p>This window will close automatically in 5 seconds.</p></body></html>`
func (s *Server) setupRoutes() {
healthzHandler := func(c *gin.Context) {
if c.Request.Method == http.MethodHead {
@ -21,8 +19,10 @@ func (s *Server) setupRoutes() {
s.engine.GET("/healthz", healthzHandler)
s.engine.HEAD("/healthz", healthzHandler)
s.engine.GET("/management.html", s.serveManagementControlPanel)
s.engine.HEAD("/management.html", s.serveManagementControlPanel)
s.engine.GET("/admin", s.serveManagementControlPanel)
s.engine.HEAD("/admin", s.serveManagementControlPanel)
s.engine.GET("/admin/oauth-success", s.serveManagementControlPanel)
s.engine.HEAD("/admin/oauth-success", s.serveManagementControlPanel)
s.engine.GET("/management-assets/*filepath", s.serveManagementAsset)
s.engine.HEAD("/management-assets/*filepath", s.serveManagementAsset)
@ -59,7 +59,6 @@ func (s *Server) setupRoutes() {
if state != "" {
_, _ = managementHandlers.WriteOAuthCallbackFileForPendingSession(s.cfg.AuthDir, "codex", state, code, errStr)
}
c.Header("Content-Type", "text/html; charset=utf-8")
c.String(http.StatusOK, oauthCallbackSuccessHTML)
c.Redirect(http.StatusSeeOther, "/admin/oauth-success")
})
}

View file

@ -1529,7 +1529,7 @@ func TestHomeEnabledHidesManagementEndpointsAndControlPanel(t *testing.T) {
})
t.Run("management control panel returns 404", func(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/management.html", nil)
req := httptest.NewRequest(http.MethodGet, "/admin", nil)
rr := httptest.NewRecorder()
server.engine.ServeHTTP(rr, req)
if rr.Code != http.StatusNotFound {
@ -1566,27 +1566,27 @@ func TestExampleAPIKeySafeModeShowsWarningAndKeepsManagement(t *testing.T) {
t.Fatalf("status = %d, want %d body=%s", rr.Code, http.StatusOK, rr.Body.String())
}
body := rr.Body.String()
for _, want := range []string{"Example API key detected", "Open Management", `href="/management.html?safe-mode=configure"`} {
for _, want := range []string{"Example API key detected", "Open Management", `href="/admin?safe-mode=configure"`} {
if !strings.Contains(body, want) {
t.Fatalf("warning page missing %q: %s", want, body)
}
}
})
t.Run("management html defaults to warning page", func(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/management.html", nil)
t.Run("admin defaults to warning page", func(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/admin", nil)
rr := httptest.NewRecorder()
server.engine.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Fatalf("status = %d, want %d body=%s", rr.Code, http.StatusOK, rr.Body.String())
}
if !strings.Contains(rr.Body.String(), "Example API key detected") {
t.Fatalf("management.html did not show warning page: %s", rr.Body.String())
t.Fatalf("admin page did not show warning page: %s", rr.Body.String())
}
})
t.Run("management html head stops at warning page", func(t *testing.T) {
req := httptest.NewRequest(http.MethodHead, "/management.html", nil)
t.Run("admin head stops at warning page", func(t *testing.T) {
req := httptest.NewRequest(http.MethodHead, "/admin", nil)
rr := httptest.NewRecorder()
server.engine.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
@ -1601,7 +1601,7 @@ func TestExampleAPIKeySafeModeShowsWarningAndKeepsManagement(t *testing.T) {
})
t.Run("management button query opens control panel", func(t *testing.T) {
req := httptest.NewRequest(http.MethodGet, "/management.html?safe-mode=configure", nil)
req := httptest.NewRequest(http.MethodGet, "/admin?safe-mode=configure", nil)
rr := httptest.NewRecorder()
server.engine.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
@ -1643,7 +1643,7 @@ func TestExampleAPIKeySafeModeShowsWarningAndKeepsManagement(t *testing.T) {
if strings.Contains(rr.Body.String(), "management_url") {
t.Fatalf("body should not include management_url field: %s", rr.Body.String())
}
if !strings.Contains(rr.Body.String(), "/management.html?safe-mode=configure") {
if !strings.Contains(rr.Body.String(), "/admin?safe-mode=configure") {
t.Fatalf("body missing management link in message: %s", rr.Body.String())
}
if got := rr.Header().Get(internallogging.CPATraceIDHeader); got != "" {