// written by Daniel Oaks // released under the ISC license package ircutils import "strings" var allowedHostnameChars = "abcdefghijklmnopqrstuvwxyz1234567890-." // HostnameIsValid provides a way for servers to check whether a looked-up client // hostname is valid (see InspIRCd #1033 for why this is required). // // This function shouldn't be called by clients since they don't need to validate // hostnames for IRC use, just by servers that need to confirm hostnames of incoming // clients. // // In addition to this function, servers should impose their own limits on max // hostname length -- this function limits it to 200 but most servers will probably // want to make it smaller than that. func HostnameIsValid(hostname string) bool { // IRC hostnames specifically require a period, rough limit of 200 chars if !strings.Contains(hostname, ".") || len(hostname) < 1 || len(hostname) > 200 { return false } // ensure each part of hostname is valid for _, part := range strings.Split(hostname, ".") { 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(hostname), "") { if !strings.Contains(allowedHostnameChars, char) { return false } } return true }