129 lines
4.1 KiB
Go
129 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
|
|
SmtpEncryption string
|
|
SmtpAuthType string
|
|
SmtpHelo string
|
|
SendgridApiKey string
|
|
EmailFrom string
|
|
EmailFromName string
|
|
SessionSecret [64]byte
|
|
SessionMaxDuration int64
|
|
WgConfTemplate string
|
|
BasePath string
|
|
SubnetRanges map[string]([]*net.IPNet)
|
|
SubnetRangesOrder []string
|
|
|
|
// OIDC config
|
|
OIDCIssuerURL string
|
|
OIDCClientID string
|
|
OIDCClientSecret string
|
|
OIDCRedirectURL string
|
|
OIDCScopes []string
|
|
OIDCAutoProvision bool
|
|
OIDCAdminGroups []string
|
|
)
|
|
|
|
const (
|
|
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"
|
|
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"
|
|
ConfigApplyDelayEnvVar = "WGUI_CONFIG_APPLY_DELAY"
|
|
|
|
// OIDC env vars
|
|
OIDCIssuerURLEnvVar = "OIDC_ISSUER_URL"
|
|
OIDCClientIDEnvVar = "OIDC_CLIENT_ID"
|
|
OIDCClientSecretEnvVar = "OIDC_CLIENT_SECRET"
|
|
OIDCClientSecretFileVar = "OIDC_CLIENT_SECRET_FILE"
|
|
OIDCRedirectURLEnvVar = "OIDC_REDIRECT_URL"
|
|
OIDCScopesEnvVar = "OIDC_SCOPES"
|
|
OIDCAutoProvisionEnvVar = "OIDC_AUTO_PROVISION"
|
|
OIDCAdminGroupsEnvVar = "OIDC_ADMIN_GROUPS"
|
|
)
|
|
|
|
func ParseBasePath(basePath string) string {
|
|
// clean the path: ensure single leading slash, no trailing slash
|
|
basePath = "/" + strings.Trim(basePath, "/")
|
|
if basePath == "/" {
|
|
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
|
|
}
|