[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.
Этот коммит содержится в:
David Krauser
2025-06-25 20:37:32 -04:00
коммит произвёл GitHub
родитель efb960a160
Коммит aaa62a40ae
68 изменённых файлов: 878 добавлений и 750 удалений

Просмотреть файл

@@ -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 {