diff --git a/irc/config.go b/irc/config.go index 0142b3fb..8072768e 100644 --- a/irc/config.go +++ b/irc/config.go @@ -110,6 +110,9 @@ func LoadConfig(filename string) (config *Config, err error) { if config.Server.Name == "" { return nil, errors.New("Server name missing") } + if !IsHostname(config.Server.Name) { + return nil, errors.New("Server name must match the format of a hostname") + } if config.Server.Database == "" { return nil, errors.New("Server database missing") } diff --git a/irc/net.go b/irc/net.go index d2dba3a8..446dfcbe 100644 --- a/irc/net.go +++ b/irc/net.go @@ -27,3 +27,28 @@ func LookupHostname(addr Name) Name { hostname := strings.TrimSuffix(names[0], ".") return Name(hostname) } + +var allowedHostnameChars = "abcdefghijklmnopqrstuvwxyz1234567890-." + +func IsHostname(name string) bool { + // IRC hostnames specifically require a period + if !strings.Contains(name, ".") || len(name) < 1 || len(name) > 253 { + return false + } + + // ensure each part of hostname is valid + for _, part := range strings.Split(name, ".") { + if len(part) < 1 || len(part) > 63 || strings.HasPrefix(part, "-") || strings.HasSuffix(part, "-") { + return false + } + } + + // ensure all chars of hostname are valid + for _, char := range strings.Split(strings.ToLower(name), "") { + if !strings.Contains(allowedHostnameChars, char) { + return false + } + } + + return true +} diff --git a/irc/strings.go b/irc/strings.go index d3f9aa7f..52126c68 100644 --- a/irc/strings.go +++ b/irc/strings.go @@ -47,6 +47,10 @@ func (name Name) IsNickname() bool { strings.Contains(namestr, "!") || strings.Contains(namestr, "@") { return false } + // names that look like hostnames are restricted to servers, as with other ircds + if IsHostname(namestr) { + return false + } return NicknameExpr.MatchString(namestr) }