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:
parent
3db5ec25c2
commit
f6ed4f1e2e
8 changed files with 79 additions and 34 deletions
|
|
@ -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.",
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 != "" {
|
||||
|
|
|
|||
Loading…
Reference in a new issue