github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/api4/compliance.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 "strconv" 9 10 "github.com/avct/uasurfer" 11 12 "github.com/masterhung0112/hk_server/v5/audit" 13 "github.com/masterhung0112/hk_server/v5/model" 14 ) 15 16 func (api *API) InitCompliance() { 17 api.BaseRoutes.Compliance.Handle("/reports", api.ApiSessionRequired(createComplianceReport)).Methods("POST") 18 api.BaseRoutes.Compliance.Handle("/reports", api.ApiSessionRequired(getComplianceReports)).Methods("GET") 19 api.BaseRoutes.Compliance.Handle("/reports/{report_id:[A-Za-z0-9]+}", api.ApiSessionRequired(getComplianceReport)).Methods("GET") 20 api.BaseRoutes.Compliance.Handle("/reports/{report_id:[A-Za-z0-9]+}/download", api.ApiSessionRequiredTrustRequester(downloadComplianceReport)).Methods("GET") 21 } 22 23 func createComplianceReport(c *Context, w http.ResponseWriter, r *http.Request) { 24 job := model.ComplianceFromJson(r.Body) 25 if job == nil { 26 c.SetInvalidParam("compliance") 27 return 28 } 29 30 auditRec := c.MakeAuditRecord("createComplianceReport", audit.Fail) 31 defer c.LogAuditRec(auditRec) 32 33 if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PERMISSION_CREATE_COMPLIANCE_EXPORT_JOB) { 34 c.SetPermissionError(model.PERMISSION_CREATE_COMPLIANCE_EXPORT_JOB) 35 return 36 } 37 38 job.UserId = c.AppContext.Session().UserId 39 40 rjob, err := c.App.SaveComplianceReport(job) 41 if err != nil { 42 c.Err = err 43 return 44 } 45 46 auditRec.Success() 47 auditRec.AddMeta("compliance_id", rjob.Id) 48 auditRec.AddMeta("compliance_desc", rjob.Desc) 49 c.LogAudit("") 50 51 w.WriteHeader(http.StatusCreated) 52 w.Write([]byte(rjob.ToJson())) 53 } 54 55 func getComplianceReports(c *Context, w http.ResponseWriter, r *http.Request) { 56 if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PERMISSION_READ_COMPLIANCE_EXPORT_JOB) { 57 c.SetPermissionError(model.PERMISSION_READ_COMPLIANCE_EXPORT_JOB) 58 return 59 } 60 61 auditRec := c.MakeAuditRecord("getComplianceReports", audit.Fail) 62 defer c.LogAuditRec(auditRec) 63 64 crs, err := c.App.GetComplianceReports(c.Params.Page, c.Params.PerPage) 65 if err != nil { 66 c.Err = err 67 return 68 } 69 70 auditRec.Success() 71 w.Write([]byte(crs.ToJson())) 72 } 73 74 func getComplianceReport(c *Context, w http.ResponseWriter, r *http.Request) { 75 c.RequireReportId() 76 if c.Err != nil { 77 return 78 } 79 80 auditRec := c.MakeAuditRecord("getComplianceReport", audit.Fail) 81 defer c.LogAuditRec(auditRec) 82 83 if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PERMISSION_READ_COMPLIANCE_EXPORT_JOB) { 84 c.SetPermissionError(model.PERMISSION_READ_COMPLIANCE_EXPORT_JOB) 85 return 86 } 87 88 job, err := c.App.GetComplianceReport(c.Params.ReportId) 89 if err != nil { 90 c.Err = err 91 return 92 } 93 94 auditRec.Success() 95 auditRec.AddMeta("compliance_id", job.Id) 96 auditRec.AddMeta("compliance_desc", job.Desc) 97 98 w.Write([]byte(job.ToJson())) 99 } 100 101 func downloadComplianceReport(c *Context, w http.ResponseWriter, r *http.Request) { 102 c.RequireReportId() 103 if c.Err != nil { 104 return 105 } 106 107 auditRec := c.MakeAuditRecord("downloadComplianceReport", audit.Fail) 108 defer c.LogAuditRec(auditRec) 109 auditRec.AddMeta("compliance_id", c.Params.ReportId) 110 111 if !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PERMISSION_DOWNLOAD_COMPLIANCE_EXPORT_RESULT) { 112 c.SetPermissionError(model.PERMISSION_DOWNLOAD_COMPLIANCE_EXPORT_RESULT) 113 return 114 } 115 116 job, err := c.App.GetComplianceReport(c.Params.ReportId) 117 if err != nil { 118 c.Err = err 119 return 120 } 121 auditRec.AddMeta("compliance_id", job.Id) 122 auditRec.AddMeta("compliance_desc", job.Desc) 123 124 reportBytes, err := c.App.GetComplianceFile(job) 125 if err != nil { 126 c.Err = err 127 return 128 } 129 auditRec.AddMeta("length", len(reportBytes)) 130 131 c.LogAudit("downloaded " + job.Desc) 132 133 w.Header().Set("Cache-Control", "max-age=2592000, private") 134 w.Header().Set("Content-Length", strconv.Itoa(len(reportBytes))) 135 w.Header().Del("Content-Type") // Content-Type will be set automatically by the http writer 136 137 // attach extra headers to trigger a download on IE, Edge, and Safari 138 ua := uasurfer.Parse(r.UserAgent()) 139 140 w.Header().Set("Content-Disposition", "attachment;filename=\""+job.JobName()+".zip\"") 141 142 if ua.Browser.Name == uasurfer.BrowserIE || ua.Browser.Name == uasurfer.BrowserSafari { 143 // trim off anything before the final / so we just get the file's name 144 w.Header().Set("Content-Type", "application/octet-stream") 145 } 146 147 auditRec.Success() 148 149 w.Write(reportBytes) 150 }