Skip to content

Commit

Permalink
Reject invalid endpoint
Browse files Browse the repository at this point in the history
Prior, a non-empty endpoint of the incorrect format would cause an
embedded sqlite backend to be used. By passing a non-empty endpoint
the user is intending to use an external backend. Now, the endpoint
will be validated and passing a non-empty endpoint of an incorrect
format will result in an error.
  • Loading branch information
rmweir committed Sep 3, 2024
1 parent cb8c874 commit b37cc40
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions pkg/endpoint/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,11 @@ type ETCDConfig struct {
}

func Listen(ctx context.Context, config Config) (ETCDConfig, error) {
driver, dsn := ParseStorageEndpoint(config.Endpoint)
driver, dsn, err := ParseStorageEndpoint(config.Endpoint)
if err != nil {
return ETCDConfig{}, errors.Wrap(err, "parsing storage endpoint")
}

if driver == ETCDBackend {
return ETCDConfig{
Endpoints: strings.Split(config.Endpoint, ","),
Expand Down Expand Up @@ -233,19 +237,23 @@ func getKineStorageBackend(ctx context.Context, driver, dsn string, cfg Config)
}

// ParseStorageEndpoint returns the driver name and endpoint string from a datastore endpoint URL.
func ParseStorageEndpoint(storageEndpoint string) (string, string) {
func ParseStorageEndpoint(storageEndpoint string) (string, string, error) {
if err := validateStorageEndpoint(storageEndpoint); err != nil {
return "", "", err
}

network, address := networkAndAddress(storageEndpoint)
switch network {
case "":
return SQLiteBackend, ""
return SQLiteBackend, "", nil
case "nats":
return NATSBackend, storageEndpoint
return NATSBackend, storageEndpoint, nil
case "http":
fallthrough
case "https":
return ETCDBackend, address
return ETCDBackend, address, nil
}
return network, address
return network, address, nil
}

// networkAndAddress crudely splits a URL string into network (scheme) and address,
Expand All @@ -257,3 +265,16 @@ func networkAndAddress(str string) (string, string) {
}
return "", parts[0]
}

// validateStorageEndpoint validates the given string can be used to infer backend and optionally extract connection
// info
func validateStorageEndpoint(str string) error {
if strings.Contains(str, "://") {
return nil
}
if str == "" {
return nil
}
// without this check kine will silently run embedded sqlite, despite user intending to use a passed backend
return fmt.Errorf("invalid storage endpoint [%s]. Non-empty storage endpoint should be of the format <network>://<address>", str)
}

0 comments on commit b37cc40

Please sign in to comment.