From 09c5bada3e8b5a13f33272c8b43f07387577e30c Mon Sep 17 00:00:00 2001 From: Richard Wei <54336863+WaysonWei@users.noreply.github.com> Date: Fri, 23 Jul 2021 09:53:42 +1200 Subject: [PATCH] fix(app): fix create stack with capital letters or space issue EE-908 (#5236) * fix(app): fix create stack with capital letters or space issue * replace ComposeWrapper with ComposeStackManager --- api/exec/compose_stack.go | 4 +++- api/exec/swarm_stack.go | 7 +++++++ api/http/handler/stacks/create_swarm_stack.go | 6 ++++++ api/portainer.go | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/api/exec/compose_stack.go b/api/exec/compose_stack.go index 1b527478f..bb6e9f055 100644 --- a/api/exec/compose_stack.go +++ b/api/exec/compose_stack.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path" + "regexp" "strings" wrapper "github.com/portainer/docker-compose-wrapper" @@ -36,7 +37,8 @@ func NewComposeStackManager(binaryPath string, configPath string, proxyManager * // NormalizeStackName returns a new stack name with unsupported characters replaced func (w *ComposeStackManager) NormalizeStackName(name string) string { - return name + r := regexp.MustCompile("[^a-z0-9]+") + return r.ReplaceAllString(strings.ToLower(name), "") } // ComposeSyntaxMaxVersion returns the maximum supported version of the docker compose syntax diff --git a/api/exec/swarm_stack.go b/api/exec/swarm_stack.go index faf6cf723..69f91581c 100644 --- a/api/exec/swarm_stack.go +++ b/api/exec/swarm_stack.go @@ -8,7 +8,9 @@ import ( "os" "os/exec" "path" + "regexp" "runtime" + "strings" portainer "github.com/portainer/portainer/api" ) @@ -184,3 +186,8 @@ func (manager *SwarmStackManager) retrieveConfigurationFromDisk(path string) (ma return config, nil } + +func (manager *SwarmStackManager) NormalizeStackName(name string) string { + r := regexp.MustCompile("[^a-z0-9]+") + return r.ReplaceAllString(strings.ToLower(name), "") +} diff --git a/api/http/handler/stacks/create_swarm_stack.go b/api/http/handler/stacks/create_swarm_stack.go index b439addbf..99558b817 100644 --- a/api/http/handler/stacks/create_swarm_stack.go +++ b/api/http/handler/stacks/create_swarm_stack.go @@ -47,6 +47,8 @@ func (handler *Handler) createSwarmStackFromFileContent(w http.ResponseWriter, r return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err} } + payload.Name = handler.SwarmStackManager.NormalizeStackName(payload.Name) + isUnique, err := handler.checkUniqueName(endpoint, payload.Name, 0, true) if err != nil { return &httperror.HandlerError{http.StatusInternalServerError, "Unable to check for name collision", err} @@ -148,6 +150,8 @@ func (handler *Handler) createSwarmStackFromGitRepository(w http.ResponseWriter, return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err} } + payload.Name = handler.SwarmStackManager.NormalizeStackName(payload.Name) + isUnique, err := handler.checkUniqueName(endpoint, payload.Name, 0, true) if err != nil { return &httperror.HandlerError{http.StatusInternalServerError, "Unable to check for name collision", err} @@ -244,6 +248,8 @@ func (handler *Handler) createSwarmStackFromFileUpload(w http.ResponseWriter, r return &httperror.HandlerError{http.StatusBadRequest, "Invalid request payload", err} } + payload.Name = handler.SwarmStackManager.NormalizeStackName(payload.Name) + isUnique, err := handler.checkUniqueName(endpoint, payload.Name, 0, true) if err != nil { return &httperror.HandlerError{http.StatusInternalServerError, "Unable to check for name collision", err} diff --git a/api/portainer.go b/api/portainer.go index ae971cee2..78201f4af 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -1280,6 +1280,7 @@ type ( Logout(endpoint *Endpoint) error Deploy(stack *Stack, prune bool, endpoint *Endpoint) error Remove(stack *Stack, endpoint *Endpoint) error + NormalizeStackName(name string) string } // TagService represents a service for managing tag data