|
-
-
-
-
- package validation
-
- import (
- "net"
- "net/url"
- "regexp"
- "strings"
-
- "code.gitea.io/gitea/modules/setting"
- )
-
- var loopbackIPBlocks []*net.IPNet
-
- var externalTrackerRegex = regexp.MustCompile(`({?)(?:user|repo|index)+?(}?)`)
-
- func init() {
- for _, cidr := range []string{
- "127.0.0.0/8",
- "::1/128",
- } {
- if _, block, err := net.ParseCIDR(cidr); err == nil {
- loopbackIPBlocks = append(loopbackIPBlocks, block)
- }
- }
- }
-
- func isLoopbackIP(ip string) bool {
- pip := net.ParseIP(ip)
- if pip == nil {
- return false
- }
- for _, block := range loopbackIPBlocks {
- if block.Contains(pip) {
- return true
- }
- }
- return false
- }
-
-
- func IsValidURL(uri string) bool {
- if u, err := url.ParseRequestURI(uri); err != nil ||
- (u.Scheme != "http" && u.Scheme != "https") ||
- !validPort(portOnly(u.Host)) {
- return false
- }
-
- return true
- }
-
-
- func IsAPIURL(uri string) bool {
- return strings.HasPrefix(strings.ToLower(uri), strings.ToLower(setting.AppURL+"api"))
- }
-
-
- func IsValidExternalURL(uri string) bool {
- if !IsValidURL(uri) || IsAPIURL(uri) {
- return false
- }
-
- u, err := url.ParseRequestURI(uri)
- if err != nil {
- return false
- }
-
-
- if isLoopbackIP(u.Hostname()) || strings.ToLower(u.Hostname()) == "localhost" {
- return false
- }
-
-
-
-
- return true
- }
-
-
- func IsValidExternalTrackerURLFormat(uri string) bool {
- if !IsValidExternalURL(uri) {
- return false
- }
-
-
- for _, match := range externalTrackerRegex.FindAllStringSubmatch(uri, -1) {
- if (match[1] == "{" || match[2] == "}") && (match[1] != "{" || match[2] != "}") {
- return false
- }
- }
-
- return true
- }
|