diff options
-rw-r--r-- | api4/system.go | 29 | ||||
-rw-r--r-- | api4/system_test.go | 20 | ||||
-rw-r--r-- | model/client4.go | 12 |
3 files changed, 61 insertions, 0 deletions
diff --git a/api4/system.go b/api4/system.go index dfc702c8c..55be559bf 100644 --- a/api4/system.go +++ b/api4/system.go @@ -29,6 +29,7 @@ func InitSystem() { BaseRoutes.ApiRoot.Handle("/caches/invalidate", ApiSessionRequired(invalidateCaches)).Methods("POST") BaseRoutes.ApiRoot.Handle("/logs", ApiSessionRequired(getLogs)).Methods("GET") + BaseRoutes.ApiRoot.Handle("/logs", ApiSessionRequired(postLog)).Methods("POST") } func getSystemPing(c *Context, w http.ResponseWriter, r *http.Request) { @@ -160,6 +161,34 @@ func getLogs(c *Context, w http.ResponseWriter, r *http.Request) { w.Write([]byte(model.ArrayToJson(lines))) } +func postLog(c *Context, w http.ResponseWriter, r *http.Request) { + if !*utils.Cfg.ServiceSettings.EnableDeveloper && !app.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) { + c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM) + return + } + + m := model.MapFromJson(r.Body) + lvl := m["level"] + msg := m["message"] + + if len(msg) > 400 { + msg = msg[0:399] + } + + if lvl == "ERROR" { + err := &model.AppError{} + err.Message = msg + err.Id = msg + err.Where = "client" + c.LogError(err) + } else { + l4g.Debug(msg) + } + + m["message"] = msg + w.Write([]byte(model.MapToJson(m))) +} + func getClientConfig(c *Context, w http.ResponseWriter, r *http.Request) { format := r.URL.Query().Get("format") diff --git a/api4/system_test.go b/api4/system_test.go index b2b5d3f43..ba30dd1eb 100644 --- a/api4/system_test.go +++ b/api4/system_test.go @@ -317,3 +317,23 @@ func TestGetLogs(t *testing.T) { _, resp = Client.GetLogs(0, 10) CheckUnauthorizedStatus(t, resp) } + +func TestPostLog(t *testing.T) { + th := Setup().InitBasic().InitSystemAdmin() + defer TearDown() + Client := th.Client + + message := make(map[string]string) + message["level"] = "ERROR" + message["message"] = "this is a test" + + _, resp := Client.PostLog(message) + CheckForbiddenStatus(t, resp) + + logMessage, resp := th.SystemAdminClient.PostLog(message) + CheckNoError(t, resp) + if len(logMessage) == 0 { + t.Fatal("should return the log message") + } + +} diff --git a/model/client4.go b/model/client4.go index 04615f9e4..ac5ebf03e 100644 --- a/model/client4.go +++ b/model/client4.go @@ -2229,6 +2229,18 @@ func (c *Client4) GetLogs(page, perPage int) ([]string, *Response) { } } +// PostLog is a convenience Web Service call so clients can log messages into +// the server-side logs. For example we typically log javascript error messages +// into the server-side. It returns the log message if the logging was successful. +func (c *Client4) PostLog(message map[string]string) (map[string]string, *Response) { + if r, err := c.DoApiPost("/logs", MapToJson(message)); err != nil { + return nil, &Response{StatusCode: r.StatusCode, Error: err} + } else { + defer closeBody(r) + return MapFromJson(r.Body), BuildResponse(r) + } +} + // OAuth Section // CreateOAuthApp will register a new OAuth 2.0 client application with Mattermost acting as an OAuth 2.0 service provider. |