Three bugs fixed: 1. Schema seeded base_url with fake placeholder 'bookhoard.example.com'. Removed seed; startup now seeds from BASE_URL env var only if DB row is empty (admin changes persist across restarts). One-time UPDATE clears the placeholder in existing installs. 2. config.GetBaseURL() had a broken type assertion (local SystemConfigRow vs database.SystemConfig) that always failed, returning . Admin panel showed env var fallback instead of actual DB value. Fixed with a function-type getter that properly wraps the DB query. 3. OPDS handler read base_url only from DB with no fallback. When DB had the placeholder, all feed links pointed to an unreachable domain, breaking KOReader search/download. Added deriveBaseURL() helper that falls back to the request Host/scheme when DB value is empty. Setup gate improvements: - isSetupComplete now requires both admin user AND non-empty base_url - Setup middleware no longer exempts all /api/ routes; only allows /api/auth/register, /api/auth/login, /api/system/config before setup is complete. All other API routes get 503. - Cache invalidated when base_url is saved via admin settings Dev workflow: - New bruno/NewDevDBSetup/SetBaseUrl.yml for dev DB setup - NewDB.sh runs SetBaseUrl between RegisterUser and CreateEbookLibrary
37 lines
1.0 KiB
Go
37 lines
1.0 KiB
Go
package handlers
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/labstack/echo/v5"
|
|
)
|
|
|
|
// deriveBaseURL returns the base URL to use for constructing self-referential
|
|
// links (OPDS feeds, sidecar config, etc.). It prefers the database-configured
|
|
// base_url when available, and falls back to deriving the URL from the incoming
|
|
// HTTP request (Host header + scheme), which is always reachable by the client.
|
|
//
|
|
// Proxy header support: X-Forwarded-Proto and X-Forwarded-Host are respected so
|
|
// that deployments behind TLS-terminating reverse proxies advertise the correct
|
|
// external URL.
|
|
func deriveBaseURL(c *echo.Context, dbBaseURL string) string {
|
|
if dbBaseURL != "" {
|
|
return strings.TrimRight(dbBaseURL, "/")
|
|
}
|
|
|
|
scheme := "http"
|
|
if c.Request().TLS != nil {
|
|
scheme = "https"
|
|
}
|
|
if proto := c.Request().Header.Get("X-Forwarded-Proto"); proto != "" {
|
|
scheme = proto
|
|
}
|
|
|
|
host := c.Request().Host
|
|
if forwarded := c.Request().Header.Get("X-Forwarded-Host"); forwarded != "" {
|
|
host = forwarded
|
|
}
|
|
|
|
return scheme + "://" + host
|
|
}
|