| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | // Copyright 2022 The Gogs Authors. All rights reserved.// Use of this source code is governed by a MIT-style// license that can be found in the LICENSE file.package netutilimport (	"fmt"	"net")var localCIDRs []*net.IPNetfunc init() {	// Parsing hardcoded CIDR strings should never fail, if in case it does, let's	// fail it at start.	rawCIDRs := []string{		// https://datatracker.ietf.org/doc/html/rfc5735:		"127.0.0.0/8",        // Loopback		"0.0.0.0/8",          // "This" network		"100.64.0.0/10",      // Shared address space		"169.254.0.0/16",     // Link local		"172.16.0.0/12",      // Private-use networks		"192.0.0.0/24",       // IETF Protocol assignments		"192.0.2.0/24",       // TEST-NET-1		"192.88.99.0/24",     // 6to4 Relay anycast		"192.168.0.0/16",     // Private-use networks		"198.18.0.0/15",      // Network interconnect		"198.51.100.0/24",    // TEST-NET-2		"203.0.113.0/24",     // TEST-NET-3		"255.255.255.255/32", // Limited broadcast		// https://datatracker.ietf.org/doc/html/rfc1918:		"10.0.0.0/8", // Private-use networks		// https://datatracker.ietf.org/doc/html/rfc6890:		"::1/128",   // Loopback		"FC00::/7",  // Unique local address		"FE80::/10", // Multicast address	}	for _, raw := range rawCIDRs {		_, cidr, err := net.ParseCIDR(raw)		if err != nil {			panic(fmt.Sprintf("parse CIDR %q: %v", raw, err))		}		localCIDRs = append(localCIDRs, cidr)	}}// IsBlockedLocalHostname returns true if given hostname is resolved to a local// network address that is implicitly blocked (i.e. not exempted from the// allowlist).func IsBlockedLocalHostname(hostname string, allowlist []string) bool {	for _, allow := range allowlist {		if hostname == allow || allow == "*" {			return false		}	}	ips, err := net.LookupIP(hostname)	if err != nil {		return true	}	for _, ip := range ips {		for _, cidr := range localCIDRs {			if cidr.Contains(ip) {				return true			}		}	}	return false}
 |