Bladeren bron

validate network and endpoint name more strictly

Signed-off-by: allencloud <allen.sun@daocloud.io>
allencloud 8 jaren geleden
bovenliggende
commit
761722395d
5 gewijzigde bestanden met toevoegingen van 25 en 13 verwijderingen
  1. 13 5
      libnetwork/config/config.go
  2. 6 3
      libnetwork/config/config_test.go
  3. 2 2
      libnetwork/controller.go
  4. 1 1
      libnetwork/error.go
  5. 3 2
      libnetwork/network.go

+ 13 - 5
libnetwork/config/config.go

@@ -1,6 +1,8 @@
 package config
 package config
 
 
 import (
 import (
+	"fmt"
+	"regexp"
 	"strings"
 	"strings"
 
 
 	"github.com/BurntSushi/toml"
 	"github.com/BurntSushi/toml"
@@ -15,6 +17,12 @@ import (
 	"github.com/docker/libnetwork/osl"
 	"github.com/docker/libnetwork/osl"
 )
 )
 
 
+// RestrictedNameChars collects the characters allowed to represent a network or endpoint name.
+const restrictedNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.-]`
+
+// RestrictedNamePattern is a regular expression to validate names against the collection of restricted characters.
+var restrictedNamePattern = regexp.MustCompile(`^/?` + restrictedNameChars + `+$`)
+
 // Config encapsulates configurations of various Libnetwork components
 // Config encapsulates configurations of various Libnetwork components
 type Config struct {
 type Config struct {
 	Daemon          DaemonCfg
 	Daemon          DaemonCfg
@@ -223,12 +231,12 @@ func (c *Config) ProcessOptions(options ...Option) {
 	}
 	}
 }
 }
 
 
-// IsValidName validates configuration objects supported by libnetwork
-func IsValidName(name string) bool {
-	if strings.TrimSpace(name) == "" {
-		return false
+// ValidateName validates configuration objects supported by libnetwork
+func ValidateName(name string) error {
+	if !restrictedNamePattern.MatchString(name) {
+		return fmt.Errorf("%s includes invalid characters, only %q are allowed", name, restrictedNameChars)
 	}
 	}
-	return true
+	return nil
 }
 }
 
 
 // OptionLocalKVProvider function returns an option setter for kvstore provider
 // OptionLocalKVProvider function returns an option setter for kvstore provider

+ 6 - 3
libnetwork/config/config_test.go

@@ -46,13 +46,16 @@ func TestOptionsLabels(t *testing.T) {
 }
 }
 
 
 func TestValidName(t *testing.T) {
 func TestValidName(t *testing.T) {
-	if !IsValidName("test") {
+	if err := ValidateName("test"); err != nil {
 		t.Fatal("Name validation fails for a name that must be accepted")
 		t.Fatal("Name validation fails for a name that must be accepted")
 	}
 	}
-	if IsValidName("") {
+	if err := ValidateName(""); err == nil {
 		t.Fatal("Name validation succeeds for a case when it is expected to fail")
 		t.Fatal("Name validation succeeds for a case when it is expected to fail")
 	}
 	}
-	if IsValidName("   ") {
+	if err := ValidateName("   "); err == nil {
+		t.Fatal("Name validation succeeds for a case when it is expected to fail")
+	}
+	if err := ValidateName("<>$$^"); err == nil {
 		t.Fatal("Name validation succeeds for a case when it is expected to fail")
 		t.Fatal("Name validation succeeds for a case when it is expected to fail")
 	}
 	}
 }
 }

+ 2 - 2
libnetwork/controller.go

@@ -626,8 +626,8 @@ func (c *controller) NewNetwork(networkType, name string, id string, options ...
 		}
 		}
 	}
 	}
 
 
-	if !config.IsValidName(name) {
-		return nil, ErrInvalidName(name)
+	if err := config.ValidateName(name); err != nil {
+		return nil, ErrInvalidName(err.Error())
 	}
 	}
 
 
 	if id == "" {
 	if id == "" {

+ 1 - 1
libnetwork/error.go

@@ -69,7 +69,7 @@ func (ii ErrInvalidID) Error() string {
 func (ii ErrInvalidID) BadRequest() {}
 func (ii ErrInvalidID) BadRequest() {}
 
 
 // ErrInvalidName is returned when a query-by-name or resource create method is
 // ErrInvalidName is returned when a query-by-name or resource create method is
-// invoked with an empty name parameter
+// invoked with an invalid name parameter
 type ErrInvalidName string
 type ErrInvalidName string
 
 
 func (in ErrInvalidName) Error() string {
 func (in ErrInvalidName) Error() string {

+ 3 - 2
libnetwork/network.go

@@ -848,8 +848,9 @@ func (n *network) addEndpoint(ep *endpoint) error {
 
 
 func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoint, error) {
 func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoint, error) {
 	var err error
 	var err error
-	if !config.IsValidName(name) {
-		return nil, ErrInvalidName(name)
+
+	if err = config.ValidateName(name); err != nil {
+		return nil, ErrInvalidName(err.Error())
 	}
 	}
 
 
 	if _, err = n.EndpointByName(name); err == nil {
 	if _, err = n.EndpointByName(name); err == nil {