118 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
package util
 | 
						|
 | 
						|
import (
 | 
						|
	"net"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/labstack/gommon/log"
 | 
						|
)
 | 
						|
 | 
						|
// Runtime config
 | 
						|
var (
 | 
						|
	DisableLogin      bool
 | 
						|
	BindAddress       string
 | 
						|
	SmtpHostname      string
 | 
						|
	SmtpPort          int
 | 
						|
	SmtpUsername      string
 | 
						|
	SmtpPassword      string
 | 
						|
	SmtpNoTLSCheck    bool
 | 
						|
	SmtpEncryption    string
 | 
						|
	SmtpAuthType      string
 | 
						|
	SendgridApiKey    string
 | 
						|
	EmailFrom         string
 | 
						|
	EmailFromName     string
 | 
						|
	SessionSecret     []byte
 | 
						|
	WgConfTemplate    string
 | 
						|
	BasePath          string
 | 
						|
	SubnetRanges      map[string]([]*net.IPNet)
 | 
						|
	SubnetRangesOrder []string
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	DefaultUsername                        = "admin"
 | 
						|
	DefaultPassword                        = "admin"
 | 
						|
	DefaultIsAdmin                         = true
 | 
						|
	DefaultServerAddress                   = "10.252.1.0/24"
 | 
						|
	DefaultServerPort                      = 51820
 | 
						|
	DefaultDNS                             = "1.1.1.1"
 | 
						|
	DefaultMTU                             = 1450
 | 
						|
	DefaultPersistentKeepalive             = 15
 | 
						|
	DefaultFirewallMark                    = "0xca6c"  // i.e. 51820
 | 
						|
	DefaultTable                           = "auto"
 | 
						|
	DefaultConfigFilePath                  = "/etc/wireguard/wg0.conf"
 | 
						|
	UsernameEnvVar                         = "WGUI_USERNAME"
 | 
						|
	PasswordEnvVar                         = "WGUI_PASSWORD"
 | 
						|
	PasswordFileEnvVar                     = "WGUI_PASSWORD_FILE"
 | 
						|
	PasswordHashEnvVar                     = "WGUI_PASSWORD_HASH"
 | 
						|
	PasswordHashFileEnvVar                 = "WGUI_PASSWORD_HASH_FILE"
 | 
						|
	FaviconFilePathEnvVar                  = "WGUI_FAVICON_FILE_PATH"
 | 
						|
	EndpointAddressEnvVar                  = "WGUI_ENDPOINT_ADDRESS"
 | 
						|
	DNSEnvVar                              = "WGUI_DNS"
 | 
						|
	MTUEnvVar                              = "WGUI_MTU"
 | 
						|
	PersistentKeepaliveEnvVar              = "WGUI_PERSISTENT_KEEPALIVE"
 | 
						|
	FirewallMarkEnvVar                     = "WGUI_FIREWALL_MARK"
 | 
						|
	TableEnvVar                            = "WGUI_TABLE"
 | 
						|
	ConfigFilePathEnvVar                   = "WGUI_CONFIG_FILE_PATH"
 | 
						|
	LogLevel                               = "WGUI_LOG_LEVEL"
 | 
						|
	ServerAddressesEnvVar                  = "WGUI_SERVER_INTERFACE_ADDRESSES"
 | 
						|
	ServerListenPortEnvVar                 = "WGUI_SERVER_LISTEN_PORT"
 | 
						|
	ServerPostUpScriptEnvVar               = "WGUI_SERVER_POST_UP_SCRIPT"
 | 
						|
	ServerPostDownScriptEnvVar             = "WGUI_SERVER_POST_DOWN_SCRIPT"
 | 
						|
	DefaultClientAllowedIpsEnvVar          = "WGUI_DEFAULT_CLIENT_ALLOWED_IPS"
 | 
						|
	DefaultClientExtraAllowedIpsEnvVar     = "WGUI_DEFAULT_CLIENT_EXTRA_ALLOWED_IPS"
 | 
						|
	DefaultClientUseServerDNSEnvVar        = "WGUI_DEFAULT_CLIENT_USE_SERVER_DNS"
 | 
						|
	DefaultClientEnableAfterCreationEnvVar = "WGUI_DEFAULT_CLIENT_ENABLE_AFTER_CREATION"
 | 
						|
)
 | 
						|
 | 
						|
func ParseBasePath(basePath string) string {
 | 
						|
	if !strings.HasPrefix(basePath, "/") {
 | 
						|
		basePath = "/" + basePath
 | 
						|
	}
 | 
						|
	if strings.HasSuffix(basePath, "/") {
 | 
						|
		basePath = strings.TrimSuffix(basePath, "/")
 | 
						|
	}
 | 
						|
	return basePath
 | 
						|
}
 | 
						|
 | 
						|
func ParseSubnetRanges(subnetRangesStr string) map[string]([]*net.IPNet) {
 | 
						|
	subnetRanges := map[string]([]*net.IPNet){}
 | 
						|
	if subnetRangesStr == "" {
 | 
						|
		return subnetRanges
 | 
						|
	}
 | 
						|
	cidrSet := map[string]bool{}
 | 
						|
	subnetRangesStr = strings.TrimSpace(subnetRangesStr)
 | 
						|
	subnetRangesStr = strings.Trim(subnetRangesStr, ";:,")
 | 
						|
	ranges := strings.Split(subnetRangesStr, ";")
 | 
						|
	for _, rng := range ranges {
 | 
						|
		rng = strings.TrimSpace(rng)
 | 
						|
		rngSpl := strings.Split(rng, ":")
 | 
						|
		if len(rngSpl) != 2 {
 | 
						|
			log.Warnf("Unable to parse subnet range: %v. Skipped.", rng)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		rngName := strings.TrimSpace(rngSpl[0])
 | 
						|
		subnetRanges[rngName] = make([]*net.IPNet, 0)
 | 
						|
		cidrs := strings.Split(rngSpl[1], ",")
 | 
						|
		for _, cidr := range cidrs {
 | 
						|
			cidr = strings.TrimSpace(cidr)
 | 
						|
			_, net, err := net.ParseCIDR(cidr)
 | 
						|
			if err != nil {
 | 
						|
				log.Warnf("[%v] Unable to parse CIDR: %v. Skipped.", rngName, cidr)
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			if cidrSet[net.String()] {
 | 
						|
				log.Warnf("[%v] CIDR already exists: %v. Skipped.", rngName, net.String())
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			cidrSet[net.String()] = true
 | 
						|
			subnetRanges[rngName] = append(subnetRanges[rngName], net)
 | 
						|
		}
 | 
						|
		if len(subnetRanges[rngName]) == 0 {
 | 
						|
			delete(subnetRanges, rngName)
 | 
						|
		} else {
 | 
						|
			SubnetRangesOrder = append(SubnetRangesOrder, rngName)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return subnetRanges
 | 
						|
}
 |