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
 | |
| }
 |