settings.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package logic
  2. import (
  3. "encoding/json"
  4. "os"
  5. "regexp"
  6. "strconv"
  7. "strings"
  8. "sync"
  9. "time"
  10. "github.com/gravitl/netmaker/config"
  11. "github.com/gravitl/netmaker/database"
  12. "github.com/gravitl/netmaker/models"
  13. "github.com/gravitl/netmaker/servercfg"
  14. )
  15. var serverSettingsDBKey = "server_cfg"
  16. var SettingsMutex = &sync.RWMutex{}
  17. func GetServerSettings() (s models.ServerSettings) {
  18. data, err := database.FetchRecord(database.SERVER_SETTINGS, serverSettingsDBKey)
  19. if err != nil {
  20. return
  21. }
  22. json.Unmarshal([]byte(data), &s)
  23. return
  24. }
  25. func UpsertServerSettings(s models.ServerSettings) error {
  26. // get curr settings
  27. currSettings := GetServerSettings()
  28. if s.ClientSecret == Mask() {
  29. s.ClientSecret = currSettings.ClientSecret
  30. }
  31. if servercfg.DeployedByOperator() {
  32. s.BasicAuth = true
  33. }
  34. var userFilters []string
  35. for _, userFilter := range s.UserFilters {
  36. userFilter = strings.TrimSpace(userFilter)
  37. if userFilter != "" {
  38. userFilters = append(userFilters, userFilter)
  39. }
  40. }
  41. s.UserFilters = userFilters
  42. var groupFilters []string
  43. for _, groupFilter := range s.GroupFilters {
  44. groupFilter = strings.TrimSpace(groupFilter)
  45. if groupFilter != "" {
  46. groupFilters = append(groupFilters, groupFilter)
  47. }
  48. }
  49. s.GroupFilters = groupFilters
  50. data, err := json.Marshal(s)
  51. if err != nil {
  52. return err
  53. }
  54. err = database.Insert(serverSettingsDBKey, string(data), database.SERVER_SETTINGS)
  55. if err != nil {
  56. return err
  57. }
  58. return nil
  59. }
  60. func ValidateNewSettings(req models.ServerSettings) bool {
  61. // TODO: add checks for different fields
  62. return true
  63. }
  64. func GetServerSettingsFromEnv() (s models.ServerSettings) {
  65. s = models.ServerSettings{
  66. NetclientAutoUpdate: servercfg.AutoUpdateEnabled(),
  67. Verbosity: servercfg.GetVerbosity(),
  68. AuthProvider: os.Getenv("AUTH_PROVIDER"),
  69. OIDCIssuer: os.Getenv("OIDC_ISSUER"),
  70. ClientID: os.Getenv("CLIENT_ID"),
  71. ClientSecret: os.Getenv("CLIENT_SECRET"),
  72. AzureTenant: servercfg.GetAzureTenant(),
  73. Telemetry: servercfg.Telemetry(),
  74. BasicAuth: servercfg.IsBasicAuthEnabled(),
  75. JwtValidityDuration: servercfg.GetJwtValidityDurationFromEnv() / 60,
  76. RacRestrictToSingleNetwork: servercfg.GetRacRestrictToSingleNetwork(),
  77. EndpointDetection: servercfg.IsEndpointDetectionEnabled(),
  78. AllowedEmailDomains: servercfg.GetAllowedEmailDomains(),
  79. EmailSenderAddr: servercfg.GetSenderEmail(),
  80. EmailSenderUser: servercfg.GetSenderUser(),
  81. EmailSenderPassword: servercfg.GetEmaiSenderPassword(),
  82. SmtpHost: servercfg.GetSmtpHost(),
  83. SmtpPort: servercfg.GetSmtpPort(),
  84. MetricInterval: servercfg.GetMetricInterval(),
  85. MetricsPort: servercfg.GetMetricsPort(),
  86. ManageDNS: servercfg.GetManageDNS(),
  87. DefaultDomain: servercfg.GetDefaultDomain(),
  88. Stun: servercfg.IsStunEnabled(),
  89. StunServers: servercfg.GetStunServers(),
  90. TextSize: "16",
  91. Theme: models.Dark,
  92. ReducedMotion: false,
  93. }
  94. return
  95. }
  96. // GetServerConfig - gets the server config into memory from file or env
  97. func GetServerConfig() config.ServerConfig {
  98. var cfg config.ServerConfig
  99. settings := GetServerSettings()
  100. cfg.APIConnString = servercfg.GetAPIConnString()
  101. cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()
  102. cfg.APIHost = servercfg.GetAPIHost()
  103. cfg.APIPort = servercfg.GetAPIPort()
  104. cfg.MasterKey = "(hidden)"
  105. cfg.DNSKey = "(hidden)"
  106. cfg.AllowedOrigin = servercfg.GetAllowedOrigin()
  107. cfg.RestBackend = "off"
  108. cfg.NodeID = servercfg.GetNodeID()
  109. cfg.BrokerType = servercfg.GetBrokerType()
  110. cfg.EmqxRestEndpoint = servercfg.GetEmqxRestEndpoint()
  111. if settings.NetclientAutoUpdate {
  112. cfg.NetclientAutoUpdate = "enabled"
  113. } else {
  114. cfg.NetclientAutoUpdate = "disabled"
  115. }
  116. if servercfg.IsRestBackend() {
  117. cfg.RestBackend = "on"
  118. }
  119. cfg.DNSMode = "off"
  120. if servercfg.IsDNSMode() {
  121. cfg.DNSMode = "on"
  122. }
  123. cfg.DisplayKeys = "off"
  124. if servercfg.IsDisplayKeys() {
  125. cfg.DisplayKeys = "on"
  126. }
  127. cfg.DisableRemoteIPCheck = "off"
  128. if servercfg.DisableRemoteIPCheck() {
  129. cfg.DisableRemoteIPCheck = "on"
  130. }
  131. cfg.Database = servercfg.GetDB()
  132. cfg.Platform = servercfg.GetPlatform()
  133. cfg.Version = servercfg.GetVersion()
  134. cfg.PublicIp = servercfg.GetServerHostIP()
  135. // == auth config ==
  136. var authInfo = GetAuthProviderInfo(settings)
  137. cfg.AuthProvider = authInfo[0]
  138. cfg.ClientID = authInfo[1]
  139. cfg.ClientSecret = authInfo[2]
  140. cfg.FrontendURL = servercfg.GetFrontendURL()
  141. cfg.AzureTenant = settings.AzureTenant
  142. cfg.Telemetry = settings.Telemetry
  143. cfg.Server = servercfg.GetServer()
  144. cfg.Verbosity = settings.Verbosity
  145. cfg.IsPro = "no"
  146. if servercfg.IsPro {
  147. cfg.IsPro = "yes"
  148. }
  149. cfg.JwtValidityDuration = time.Duration(settings.JwtValidityDuration) * time.Minute
  150. cfg.RacRestrictToSingleNetwork = settings.RacRestrictToSingleNetwork
  151. cfg.MetricInterval = settings.MetricInterval
  152. cfg.ManageDNS = settings.ManageDNS
  153. cfg.Stun = settings.Stun
  154. cfg.StunServers = settings.StunServers
  155. cfg.DefaultDomain = settings.DefaultDomain
  156. return cfg
  157. }
  158. // GetServerInfo - gets the server config into memory from file or env
  159. func GetServerInfo() models.ServerConfig {
  160. var cfg models.ServerConfig
  161. serverSettings := GetServerSettings()
  162. cfg.Server = servercfg.GetServer()
  163. if servercfg.GetBrokerType() == servercfg.EmqxBrokerType {
  164. cfg.MQUserName = "HOST_ID"
  165. cfg.MQPassword = "HOST_PASS"
  166. } else {
  167. cfg.MQUserName = servercfg.GetMqUserName()
  168. cfg.MQPassword = servercfg.GetMqPassword()
  169. }
  170. cfg.API = servercfg.GetAPIConnString()
  171. cfg.CoreDNSAddr = servercfg.GetCoreDNSAddr()
  172. cfg.APIPort = servercfg.GetAPIPort()
  173. cfg.DNSMode = "off"
  174. cfg.Broker = servercfg.GetPublicBrokerEndpoint()
  175. cfg.BrokerType = servercfg.GetBrokerType()
  176. if servercfg.IsDNSMode() {
  177. cfg.DNSMode = "on"
  178. }
  179. cfg.Version = servercfg.GetVersion()
  180. cfg.IsPro = servercfg.IsPro
  181. cfg.MetricInterval = serverSettings.MetricInterval
  182. cfg.MetricsPort = serverSettings.MetricsPort
  183. cfg.ManageDNS = serverSettings.ManageDNS
  184. cfg.Stun = serverSettings.Stun
  185. cfg.StunServers = serverSettings.StunServers
  186. cfg.DefaultDomain = serverSettings.DefaultDomain
  187. cfg.EndpointDetection = serverSettings.EndpointDetection
  188. return cfg
  189. }
  190. // GetDefaultDomain - get the default domain
  191. func GetDefaultDomain() string {
  192. return GetServerSettings().DefaultDomain
  193. }
  194. func ValidateDomain(domain string) bool {
  195. 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}`
  196. exp := regexp.MustCompile("^" + domainPattern + "$")
  197. return exp.MatchString(domain)
  198. }
  199. // Telemetry - checks if telemetry data should be sent
  200. func Telemetry() string {
  201. return GetServerSettings().Telemetry
  202. }
  203. // GetJwtValidityDuration - returns the JWT validity duration in minutes
  204. func GetJwtValidityDuration() time.Duration {
  205. return GetServerConfig().JwtValidityDuration
  206. }
  207. // GetRacRestrictToSingleNetwork - returns whether the feature to allow simultaneous network connections via RAC is enabled
  208. func GetRacRestrictToSingleNetwork() bool {
  209. return GetServerSettings().RacRestrictToSingleNetwork
  210. }
  211. func GetSmtpHost() string {
  212. return GetServerSettings().SmtpHost
  213. }
  214. func GetSmtpPort() int {
  215. return GetServerSettings().SmtpPort
  216. }
  217. func GetSenderEmail() string {
  218. return GetServerSettings().EmailSenderAddr
  219. }
  220. func GetSenderUser() string {
  221. return GetServerSettings().EmailSenderUser
  222. }
  223. func GetEmaiSenderPassword() string {
  224. return GetServerSettings().EmailSenderPassword
  225. }
  226. // AutoUpdateEnabled returns a boolean indicating whether netclient auto update is enabled or disabled
  227. // default is enabled
  228. func AutoUpdateEnabled() bool {
  229. return GetServerSettings().NetclientAutoUpdate
  230. }
  231. // GetAuthProviderInfo = gets the oauth provider info
  232. func GetAuthProviderInfo(settings models.ServerSettings) (pi []string) {
  233. var authProvider = ""
  234. defer func() {
  235. if authProvider == "okta" || authProvider == "oidc" {
  236. if settings.OIDCIssuer != "" {
  237. pi = append(pi, settings.OIDCIssuer)
  238. } else {
  239. pi = []string{"", "", ""}
  240. }
  241. }
  242. }()
  243. if settings.AuthProvider != "" && settings.ClientID != "" && settings.ClientSecret != "" {
  244. authProvider = strings.ToLower(settings.AuthProvider)
  245. if authProvider == "google" || authProvider == "azure-ad" || authProvider == "github" || authProvider == "oidc" || authProvider == "okta" {
  246. return []string{authProvider, settings.ClientID, settings.ClientSecret}
  247. } else {
  248. authProvider = ""
  249. }
  250. }
  251. return []string{"", "", ""}
  252. }
  253. // GetAzureTenant - retrieve the azure tenant ID from env variable or config file
  254. func GetAzureTenant() string {
  255. return GetServerSettings().AzureTenant
  256. }
  257. // IsSyncEnabled returns whether auth provider sync is enabled.
  258. func IsSyncEnabled() bool {
  259. return GetServerSettings().SyncEnabled
  260. }
  261. // GetIDPSyncInterval returns the interval at which the netmaker should sync
  262. // data from IDP.
  263. func GetIDPSyncInterval() time.Duration {
  264. syncInterval, err := time.ParseDuration(GetServerSettings().IDPSyncInterval)
  265. if err != nil {
  266. return 24 * time.Hour
  267. }
  268. if syncInterval == 0 {
  269. return 24 * time.Hour
  270. }
  271. return syncInterval
  272. }
  273. // GetMetricsPort - get metrics port
  274. func GetMetricsPort() int {
  275. return GetServerSettings().MetricsPort
  276. }
  277. // GetMetricInterval - get the publish metric interval
  278. func GetMetricIntervalInMinutes() time.Duration {
  279. //default 15 minutes
  280. mi := "15"
  281. if os.Getenv("PUBLISH_METRIC_INTERVAL") != "" {
  282. mi = os.Getenv("PUBLISH_METRIC_INTERVAL")
  283. }
  284. interval, err := strconv.Atoi(mi)
  285. if err != nil {
  286. interval = 15
  287. }
  288. return time.Duration(interval) * time.Minute
  289. }
  290. // GetMetricInterval - get the publish metric interval
  291. func GetMetricInterval() string {
  292. return GetServerSettings().MetricInterval
  293. }
  294. // GetManageDNS - if manage DNS enabled or not
  295. func GetManageDNS() bool {
  296. return GetServerSettings().ManageDNS
  297. }
  298. // IsBasicAuthEnabled - checks if basic auth has been configured to be turned off
  299. func IsBasicAuthEnabled() bool {
  300. if servercfg.DeployedByOperator() {
  301. return true
  302. }
  303. return GetServerSettings().BasicAuth
  304. }
  305. // IsMFAEnforced returns whether MFA has been enforced.
  306. func IsMFAEnforced() bool {
  307. return GetServerSettings().MFAEnforced
  308. }
  309. // IsEndpointDetectionEnabled - returns true if endpoint detection enabled
  310. func IsEndpointDetectionEnabled() bool {
  311. return GetServerSettings().EndpointDetection
  312. }
  313. // IsStunEnabled - returns true if STUN set to on
  314. func IsStunEnabled() bool {
  315. return GetServerSettings().Stun
  316. }
  317. func GetStunServers() string {
  318. return GetServerSettings().StunServers
  319. }
  320. // GetAllowedEmailDomains - gets the allowed email domains for oauth signup
  321. func GetAllowedEmailDomains() string {
  322. return GetServerSettings().AllowedEmailDomains
  323. }
  324. func GetVerbosity() int32 {
  325. return GetServerSettings().Verbosity
  326. }
  327. func Mask() string {
  328. return ("..................")
  329. }