github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/api4/config_local.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package api4 5 6 import ( 7 "net/http" 8 "reflect" 9 10 "github.com/masterhung0112/hk_server/v5/audit" 11 "github.com/masterhung0112/hk_server/v5/config" 12 "github.com/masterhung0112/hk_server/v5/model" 13 "github.com/masterhung0112/hk_server/v5/utils" 14 ) 15 16 func (api *API) InitConfigLocal() { 17 api.BaseRoutes.ApiRoot.Handle("/config", api.ApiLocal(localGetConfig)).Methods("GET") 18 api.BaseRoutes.ApiRoot.Handle("/config", api.ApiLocal(localUpdateConfig)).Methods("PUT") 19 api.BaseRoutes.ApiRoot.Handle("/config/patch", api.ApiLocal(localPatchConfig)).Methods("PUT") 20 api.BaseRoutes.ApiRoot.Handle("/config/migrate", api.ApiLocal(migrateConfig)).Methods("POST") 21 } 22 23 func localGetConfig(c *Context, w http.ResponseWriter, r *http.Request) { 24 auditRec := c.MakeAuditRecord("localGetConfig", audit.Fail) 25 defer c.LogAuditRec(auditRec) 26 cfg := c.App.GetSanitizedConfig() 27 auditRec.Success() 28 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") 29 w.Write([]byte(cfg.ToJson())) 30 } 31 32 func localUpdateConfig(c *Context, w http.ResponseWriter, r *http.Request) { 33 cfg := model.ConfigFromJson(r.Body) 34 if cfg == nil { 35 c.SetInvalidParam("config") 36 return 37 } 38 39 auditRec := c.MakeAuditRecord("localUpdateConfig", audit.Fail) 40 defer c.LogAuditRec(auditRec) 41 42 cfg.SetDefaults() 43 44 appCfg := c.App.Config() 45 46 // Do not allow plugin uploads to be toggled through the API 47 cfg.PluginSettings.EnableUploads = appCfg.PluginSettings.EnableUploads 48 49 // Do not allow certificates to be changed through the API 50 cfg.PluginSettings.SignaturePublicKeyFiles = appCfg.PluginSettings.SignaturePublicKeyFiles 51 52 c.App.HandleMessageExportConfig(cfg, appCfg) 53 54 err := cfg.IsValid() 55 if err != nil { 56 c.Err = err 57 return 58 } 59 60 oldCfg, newCfg, err := c.App.SaveConfig(cfg, true) 61 if err != nil { 62 c.Err = err 63 return 64 } 65 66 diffs, diffErr := config.Diff(oldCfg, newCfg) 67 if diffErr != nil { 68 c.Err = model.NewAppError("updateConfig", "api.config.update_config.diff.app_error", nil, diffErr.Error(), http.StatusInternalServerError) 69 return 70 } 71 auditRec.AddMeta("diff", diffs) 72 73 newCfg.Sanitize() 74 75 auditRec.Success() 76 c.LogAudit("updateConfig") 77 78 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") 79 w.Write([]byte(newCfg.ToJson())) 80 } 81 82 func localPatchConfig(c *Context, w http.ResponseWriter, r *http.Request) { 83 cfg := model.ConfigFromJson(r.Body) 84 if cfg == nil { 85 c.SetInvalidParam("config") 86 return 87 } 88 89 auditRec := c.MakeAuditRecord("localPatchConfig", audit.Fail) 90 defer c.LogAuditRec(auditRec) 91 92 appCfg := c.App.Config() 93 filterFn := func(structField reflect.StructField, base, patch reflect.Value) bool { 94 return true 95 } 96 97 if cfg.MessageExportSettings.EnableExport != nil { 98 c.App.HandleMessageExportConfig(cfg, appCfg) 99 } 100 101 updatedCfg, mergeErr := config.Merge(appCfg, cfg, &utils.MergeConfig{ 102 StructFieldFilter: filterFn, 103 }) 104 105 if mergeErr != nil { 106 c.Err = model.NewAppError("patchConfig", "api.config.update_config.restricted_merge.app_error", nil, mergeErr.Error(), http.StatusInternalServerError) 107 return 108 } 109 110 err := updatedCfg.IsValid() 111 if err != nil { 112 c.Err = err 113 return 114 } 115 116 oldCfg, newCfg, err := c.App.SaveConfig(updatedCfg, true) 117 if err != nil { 118 c.Err = err 119 return 120 } 121 diffs, diffErr := config.Diff(oldCfg, newCfg) 122 if diffErr != nil { 123 c.Err = model.NewAppError("patchConfig", "api.config.patch_config.diff.app_error", nil, diffErr.Error(), http.StatusInternalServerError) 124 return 125 } 126 auditRec.AddMeta("diff", diffs) 127 128 auditRec.Success() 129 130 w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") 131 w.Write([]byte(c.App.GetSanitizedConfig().ToJson())) 132 }