// Package classes holds the menu plugin's link rules and the tree the public // API serves. package classes import "strings" // AllowedURL reports whether an entry URL may be stored and served: empty, a // path starting with "/", a fragment starting with "#", or an absolute // http, https, mailto or tel URL (case-insensitive). Anything else, such as // javascript: or data:, is refused, and so is a URL with surrounding // whitespace or control characters, which browsers strip before reading the // scheme (RESEARCH Pitfall 15). func AllowedURL(url string) bool { if url == "" { return true } for _, r := range url { if r < 0x20 || r == 0x7f { return false } } if strings.TrimSpace(url) != url { return false } if url[0] == '/' || url[0] == '#' { return true } lower := strings.ToLower(url) for _, prefix := range []string{"http://", "https://", "mailto:", "tel:"} { if strings.HasPrefix(lower, prefix) { return true } } return false } // The link targets an entry may open in. const ( TargetSelf = "_self" TargetBlank = "_blank" ) // AllowedTarget reports whether target is _self, _blank or empty. func AllowedTarget(target string) bool { return target == "" || target == TargetSelf || target == TargetBlank }