1234567891011121314151617181920212223242526272829303132333435363738394041 |
- // written by Daniel Oaks <daniel@danieloaks.net>
- // 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
- }
|