[MM-64686] Expose audit logging functionality via plugin API (#31204)
This commit exposes audit logging functionality to plugins via the plugin API, allowing plugins to create and log audit records. Additionally, it addresses a gob encoding issue that could cause plugin crashes when audit data contains nil pointers or unregistered types.
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
efb960a160
Коммит
aaa62a40ae
@@ -17,7 +17,6 @@ import (
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/mattermost/mattermost/server/public/shared/mlog"
|
||||
"github.com/mattermost/mattermost/server/v8/channels/app"
|
||||
"github.com/mattermost/mattermost/server/v8/channels/audit"
|
||||
"github.com/mattermost/mattermost/server/v8/channels/utils"
|
||||
"github.com/mattermost/mattermost/server/v8/platform/shared/web"
|
||||
)
|
||||
@@ -139,9 +138,9 @@ func uploadFileSimple(c *Context, r *http.Request, timestamp time.Time) *model.F
|
||||
return nil
|
||||
}
|
||||
|
||||
auditRec := c.MakeAuditRecord("uploadFileSimple", audit.Fail)
|
||||
auditRec := c.MakeAuditRecord("uploadFileSimple", model.AuditStatusFail)
|
||||
defer c.LogAuditRec(auditRec)
|
||||
audit.AddEventParameter(auditRec, "channel_id", c.Params.ChannelId)
|
||||
model.AddEventParameterToAuditRec(auditRec, "channel_id", c.Params.ChannelId)
|
||||
|
||||
if !c.App.SessionHasPermissionToChannel(c.AppContext, *c.AppContext.Session(), c.Params.ChannelId, model.PermissionUploadFile) {
|
||||
c.SetPermissionError(model.PermissionUploadFile)
|
||||
@@ -149,12 +148,12 @@ func uploadFileSimple(c *Context, r *http.Request, timestamp time.Time) *model.F
|
||||
}
|
||||
|
||||
clientId := r.Form.Get("client_id")
|
||||
audit.AddEventParameter(auditRec, "client_id", clientId)
|
||||
model.AddEventParameterToAuditRec(auditRec, "client_id", clientId)
|
||||
|
||||
creatorId := c.AppContext.Session().UserId
|
||||
if isBookmark, err := strconv.ParseBool(r.URL.Query().Get(model.BookmarkFileOwner)); err == nil && isBookmark {
|
||||
creatorId = model.BookmarkFileOwner
|
||||
audit.AddEventParameter(auditRec, model.BookmarkFileOwner, true)
|
||||
model.AddEventParameterToAuditRec(auditRec, model.BookmarkFileOwner, true)
|
||||
}
|
||||
|
||||
info, appErr := c.App.UploadFileX(c.AppContext, c.Params.ChannelId, c.Params.Filename, r.Body,
|
||||
@@ -167,7 +166,7 @@ func uploadFileSimple(c *Context, r *http.Request, timestamp time.Time) *model.F
|
||||
c.Err = appErr
|
||||
return nil
|
||||
}
|
||||
audit.AddEventParameterAuditable(auditRec, "file", info)
|
||||
model.AddEventParameterAuditableToAuditRec(auditRec, "file", info)
|
||||
|
||||
fileUploadResponse := &model.FileUploadResponse{
|
||||
FileInfos: []*model.FileInfo{info},
|
||||
@@ -320,14 +319,14 @@ NextPart:
|
||||
clientId = clientIds[nFiles]
|
||||
}
|
||||
|
||||
auditRec := c.MakeAuditRecord("uploadFileMultipart", audit.Fail)
|
||||
audit.AddEventParameter(auditRec, "channel_id", c.Params.ChannelId)
|
||||
audit.AddEventParameter(auditRec, "client_id", clientId)
|
||||
auditRec := c.MakeAuditRecord("uploadFileMultipart", model.AuditStatusFail)
|
||||
model.AddEventParameterToAuditRec(auditRec, "channel_id", c.Params.ChannelId)
|
||||
model.AddEventParameterToAuditRec(auditRec, "client_id", clientId)
|
||||
|
||||
creatorId := c.AppContext.Session().UserId
|
||||
if isBookmark {
|
||||
creatorId = model.BookmarkFileOwner
|
||||
audit.AddEventParameter(auditRec, model.BookmarkFileOwner, true)
|
||||
model.AddEventParameterToAuditRec(auditRec, model.BookmarkFileOwner, true)
|
||||
}
|
||||
|
||||
info, appErr := c.App.UploadFileX(c.AppContext, c.Params.ChannelId, filename, part,
|
||||
@@ -341,7 +340,7 @@ NextPart:
|
||||
c.LogAuditRec(auditRec)
|
||||
return nil
|
||||
}
|
||||
audit.AddEventParameterAuditable(auditRec, "file", info)
|
||||
model.AddEventParameterAuditableToAuditRec(auditRec, "file", info)
|
||||
|
||||
auditRec.Success()
|
||||
c.LogAuditRec(auditRec)
|
||||
@@ -427,15 +426,15 @@ func uploadFileMultipartLegacy(c *Context, mr *multipart.Reader,
|
||||
clientId = clientIds[i]
|
||||
}
|
||||
|
||||
auditRec := c.MakeAuditRecord("uploadFileMultipartLegacy", audit.Fail)
|
||||
auditRec := c.MakeAuditRecord("uploadFileMultipartLegacy", model.AuditStatusFail)
|
||||
defer c.LogAuditRec(auditRec)
|
||||
audit.AddEventParameter(auditRec, "channel_id", channelId)
|
||||
audit.AddEventParameter(auditRec, "client_id", clientId)
|
||||
model.AddEventParameterToAuditRec(auditRec, "channel_id", channelId)
|
||||
model.AddEventParameterToAuditRec(auditRec, "client_id", clientId)
|
||||
|
||||
creatorId := c.AppContext.Session().UserId
|
||||
if isBookmark {
|
||||
creatorId = model.BookmarkFileOwner
|
||||
audit.AddEventParameter(auditRec, model.BookmarkFileOwner, true)
|
||||
model.AddEventParameterToAuditRec(auditRec, model.BookmarkFileOwner, true)
|
||||
}
|
||||
|
||||
info, appErr := c.App.UploadFileX(c.AppContext, c.Params.ChannelId, fileHeader.Filename, f,
|
||||
@@ -450,7 +449,7 @@ func uploadFileMultipartLegacy(c *Context, mr *multipart.Reader,
|
||||
c.LogAuditRec(auditRec)
|
||||
return nil
|
||||
}
|
||||
audit.AddEventParameterAuditable(auditRec, "file", info)
|
||||
model.AddEventParameterAuditableToAuditRec(auditRec, "file", info)
|
||||
|
||||
auditRec.Success()
|
||||
c.LogAuditRec(auditRec)
|
||||
@@ -472,9 +471,9 @@ func getFile(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
forceDownload, _ := strconv.ParseBool(r.URL.Query().Get("download"))
|
||||
|
||||
auditRec := c.MakeAuditRecord("getFile", audit.Fail)
|
||||
auditRec := c.MakeAuditRecord("getFile", model.AuditStatusFail)
|
||||
defer c.LogAuditRec(auditRec)
|
||||
audit.AddEventParameter(auditRec, "force_download", forceDownload)
|
||||
model.AddEventParameterToAuditRec(auditRec, "force_download", forceDownload)
|
||||
|
||||
info, err := c.App.GetFileInfo(c.AppContext, c.Params.FileId)
|
||||
if err != nil {
|
||||
@@ -482,7 +481,7 @@ func getFile(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
setInaccessibleFileHeader(w, err)
|
||||
return
|
||||
}
|
||||
audit.AddEventParameterAuditable(auditRec, "file", info)
|
||||
model.AddEventParameterAuditableToAuditRec(auditRec, "file", info)
|
||||
|
||||
channel, err := c.App.GetChannel(c.AppContext, info.ChannelId)
|
||||
if err != nil {
|
||||
@@ -570,7 +569,7 @@ func getFileLink(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
auditRec := c.MakeAuditRecord("getFileLink", audit.Fail)
|
||||
auditRec := c.MakeAuditRecord("getFileLink", model.AuditStatusFail)
|
||||
defer c.LogAuditRec(auditRec)
|
||||
|
||||
info, err := c.App.GetFileInfo(c.AppContext, c.Params.FileId)
|
||||
@@ -579,7 +578,7 @@ func getFileLink(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
setInaccessibleFileHeader(w, err)
|
||||
return
|
||||
}
|
||||
audit.AddEventParameterAuditable(auditRec, "file", info)
|
||||
model.AddEventParameterAuditableToAuditRec(auditRec, "file", info)
|
||||
|
||||
channel, err := c.App.GetChannel(c.AppContext, info.ChannelId)
|
||||
if err != nil {
|
||||
|
||||
Ссылка в новой задаче
Block a user