settings.go 13 KB

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