| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 | package logicimport (	"encoding/json"	"os"	"regexp"	"strconv"	"strings"	"sync"	"time"	"github.com/gravitl/netmaker/config"	"github.com/gravitl/netmaker/database"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/servercfg")var serverSettingsDBKey = "server_cfg"var SettingsMutex = &sync.RWMutex{}func GetServerSettings() (s models.ServerSettings) {	data, err := database.FetchRecord(database.SERVER_SETTINGS, serverSettingsDBKey)	if err != nil {		return	}	json.Unmarshal([]byte(data), &s)	return}func UpsertServerSettings(s models.ServerSettings) error {	// get curr settings	currSettings := GetServerSettings()	if s.ClientSecret == Mask() {		s.ClientSecret = currSettings.ClientSecret	}	data, err := json.Marshal(s)	if err != nil {		return err	}	err = database.Insert(serverSettingsDBKey, string(data), database.SERVER_SETTINGS)	if err != nil {		return err	}	return nil}func ValidateNewSettings(req models.ServerSettings) bool {	// TODO: add checks for different fields	return true}func GetServerSettingsFromEnv() (s models.ServerSettings) {	s = models.ServerSettings{		NetclientAutoUpdate:        servercfg.AutoUpdateEnabled(),		Verbosity:                  servercfg.GetVerbosity(),		AuthProvider:               os.Getenv("AUTH_PROVIDER"),		OIDCIssuer:                 os.Getenv("OIDC_ISSUER"),		ClientID:                   os.Getenv("CLIENT_ID"),		ClientSecret:               os.Getenv("CLIENT_SECRET"),		AzureTenant:                servercfg.GetAzureTenant(),		Telemetry:                  servercfg.Telemetry(),		BasicAuth:                  servercfg.IsBasicAuthEnabled(),		JwtValidityDuration:        servercfg.GetJwtValidityDurationFromEnv() / 60,		RacAutoDisable:             servercfg.GetRacAutoDisable(),		RacRestrictToSingleNetwork: servercfg.GetRacRestrictToSingleNetwork(),		EndpointDetection:          servercfg.IsEndpointDetectionEnabled(),		AllowedEmailDomains:        servercfg.GetAllowedEmailDomains(),		EmailSenderAddr:            servercfg.GetSenderEmail(),		EmailSenderUser:            servercfg.GetSenderUser(),		EmailSenderPassword:        servercfg.GetEmaiSenderPassword(),		SmtpHost:                   servercfg.GetSmtpHost(),		SmtpPort:                   servercfg.GetSmtpPort(),		MetricInterval:             servercfg.GetMetricInterval(),		MetricsPort:                servercfg.GetMetricsPort(),		ManageDNS:                  servercfg.GetManageDNS(),		DefaultDomain:              servercfg.GetDefaultDomain(),		Stun:                       servercfg.IsStunEnabled(),		StunServers:                servercfg.GetStunServers(),		TextSize:                   "16",		Theme:                      models.Dark,		ReducedMotion:              false,	}	return}// GetServerConfig - gets the server config into memory from file or envfunc GetServerConfig() config.ServerConfig {	var cfg config.ServerConfig	settings := GetServerSettings()	cfg.APIConnString = servercfg.GetAPIConnString()	cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()	cfg.APIHost = servercfg.GetAPIHost()	cfg.APIPort = servercfg.GetAPIPort()	cfg.MasterKey = "(hidden)"	cfg.DNSKey = "(hidden)"	cfg.AllowedOrigin = servercfg.GetAllowedOrigin()	cfg.RestBackend = "off"	cfg.NodeID = servercfg.GetNodeID()	cfg.BrokerType = servercfg.GetBrokerType()	cfg.EmqxRestEndpoint = servercfg.GetEmqxRestEndpoint()	if settings.NetclientAutoUpdate {		cfg.NetclientAutoUpdate = "enabled"	} else {		cfg.NetclientAutoUpdate = "disabled"	}	if servercfg.IsRestBackend() {		cfg.RestBackend = "on"	}	cfg.DNSMode = "off"	if servercfg.IsDNSMode() {		cfg.DNSMode = "on"	}	cfg.DisplayKeys = "off"	if servercfg.IsDisplayKeys() {		cfg.DisplayKeys = "on"	}	cfg.DisableRemoteIPCheck = "off"	if servercfg.DisableRemoteIPCheck() {		cfg.DisableRemoteIPCheck = "on"	}	cfg.Database = servercfg.GetDB()	cfg.Platform = servercfg.GetPlatform()	cfg.Version = servercfg.GetVersion()	cfg.PublicIp = servercfg.GetServerHostIP()	// == auth config ==	var authInfo = GetAuthProviderInfo(settings)	cfg.AuthProvider = authInfo[0]	cfg.ClientID = authInfo[1]	cfg.ClientSecret = authInfo[2]	cfg.FrontendURL = servercfg.GetFrontendURL()	cfg.AzureTenant = settings.AzureTenant	cfg.Telemetry = settings.Telemetry	cfg.Server = servercfg.GetServer()	cfg.Verbosity = settings.Verbosity	cfg.IsPro = "no"	if servercfg.IsPro {		cfg.IsPro = "yes"	}	cfg.JwtValidityDuration = time.Duration(settings.JwtValidityDuration) * time.Minute	cfg.RacAutoDisable = settings.RacAutoDisable	cfg.RacRestrictToSingleNetwork = settings.RacRestrictToSingleNetwork	cfg.MetricInterval = settings.MetricInterval	cfg.ManageDNS = settings.ManageDNS	cfg.Stun = settings.Stun	cfg.StunServers = settings.StunServers	cfg.DefaultDomain = settings.DefaultDomain	return cfg}// GetServerInfo - gets the server config into memory from file or envfunc GetServerInfo() models.ServerConfig {	var cfg models.ServerConfig	serverSettings := GetServerSettings()	cfg.Server = servercfg.GetServer()	if servercfg.GetBrokerType() == servercfg.EmqxBrokerType {		cfg.MQUserName = "HOST_ID"		cfg.MQPassword = "HOST_PASS"	} else {		cfg.MQUserName = servercfg.GetMqUserName()		cfg.MQPassword = servercfg.GetMqPassword()	}	cfg.API = servercfg.GetAPIConnString()	cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()	cfg.APIPort = servercfg.GetAPIPort()	cfg.DNSMode = "off"	cfg.Broker = servercfg.GetPublicBrokerEndpoint()	cfg.BrokerType = servercfg.GetBrokerType()	if servercfg.IsDNSMode() {		cfg.DNSMode = "on"	}	cfg.Version = servercfg.GetVersion()	cfg.IsPro = servercfg.IsPro	cfg.MetricInterval = serverSettings.MetricInterval	cfg.MetricsPort = serverSettings.MetricsPort	cfg.ManageDNS = serverSettings.ManageDNS	cfg.Stun = serverSettings.Stun	cfg.StunServers = serverSettings.StunServers	cfg.DefaultDomain = serverSettings.DefaultDomain	cfg.EndpointDetection = serverSettings.EndpointDetection	return cfg}// GetDefaultDomain - get the default domainfunc GetDefaultDomain() string {	return GetServerSettings().DefaultDomain}func ValidateDomain(domain string) bool {	domainPattern := `[a-zA-Z0-9][a-zA-Z0-9_-]{0,62}(\.[a-zA-Z0-9][a-zA-Z0-9_-]{0,62})*(\.[a-zA-Z][a-zA-Z0-9]{0,10}){1}`	exp := regexp.MustCompile("^" + domainPattern + "$")	return exp.MatchString(domain)}// Telemetry - checks if telemetry data should be sentfunc Telemetry() string {	return GetServerSettings().Telemetry}// GetJwtValidityDuration - returns the JWT validity duration in minutesfunc GetJwtValidityDuration() time.Duration {	return GetServerConfig().JwtValidityDuration}// GetRacAutoDisable - returns whether the feature to autodisable RAC is enabledfunc GetRacAutoDisable() bool {	return GetServerSettings().RacAutoDisable}// GetRacRestrictToSingleNetwork - returns whether the feature to allow simultaneous network connections via RAC is enabledfunc GetRacRestrictToSingleNetwork() bool {	return GetServerSettings().RacRestrictToSingleNetwork}func GetSmtpHost() string {	return GetServerSettings().SmtpHost}func GetSmtpPort() int {	return GetServerSettings().SmtpPort}func GetSenderEmail() string {	return GetServerSettings().EmailSenderAddr}func GetSenderUser() string {	return GetServerSettings().EmailSenderUser}func GetEmaiSenderPassword() string {	return GetServerSettings().EmailSenderPassword}// AutoUpdateEnabled returns a boolean indicating whether netclient auto update is enabled or disabled// default is enabledfunc AutoUpdateEnabled() bool {	return GetServerSettings().NetclientAutoUpdate}// GetAuthProviderInfo = gets the oauth provider infofunc GetAuthProviderInfo(settings models.ServerSettings) (pi []string) {	var authProvider = ""	defer func() {		if authProvider == "oidc" {			if settings.OIDCIssuer != "" {				pi = append(pi, settings.OIDCIssuer)			} else {				pi = []string{"", "", ""}			}		}	}()	if settings.AuthProvider != "" && settings.ClientID != "" && settings.ClientSecret != "" {		authProvider = strings.ToLower(settings.AuthProvider)		if authProvider == "google" || authProvider == "azure-ad" || authProvider == "github" || authProvider == "oidc" {			return []string{authProvider, settings.ClientID, settings.ClientSecret}		} else {			authProvider = ""		}	}	return []string{"", "", ""}}// GetAzureTenant - retrieve the azure tenant ID from env variable or config filefunc GetAzureTenant() string {	return GetServerSettings().AzureTenant}// GetMetricsPort - get metrics portfunc GetMetricsPort() int {	return GetServerSettings().MetricsPort}// GetMetricInterval - get the publish metric intervalfunc GetMetricIntervalInMinutes() time.Duration {	//default 15 minutes	mi := "15"	if os.Getenv("PUBLISH_METRIC_INTERVAL") != "" {		mi = os.Getenv("PUBLISH_METRIC_INTERVAL")	}	interval, err := strconv.Atoi(mi)	if err != nil {		interval = 15	}	return time.Duration(interval) * time.Minute}// GetMetricInterval - get the publish metric intervalfunc GetMetricInterval() string {	return GetServerSettings().MetricInterval}// GetManageDNS - if manage DNS enabled or notfunc GetManageDNS() bool {	return GetServerSettings().ManageDNS}// IsBasicAuthEnabled - checks if basic auth has been configured to be turned offfunc IsBasicAuthEnabled() bool {	return GetServerSettings().BasicAuth}// IsEndpointDetectionEnabled - returns true if endpoint detection enabledfunc IsEndpointDetectionEnabled() bool {	return GetServerSettings().EndpointDetection}// IsStunEnabled - returns true if STUN set to onfunc IsStunEnabled() bool {	return GetServerSettings().Stun}func GetStunServers() string {	return GetServerSettings().StunServers}// GetAllowedEmailDomains - gets the allowed email domains for oauth signupfunc GetAllowedEmailDomains() string {	return GetServerSettings().AllowedEmailDomains}func GetVerbosity() int32 {	return GetServerSettings().Verbosity}func Mask() string {	return ("..................")}
 |