mirror of
https://github.com/project-zot/zot.git
synced 2026-06-17 21:17:58 +08:00
a5cc8ab810
* feat: support pushing multiple tags for a single manifest See https://github.com/opencontainers/distribution-spec/pull/600 Signed-off-by: Andrei Aaron <andreifdaaron@gmail.com> * fix: constants not replaced in swagger output Also godot mandates comments ending in dots, which produces bad results in the swagger generated files, see the extra ". which is now fixed below: ``` diff --git a/swagger/docs.go b/swagger/docs.go index 84b08277..fb2c45c3 100644 --- a/swagger/docs.go +++ b/swagger/docs.go @@ -114,7 +114,7 @@ const docTemplate = `{ } }, "400": { - "description": "bad request\".", + "description": "bad request", "schema": { "type": "string" } @@ -200,7 +200,7 @@ const docTemplate = `{ } }, "400": { - "description": "bad request\".", + "description": "bad request", "schema": { "type": "string" } diff --git a/swagger/swagger.json b/swagger/swagger.json index cfeb3900..247f95fa 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -106,7 +106,7 @@ } }, "400": { - "description": "bad request\".", + "description": "bad request", "schema": { "type": "string" } @@ -192,7 +192,7 @@ } }, "400": { - "description": "bad request\".", + "description": "bad request", "schema": { "type": "string" } diff --git a/swagger/swagger.yaml b/swagger/swagger.yaml index 57641c2f..09b30dcc 100644 --- a/swagger/swagger.yaml +++ b/swagger/swagger.yaml @@ -310,7 +310,7 @@ paths: schema: type: string "400": - description: bad request". + description: bad request schema: type: string "500": @@ -366,7 +366,7 @@ paths: schema: type: string "400": - description: bad request". + description: bad request schema: type: string "500": ``` Signed-off-by: Andrei Aaron <andreifdaaron@gmail.com> --------- Signed-off-by: Andrei Aaron <andreifdaaron@gmail.com>
135 lines
3.8 KiB
Go
135 lines
3.8 KiB
Go
//go:build mgmt
|
|
|
|
package extensions
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"zotregistry.dev/zot/v2/pkg/api/config"
|
|
"zotregistry.dev/zot/v2/pkg/api/constants"
|
|
zcommon "zotregistry.dev/zot/v2/pkg/common"
|
|
"zotregistry.dev/zot/v2/pkg/log"
|
|
)
|
|
|
|
type HTPasswd struct {
|
|
Path string `json:"path,omitempty"`
|
|
}
|
|
|
|
type BearerConfig struct {
|
|
Realm string `json:"realm,omitempty"`
|
|
Service string `json:"service,omitempty"`
|
|
}
|
|
|
|
type OpenIDProviderConfig struct {
|
|
Name string `json:"name,omitempty" mapstructure:"name"`
|
|
}
|
|
|
|
type OpenIDConfig struct {
|
|
Providers map[string]OpenIDProviderConfig `json:"providers,omitempty" mapstructure:"providers"`
|
|
}
|
|
|
|
type Auth struct {
|
|
HTPasswd *HTPasswd `json:"htpasswd,omitempty" mapstructure:"htpasswd"`
|
|
Bearer *BearerConfig `json:"bearer,omitempty" mapstructure:"bearer"`
|
|
LDAP *struct {
|
|
Address string `json:"address,omitempty" mapstructure:"address"`
|
|
} `json:"ldap,omitempty" mapstructure:"ldap"`
|
|
OpenID *OpenIDConfig `json:"openid,omitempty" mapstructure:"openid"`
|
|
APIKey bool `json:"apikey,omitempty" mapstructure:"apikey"`
|
|
}
|
|
|
|
type StrippedConfig struct {
|
|
DistSpecVersion string `json:"distSpecVersion" mapstructure:"distSpecVersion"`
|
|
Commit string `json:"commit" mapstructure:"commit"`
|
|
ReleaseTag string `json:"releaseTag" mapstructure:"releaseTag"`
|
|
BinaryType string `json:"binaryType" mapstructure:"binaryType"`
|
|
|
|
HTTP struct {
|
|
Auth *Auth `json:"auth,omitempty" mapstructure:"auth"`
|
|
} `json:"http" mapstructure:"http"`
|
|
}
|
|
|
|
func IsBuiltWithMGMTExtension() bool {
|
|
return true
|
|
}
|
|
|
|
func (auth Auth) MarshalJSON() ([]byte, error) {
|
|
type localAuth Auth
|
|
|
|
if auth.Bearer == nil && auth.LDAP == nil &&
|
|
auth.HTPasswd.Path == "" &&
|
|
(auth.OpenID == nil || len(auth.OpenID.Providers) == 0) {
|
|
auth.HTPasswd = nil
|
|
auth.OpenID = nil
|
|
|
|
return json.Marshal((localAuth)(auth))
|
|
}
|
|
|
|
if auth.HTPasswd.Path == "" && auth.LDAP == nil {
|
|
auth.HTPasswd = nil
|
|
} else {
|
|
auth.HTPasswd.Path = ""
|
|
}
|
|
|
|
if auth.OpenID != nil && len(auth.OpenID.Providers) == 0 {
|
|
auth.OpenID = nil
|
|
}
|
|
|
|
auth.LDAP = nil
|
|
|
|
return json.Marshal((localAuth)(auth))
|
|
}
|
|
|
|
func SetupMgmtRoutes(conf *config.Config, router *mux.Router, log log.Logger) {
|
|
extensionsConfig := conf.CopyExtensionsConfig()
|
|
if !extensionsConfig.IsSearchEnabled() {
|
|
log.Info().Msg("skip enabling the mgmt route as the config prerequisites are not met")
|
|
|
|
return
|
|
}
|
|
|
|
log.Info().Msg("setting up mgmt routes")
|
|
|
|
mgmt := Mgmt{Conf: conf, Log: log}
|
|
|
|
// The endpoint for reading configuration should be available to all users
|
|
allowedMethods := zcommon.AllowedMethods(http.MethodGet)
|
|
|
|
mgmtRouter := router.PathPrefix(constants.ExtMgmt).Subrouter()
|
|
mgmtRouter.Use(zcommon.CORSHeadersMiddleware(conf.HTTP.AllowOrigin))
|
|
mgmtRouter.Use(zcommon.AddExtensionSecurityHeaders())
|
|
mgmtRouter.Use(zcommon.ACHeadersMiddleware(conf, allowedMethods...))
|
|
mgmtRouter.Methods(allowedMethods...).HandlerFunc(mgmt.HandleGetConfig)
|
|
|
|
log.Info().Msg("finished setting up mgmt routes")
|
|
}
|
|
|
|
type Mgmt struct {
|
|
Conf *config.Config
|
|
Log log.Logger
|
|
}
|
|
|
|
// HandleGetConfig godoc
|
|
// @Summary Get current server configuration
|
|
// @Description Get current server configuration
|
|
// @Router /v2/_zot/ext/mgmt [get]
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param resource query string false "specify resource" Enums(config)
|
|
// @Success 200 {object} extensions.StrippedConfig
|
|
// @Failure 500 {string} string "internal server error"
|
|
func (mgmt *Mgmt) HandleGetConfig(w http.ResponseWriter, r *http.Request) {
|
|
sanitizedConfig := mgmt.Conf.Sanitize()
|
|
|
|
buf, err := zcommon.MarshalThroughStruct(sanitizedConfig, &StrippedConfig{})
|
|
if err != nil {
|
|
mgmt.Log.Error().Err(err).Str("component", "mgmt").Msg("failed to marshal config response")
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
}
|
|
|
|
_, _ = w.Write(buf)
|
|
}
|