mirror of
https://github.com/moby/moby.git
synced 2026-08-08 17:11:38 +00:00
62 lines
2.3 KiB
Go
62 lines
2.3 KiB
Go
// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
//go:build openapi_unsafe_skipauth
|
|
|
|
package middleware
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// skipAuthEnabled holds the process-wide skip-auth flag. It only
|
|
// exists in binaries built with the `openapi_unsafe_skipauth` tag —
|
|
// production binaries (built without the tag) have no field, no
|
|
// setter, no storage, and no skip-checking branch in [Context.Authorize].
|
|
// Reflection, unsafe-pointer arithmetic, or a debugger cannot flip
|
|
// what is not in the binary.
|
|
var skipAuthEnabled atomic.Bool
|
|
|
|
// SetSkipAuth toggles a PROCESS-WIDE bypass of authentication AND
|
|
// authorization for every operation served by every Context in the
|
|
// running program.
|
|
//
|
|
// DANGER: this disables ALL authentication and ALL authorization.
|
|
// Every request to every secured endpoint runs as if it had been
|
|
// authorized with a nil principal. Use ONLY on developer
|
|
// workstations during early prototyping (e.g. while
|
|
// authentication is not yet wired up).
|
|
//
|
|
// This function exists only when the build tag
|
|
// `openapi_unsafe_skipauth` is set:
|
|
//
|
|
// go build -tags openapi_unsafe_skipauth ./...
|
|
//
|
|
// Production CI MUST NOT pass this tag. Calls compile to a symbol
|
|
// that does not exist in production binaries.
|
|
//
|
|
// Calling with true emits a one-line WARNING via the stdlib `log`
|
|
// package (stderr by default) so the bypass is visible at startup.
|
|
// Calling with false silently disables it.
|
|
func SetSkipAuth(skip bool) {
|
|
skipAuthEnabled.Store(skip)
|
|
if skip {
|
|
log.Println("WARNING: go-openapi/runtime: SetSkipAuth(true) — authentication and authorization are bypassed for ALL operations. This MUST NOT run in production.")
|
|
}
|
|
}
|
|
|
|
// Authorize is the dev-build variant of the production
|
|
// [Context.Authorize] (see context_skipauth_disabled.go for the
|
|
// production path). When [SetSkipAuth] has enabled the bypass, this
|
|
// returns a nil principal with the original request and no error —
|
|
// handlers downstream receive a nil-value principal. Otherwise it
|
|
// delegates to the standard authentication+authorization body.
|
|
func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) {
|
|
if skipAuthEnabled.Load() {
|
|
return nil, request, nil
|
|
}
|
|
return c.authorizeImpl(request, route)
|
|
}
|