mirror of
https://github.com/costela/docker-etchosts.git
synced 2025-05-11 09:55:48 +02:00
Add hostname validation
This commit is contained in:
parent
120c2ccb14
commit
bda6b88888
2 changed files with 28 additions and 6 deletions
32
docker.go
32
docker.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"docker.io/go-docker/api/types"
|
"docker.io/go-docker/api/types"
|
||||||
|
@ -87,30 +88,51 @@ func getIPsToNames(client dockerClienter, id string) (ipsToNamesMap, error) {
|
||||||
return names
|
return names
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validateHostname := func(hosts ...string) []string {
|
||||||
|
var validHosts []string
|
||||||
|
|
||||||
|
for _, host := range hosts {
|
||||||
|
matches, err := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9.-]*[a-zA-Z0-9]$", host)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if matches {
|
||||||
|
validHosts = append(validHosts, host)
|
||||||
|
} else {
|
||||||
|
log.Warnf("Skipping '%s' doas not seem a valid hostname.", host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return validHosts
|
||||||
|
}
|
||||||
|
|
||||||
names = appendNames(names, strings.Trim(containerFull.Name, "/"))
|
names = appendNames(names, strings.Trim(containerFull.Name, "/"))
|
||||||
for _, name := range netInfo.Aliases {
|
for _, name := range netInfo.Aliases {
|
||||||
names = appendNames(names, name)
|
names = appendNames(names, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if label, ok := containerFull.Config.Labels[dockerLabel]; ok {
|
if label, ok := containerFull.Config.Labels[dockerLabel]; ok {
|
||||||
|
label = strings.TrimSpace(label)
|
||||||
if (strings.HasPrefix(label, "[")) {
|
if (strings.HasPrefix(label, "[")) {
|
||||||
var parsed []string;
|
var parsed []string
|
||||||
err := json.Unmarshal([]byte(label), &parsed)
|
err := json.Unmarshal([]byte(label), &parsed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("error parsing JSON: %s", err)
|
log.Errorf("error parsing JSON: %s", err)
|
||||||
}
|
}
|
||||||
names = append(names, parsed...)
|
names = append(names, validateHostname(parsed...)...)
|
||||||
} else if (strings.HasPrefix(label, "\"")) {
|
} else if (strings.HasPrefix(label, `"`)) {
|
||||||
var parsed string;
|
var parsed string;
|
||||||
err := json.Unmarshal([]byte(label), &parsed)
|
err := json.Unmarshal([]byte(label), &parsed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("error parsing JSON: %s", err)
|
log.Errorf("error parsing JSON: %s", err)
|
||||||
}
|
}
|
||||||
names = append(names, parsed)
|
names = append(names, validateHostname(parsed)...)
|
||||||
} else if (strings.HasPrefix(label, "{")) {
|
} else if (strings.HasPrefix(label, "{")) {
|
||||||
log.Errorf("JSON objects are not supported: %s", label)
|
log.Errorf("JSON objects are not supported: %s", label)
|
||||||
} else {
|
} else {
|
||||||
names = append(names, label)
|
names = append(names, validateHostname(label)...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ func (testClient) ContainerInspect(_ context.Context, ID string) (types.Containe
|
||||||
return types.ContainerJSON{
|
return types.ContainerJSON{
|
||||||
ContainerJSONBase: &types.ContainerJSONBase{Name: "service5"},
|
ContainerJSONBase: &types.ContainerJSONBase{Name: "service5"},
|
||||||
Config: &container.Config{Labels: map[string]string{
|
Config: &container.Config{Labels: map[string]string{
|
||||||
dockerLabel: `["a.example.com", "b.example.com"]`,
|
dockerLabel: `["a.example.com", "b.example.com", "invalid."]`,
|
||||||
}},
|
}},
|
||||||
NetworkSettings: &types.NetworkSettings{
|
NetworkSettings: &types.NetworkSettings{
|
||||||
Networks: map[string]*network.EndpointSettings{
|
Networks: map[string]*network.EndpointSettings{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue