mirror of
https://github.com/portainer/portainer.git
synced 2025-07-19 13:29:41 +02:00
This PR solves the issue that the Portainer instance will be always accessible in certain cases, like `restart: always` setting with docker run, even if the administrator is not created in the first 5 minutes. The solution is that the user will be redirected to a timeout page when any actions, such as refresh the page and click button, are made after administrator initialisation window(5 minutes) timeout.
59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package file
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gorilla/handlers"
|
|
)
|
|
|
|
// Handler represents an HTTP API handler for managing static files.
|
|
type Handler struct {
|
|
http.Handler
|
|
wasInstanceDisabled func() bool
|
|
}
|
|
|
|
// NewHandler creates a handler to serve static files.
|
|
func NewHandler(assetPublicPath string, wasInstanceDisabled func() bool) *Handler {
|
|
h := &Handler{
|
|
Handler: handlers.CompressHandler(
|
|
http.FileServer(http.Dir(assetPublicPath)),
|
|
),
|
|
wasInstanceDisabled: wasInstanceDisabled,
|
|
}
|
|
|
|
return h
|
|
}
|
|
|
|
func isHTML(acceptContent []string) bool {
|
|
for _, accept := range acceptContent {
|
|
if strings.Contains(accept, "text/html") {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (handler *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
if handler.wasInstanceDisabled() {
|
|
if r.RequestURI == "/" || r.RequestURI == "/index.html" {
|
|
http.Redirect(w, r, "/timeout.html", http.StatusTemporaryRedirect)
|
|
return
|
|
}
|
|
} else {
|
|
if strings.HasPrefix(r.RequestURI, "/timeout.html") {
|
|
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
|
|
return
|
|
}
|
|
}
|
|
|
|
if !isHTML(r.Header["Accept"]) {
|
|
w.Header().Set("Cache-Control", "max-age=31536000")
|
|
} else {
|
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
|
}
|
|
|
|
w.Header().Add("X-XSS-Protection", "1; mode=block")
|
|
w.Header().Add("X-Content-Type-Options", "nosniff")
|
|
handler.Handler.ServeHTTP(w, r)
|
|
}
|