mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-06 20:05:46 +08:00
commit
ded01ed85d
6 changed files with 95 additions and 23 deletions
|
@ -377,15 +377,6 @@ func identifySettingsUpdateAction(old, new models.ServerSettings) models.Action
|
||||||
return models.UpdateMonitoringAndDebuggingSettings
|
return models.UpdateMonitoringAndDebuggingSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
if old.Theme != new.Theme {
|
|
||||||
return models.UpdateDisplaySettings
|
|
||||||
}
|
|
||||||
|
|
||||||
if old.TextSize != new.TextSize ||
|
|
||||||
old.ReducedMotion != new.ReducedMotion {
|
|
||||||
return models.UpdateAccessibilitySettings
|
|
||||||
}
|
|
||||||
|
|
||||||
if old.EmailSenderAddr != new.EmailSenderAddr ||
|
if old.EmailSenderAddr != new.EmailSenderAddr ||
|
||||||
old.EmailSenderUser != new.EmailSenderUser ||
|
old.EmailSenderUser != new.EmailSenderUser ||
|
||||||
old.EmailSenderPassword != new.EmailSenderPassword ||
|
old.EmailSenderPassword != new.EmailSenderPassword ||
|
||||||
|
|
|
@ -49,6 +49,8 @@ func userHandlers(r *mux.Router) {
|
||||||
r.HandleFunc("/api/users/{username}", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUser)))).Methods(http.MethodGet)
|
r.HandleFunc("/api/users/{username}", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUser)))).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/api/users/{username}/enable", logic.SecurityCheck(true, http.HandlerFunc(enableUserAccount))).Methods(http.MethodPost)
|
r.HandleFunc("/api/users/{username}/enable", logic.SecurityCheck(true, http.HandlerFunc(enableUserAccount))).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/api/users/{username}/disable", logic.SecurityCheck(true, http.HandlerFunc(disableUserAccount))).Methods(http.MethodPost)
|
r.HandleFunc("/api/users/{username}/disable", logic.SecurityCheck(true, http.HandlerFunc(disableUserAccount))).Methods(http.MethodPost)
|
||||||
|
r.HandleFunc("/api/users/{username}/settings", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUserSettings)))).Methods(http.MethodGet)
|
||||||
|
r.HandleFunc("/api/users/{username}/settings", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(updateUserSettings)))).Methods(http.MethodPut)
|
||||||
r.HandleFunc("/api/v1/users", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUserV1)))).Methods(http.MethodGet)
|
r.HandleFunc("/api/v1/users", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUserV1)))).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/api/users", logic.SecurityCheck(true, http.HandlerFunc(getUsers))).Methods(http.MethodGet)
|
r.HandleFunc("/api/users", logic.SecurityCheck(true, http.HandlerFunc(getUsers))).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/api/v1/users/roles", logic.SecurityCheck(true, http.HandlerFunc(ListRoles))).Methods(http.MethodGet)
|
r.HandleFunc("/api/v1/users/roles", logic.SecurityCheck(true, http.HandlerFunc(ListRoles))).Methods(http.MethodGet)
|
||||||
|
@ -817,6 +819,46 @@ func disableUserAccount(w http.ResponseWriter, r *http.Request) {
|
||||||
logic.ReturnSuccessResponse(w, r, "user account disabled")
|
logic.ReturnSuccessResponse(w, r, "user account disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Summary Get a user's preferences and settings
|
||||||
|
// @Router /api/users/{username}/settings [get]
|
||||||
|
// @Tags Users
|
||||||
|
// @Param username path string true "Username of the user"
|
||||||
|
// @Success 200 {object} models.SuccessResponse
|
||||||
|
func getUserSettings(w http.ResponseWriter, r *http.Request) {
|
||||||
|
userID := r.Header.Get("user")
|
||||||
|
userSettings := logic.GetUserSettings(userID)
|
||||||
|
logic.ReturnSuccessResponseWithJson(w, r, userSettings, "fetched user settings")
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Summary Update a user's preferences and settings
|
||||||
|
// @Router /api/users/{username}/settings [put]
|
||||||
|
// @Tags Users
|
||||||
|
// @Param username path string true "Username of the user"
|
||||||
|
// @Success 200 {object} models.SuccessResponse
|
||||||
|
// @Failure 400 {object} models.ErrorResponse
|
||||||
|
// @Failure 500 {object} models.ErrorResponse
|
||||||
|
func updateUserSettings(w http.ResponseWriter, r *http.Request) {
|
||||||
|
userID := r.Header.Get("user")
|
||||||
|
var req models.UserSettings
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
if err != nil {
|
||||||
|
logger.Log(0, "failed to decode request body: ", err.Error())
|
||||||
|
err = fmt.Errorf("invalid request body: %v", err)
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = logic.UpsertUserSettings(userID, req)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("failed to update user settings: %v", err.Error())
|
||||||
|
logger.Log(0, err.Error())
|
||||||
|
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logic.ReturnSuccessResponseWithJson(w, r, req, "updated user settings")
|
||||||
|
}
|
||||||
|
|
||||||
// swagger:route GET /api/v1/users user getUserV1
|
// swagger:route GET /api/v1/users user getUserV1
|
||||||
//
|
//
|
||||||
// Get an individual user with role info.
|
// Get an individual user with role info.
|
||||||
|
@ -1383,6 +1425,7 @@ func deleteUser(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ = logic.DeleteUserInvite(user.UserName)
|
||||||
mq.PublishPeerUpdate(false)
|
mq.PublishPeerUpdate(false)
|
||||||
if servercfg.IsDNSMode() {
|
if servercfg.IsDNSMode() {
|
||||||
logic.SetDNS()
|
logic.SetDNS()
|
||||||
|
|
|
@ -15,11 +15,17 @@ import (
|
||||||
"github.com/gravitl/netmaker/servercfg"
|
"github.com/gravitl/netmaker/servercfg"
|
||||||
)
|
)
|
||||||
|
|
||||||
var serverSettingsDBKey = "server_cfg"
|
var ServerSettingsDBKey = "server_cfg"
|
||||||
var SettingsMutex = &sync.RWMutex{}
|
var SettingsMutex = &sync.RWMutex{}
|
||||||
|
|
||||||
|
var defaultUserSettings = models.UserSettings{
|
||||||
|
TextSize: "16",
|
||||||
|
Theme: models.Dark,
|
||||||
|
ReducedMotion: false,
|
||||||
|
}
|
||||||
|
|
||||||
func GetServerSettings() (s models.ServerSettings) {
|
func GetServerSettings() (s models.ServerSettings) {
|
||||||
data, err := database.FetchRecord(database.SERVER_SETTINGS, serverSettingsDBKey)
|
data, err := database.FetchRecord(database.SERVER_SETTINGS, ServerSettingsDBKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -42,13 +48,47 @@ func UpsertServerSettings(s models.ServerSettings) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = database.Insert(serverSettingsDBKey, string(data), database.SERVER_SETTINGS)
|
err = database.Insert(ServerSettingsDBKey, string(data), database.SERVER_SETTINGS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetUserSettings(userID string) models.UserSettings {
|
||||||
|
data, err := database.FetchRecord(database.SERVER_SETTINGS, userID)
|
||||||
|
if err != nil {
|
||||||
|
return defaultUserSettings
|
||||||
|
}
|
||||||
|
var userSettings models.UserSettings
|
||||||
|
err = json.Unmarshal([]byte(data), &userSettings)
|
||||||
|
if err != nil {
|
||||||
|
return defaultUserSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
return userSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpsertUserSettings(userID string, userSettings models.UserSettings) error {
|
||||||
|
if userSettings.TextSize == "" {
|
||||||
|
userSettings.TextSize = "16"
|
||||||
|
}
|
||||||
|
|
||||||
|
if userSettings.Theme == "" {
|
||||||
|
userSettings.Theme = models.Dark
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := json.Marshal(userSettings)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return database.Insert(userID, string(data), database.SERVER_SETTINGS)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteUserSettings(userID string) error {
|
||||||
|
return database.DeleteRecord(database.SERVER_SETTINGS, userID)
|
||||||
|
}
|
||||||
|
|
||||||
func ValidateNewSettings(req models.ServerSettings) bool {
|
func ValidateNewSettings(req models.ServerSettings) bool {
|
||||||
// TODO: add checks for different fields
|
// TODO: add checks for different fields
|
||||||
if req.JwtValidityDuration > 525600 || req.JwtValidityDuration < 5 {
|
if req.JwtValidityDuration > 525600 || req.JwtValidityDuration < 5 {
|
||||||
|
@ -87,9 +127,6 @@ func GetServerSettingsFromEnv() (s models.ServerSettings) {
|
||||||
DefaultDomain: servercfg.GetDefaultDomain(),
|
DefaultDomain: servercfg.GetDefaultDomain(),
|
||||||
Stun: servercfg.IsStunEnabled(),
|
Stun: servercfg.IsStunEnabled(),
|
||||||
StunServers: servercfg.GetStunServers(),
|
StunServers: servercfg.GetStunServers(),
|
||||||
TextSize: "16",
|
|
||||||
Theme: models.Dark,
|
|
||||||
ReducedMotion: false,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -25,7 +25,7 @@ import (
|
||||||
|
|
||||||
// Run - runs all migrations
|
// Run - runs all migrations
|
||||||
func Run() {
|
func Run() {
|
||||||
settings()
|
migrateSettings()
|
||||||
updateEnrollmentKeys()
|
updateEnrollmentKeys()
|
||||||
assignSuperAdmin()
|
assignSuperAdmin()
|
||||||
createDefaultTagsAndPolicies()
|
createDefaultTagsAndPolicies()
|
||||||
|
@ -635,8 +635,8 @@ func migrateToEgressV1() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func settings() {
|
func migrateSettings() {
|
||||||
_, err := database.FetchRecords(database.SERVER_SETTINGS)
|
_, err := database.FetchRecord(database.SERVER_SETTINGS, logic.ServerSettingsDBKey)
|
||||||
if database.IsEmptyRecord(err) {
|
if database.IsEmptyRecord(err) {
|
||||||
logic.UpsertServerSettings(logic.GetServerSettingsFromEnv())
|
logic.UpsertServerSettings(logic.GetServerSettingsFromEnv())
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,6 @@ const (
|
||||||
UpdateClientSettings Action = "UPDATE_CLIENT_SETTINGS"
|
UpdateClientSettings Action = "UPDATE_CLIENT_SETTINGS"
|
||||||
UpdateAuthenticationSecuritySettings Action = "UPDATE_AUTHENTICATION_SECURITY_SETTINGS"
|
UpdateAuthenticationSecuritySettings Action = "UPDATE_AUTHENTICATION_SECURITY_SETTINGS"
|
||||||
UpdateMonitoringAndDebuggingSettings Action = "UPDATE_MONITORING_AND_DEBUGGING_SETTINGS"
|
UpdateMonitoringAndDebuggingSettings Action = "UPDATE_MONITORING_AND_DEBUGGING_SETTINGS"
|
||||||
UpdateDisplaySettings Action = "UPDATE_DISPLAY_SETTINGS"
|
|
||||||
UpdateAccessibilitySettings Action = "UPDATE_ACCESSIBILITY_SETTINGS"
|
|
||||||
UpdateSMTPSettings Action = "UPDATE_EMAIL_SETTINGS"
|
UpdateSMTPSettings Action = "UPDATE_EMAIL_SETTINGS"
|
||||||
UpdateIDPSettings Action = "UPDATE_IDP_SETTINGS"
|
UpdateIDPSettings Action = "UPDATE_IDP_SETTINGS"
|
||||||
)
|
)
|
||||||
|
|
|
@ -45,8 +45,11 @@ type ServerSettings struct {
|
||||||
DefaultDomain string `json:"default_domain"`
|
DefaultDomain string `json:"default_domain"`
|
||||||
Stun bool `json:"stun"`
|
Stun bool `json:"stun"`
|
||||||
StunServers string `json:"stun_servers"`
|
StunServers string `json:"stun_servers"`
|
||||||
|
AuditLogsRetentionPeriodInDays int `json:"audit_logs_retention_period"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserSettings struct {
|
||||||
Theme Theme `json:"theme"`
|
Theme Theme `json:"theme"`
|
||||||
TextSize string `json:"text_size"`
|
TextSize string `json:"text_size"`
|
||||||
ReducedMotion bool `json:"reduced_motion"`
|
ReducedMotion bool `json:"reduced_motion"`
|
||||||
AuditLogsRetentionPeriodInDays int `json:"audit_logs_retention_period"`
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue