settings.go 12 KB

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