Add upload token config validation
This commit is contained in:
@@ -29,6 +29,7 @@ func Validate(cfg Config) error {
|
||||
}
|
||||
|
||||
pipelineIDs := make(map[string]struct{}, len(cfg.Pipelines))
|
||||
uploadPipelineIDs := make(map[string]struct{})
|
||||
for pipelineIndex, pipeline := range cfg.Pipelines {
|
||||
pipelineContext := fmt.Sprintf("pipelines[%d]", pipelineIndex)
|
||||
if pipeline.ID == "" {
|
||||
@@ -42,6 +43,9 @@ func Validate(cfg Config) error {
|
||||
}
|
||||
|
||||
errs = validateSourceBackend(errs, pipelineContext+".source", pipeline.Source)
|
||||
if pipeline.Source.Backend == BackendHTTPUpload && pipeline.ID != "" {
|
||||
uploadPipelineIDs[pipeline.ID] = struct{}{}
|
||||
}
|
||||
errs = validateValidationPolicy(errs, pipelineContext+".validation", pipeline.Validation)
|
||||
if len(pipeline.Destinations) == 0 {
|
||||
errs = append(errs, pipelineContext+".destinations is required")
|
||||
@@ -68,6 +72,8 @@ func Validate(cfg Config) error {
|
||||
}
|
||||
}
|
||||
|
||||
errs = validateUploadTokens(errs, cfg.UploadTokens, pipelineIDs, uploadPipelineIDs)
|
||||
|
||||
if len(errs) > 0 {
|
||||
return errs
|
||||
}
|
||||
@@ -112,9 +118,6 @@ func validateDestinationBackend(errs ValidationErrors, context string, destinati
|
||||
}
|
||||
|
||||
func validateHTTPUploadSource(errs ValidationErrors, context string, upload HTTPUpload) ValidationErrors {
|
||||
if upload.TokenEnv == "" {
|
||||
errs = append(errs, context+".token_env is required for http_upload backend")
|
||||
}
|
||||
if upload.StagingPath == "" {
|
||||
errs = append(errs, context+".staging_path is required for http_upload backend")
|
||||
}
|
||||
@@ -124,6 +127,70 @@ func validateHTTPUploadSource(errs ValidationErrors, context string, upload HTTP
|
||||
return errs
|
||||
}
|
||||
|
||||
func validateUploadTokens(errs ValidationErrors, tokens []UploadToken, pipelineIDs, uploadPipelineIDs map[string]struct{}) ValidationErrors {
|
||||
if len(uploadPipelineIDs) == 0 {
|
||||
if len(tokens) > 0 {
|
||||
errs = append(errs, "upload_tokens must reference configured http_upload pipelines")
|
||||
}
|
||||
return errs
|
||||
}
|
||||
if len(tokens) == 0 {
|
||||
return append(errs, "upload_tokens is required when any pipeline source backend is http_upload")
|
||||
}
|
||||
|
||||
tokenIDs := make(map[string]struct{}, len(tokens))
|
||||
allowedUploadPipelineIDs := make(map[string]struct{}, len(uploadPipelineIDs))
|
||||
for tokenIndex, token := range tokens {
|
||||
context := fmt.Sprintf("upload_tokens[%d]", tokenIndex)
|
||||
if token.ID == "" {
|
||||
errs = append(errs, context+".id is required")
|
||||
} else if !idPattern.MatchString(token.ID) {
|
||||
errs = append(errs, context+".id must be a slug-like identifier")
|
||||
} else if _, exists := tokenIDs[token.ID]; exists {
|
||||
errs = append(errs, "upload token id "+token.ID+" is duplicated")
|
||||
} else {
|
||||
tokenIDs[token.ID] = struct{}{}
|
||||
}
|
||||
|
||||
if token.TokenEnv == "" {
|
||||
errs = append(errs, context+".token_env is required")
|
||||
}
|
||||
if len(token.AllowPipelines) == 0 {
|
||||
errs = append(errs, context+".allow_pipelines is required")
|
||||
}
|
||||
|
||||
seenAllowed := make(map[string]struct{}, len(token.AllowPipelines))
|
||||
for allowIndex, pipelineID := range token.AllowPipelines {
|
||||
allowContext := fmt.Sprintf("%s.allow_pipelines[%d]", context, allowIndex)
|
||||
if pipelineID == "" {
|
||||
errs = append(errs, allowContext+" is required")
|
||||
continue
|
||||
}
|
||||
if _, exists := seenAllowed[pipelineID]; exists {
|
||||
errs = append(errs, context+".allow_pipelines contains duplicate pipeline id "+pipelineID)
|
||||
continue
|
||||
}
|
||||
seenAllowed[pipelineID] = struct{}{}
|
||||
if _, exists := pipelineIDs[pipelineID]; !exists {
|
||||
errs = append(errs, allowContext+" references unknown pipeline "+pipelineID)
|
||||
continue
|
||||
}
|
||||
if _, exists := uploadPipelineIDs[pipelineID]; !exists {
|
||||
errs = append(errs, allowContext+" references non-http_upload pipeline "+pipelineID)
|
||||
continue
|
||||
}
|
||||
allowedUploadPipelineIDs[pipelineID] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
for pipelineID := range uploadPipelineIDs {
|
||||
if _, exists := allowedUploadPipelineIDs[pipelineID]; !exists {
|
||||
errs = append(errs, "http_upload pipeline "+pipelineID+" is not allowed by any upload token")
|
||||
}
|
||||
}
|
||||
return errs
|
||||
}
|
||||
|
||||
func validateBackend(errs ValidationErrors, context string, backend backendView) ValidationErrors {
|
||||
switch backend.Backend {
|
||||
case "":
|
||||
|
||||
Reference in New Issue
Block a user