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  }