summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api4/system.go29
-rw-r--r--api4/system_test.go20
-rw-r--r--model/client4.go12
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.