webhook.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
  2. // See LICENSE.txt for license information.
  3. package api4
  4. import (
  5. "net/http"
  6. "github.com/mattermost/mattermost-server/v5/audit"
  7. "github.com/mattermost/mattermost-server/v5/model"
  8. )
  9. func (api *API) InitWebhook() {
  10. api.BaseRoutes.IncomingHooks.Handle("", api.ApiSessionRequired(createIncomingHook)).Methods("POST")
  11. api.BaseRoutes.IncomingHooks.Handle("", api.ApiSessionRequired(getIncomingHooks)).Methods("GET")
  12. api.BaseRoutes.IncomingHook.Handle("", api.ApiSessionRequired(getIncomingHook)).Methods("GET")
  13. api.BaseRoutes.IncomingHook.Handle("", api.ApiSessionRequired(updateIncomingHook)).Methods("PUT")
  14. api.BaseRoutes.IncomingHook.Handle("", api.ApiSessionRequired(deleteIncomingHook)).Methods("DELETE")
  15. api.BaseRoutes.OutgoingHooks.Handle("", api.ApiSessionRequired(createOutgoingHook)).Methods("POST")
  16. api.BaseRoutes.OutgoingHooks.Handle("", api.ApiSessionRequired(getOutgoingHooks)).Methods("GET")
  17. api.BaseRoutes.OutgoingHook.Handle("", api.ApiSessionRequired(getOutgoingHook)).Methods("GET")
  18. api.BaseRoutes.OutgoingHook.Handle("", api.ApiSessionRequired(updateOutgoingHook)).Methods("PUT")
  19. api.BaseRoutes.OutgoingHook.Handle("", api.ApiSessionRequired(deleteOutgoingHook)).Methods("DELETE")
  20. api.BaseRoutes.OutgoingHook.Handle("/regen_token", api.ApiSessionRequired(regenOutgoingHookToken)).Methods("POST")
  21. }
  22. func createIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  23. hook := model.IncomingWebhookFromJson(r.Body)
  24. if hook == nil {
  25. c.SetInvalidParam("incoming_webhook")
  26. return
  27. }
  28. channel, err := c.App.GetChannel(hook.ChannelId)
  29. if err != nil {
  30. c.Err = err
  31. return
  32. }
  33. auditRec := c.MakeAuditRecord("createIncomingHook", audit.Fail)
  34. defer c.LogAuditRec(auditRec)
  35. auditRec.AddMeta("channel", channel)
  36. c.LogAudit("attempt")
  37. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), channel.TeamId, model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) {
  38. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  39. return
  40. }
  41. if channel.Type != model.CHANNEL_OPEN && !c.App.SessionHasPermissionToChannel(*c.App.Session(), channel.Id, model.PERMISSION_READ_CHANNEL) {
  42. c.LogAudit("fail - bad channel permissions")
  43. c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
  44. return
  45. }
  46. incomingHook, err := c.App.CreateIncomingWebhookForChannel(c.App.Session().UserId, channel, hook)
  47. if err != nil {
  48. c.Err = err
  49. return
  50. }
  51. auditRec.Success()
  52. auditRec.AddMeta("hook", incomingHook)
  53. c.LogAudit("success")
  54. w.WriteHeader(http.StatusCreated)
  55. w.Write([]byte(incomingHook.ToJson()))
  56. }
  57. func updateIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  58. c.RequireHookId()
  59. if c.Err != nil {
  60. return
  61. }
  62. updatedHook := model.IncomingWebhookFromJson(r.Body)
  63. if updatedHook == nil {
  64. c.SetInvalidParam("incoming_webhook")
  65. return
  66. }
  67. // The hook being updated in the payload must be the same one as indicated in the URL.
  68. if updatedHook.Id != c.Params.HookId {
  69. c.SetInvalidParam("hook_id")
  70. return
  71. }
  72. auditRec := c.MakeAuditRecord("updateIncomingHook", audit.Fail)
  73. defer c.LogAuditRec(auditRec)
  74. auditRec.AddMeta("hook_id", c.Params.HookId)
  75. c.LogAudit("attempt")
  76. oldHook, err := c.App.GetIncomingWebhook(c.Params.HookId)
  77. if err != nil {
  78. c.Err = err
  79. return
  80. }
  81. auditRec.AddMeta("team_id", oldHook.TeamId)
  82. if updatedHook.TeamId == "" {
  83. updatedHook.TeamId = oldHook.TeamId
  84. }
  85. if updatedHook.TeamId != oldHook.TeamId {
  86. c.Err = model.NewAppError("updateIncomingHook", "api.webhook.team_mismatch.app_error", nil, "user_id="+c.App.Session().UserId, http.StatusBadRequest)
  87. return
  88. }
  89. channel, err := c.App.GetChannel(updatedHook.ChannelId)
  90. if err != nil {
  91. c.Err = err
  92. return
  93. }
  94. auditRec.AddMeta("channel_id", channel.Id)
  95. auditRec.AddMeta("channel_name", channel.Name)
  96. if channel.TeamId != updatedHook.TeamId {
  97. c.SetInvalidParam("channel_id")
  98. return
  99. }
  100. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), channel.TeamId, model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) {
  101. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  102. return
  103. }
  104. if c.App.Session().UserId != oldHook.UserId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), channel.TeamId, model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS) {
  105. c.LogAudit("fail - inappropriate permissions")
  106. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS)
  107. return
  108. }
  109. if channel.Type != model.CHANNEL_OPEN && !c.App.SessionHasPermissionToChannel(*c.App.Session(), channel.Id, model.PERMISSION_READ_CHANNEL) {
  110. c.LogAudit("fail - bad channel permissions")
  111. c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
  112. return
  113. }
  114. incomingHook, err := c.App.UpdateIncomingWebhook(oldHook, updatedHook)
  115. if err != nil {
  116. c.Err = err
  117. return
  118. }
  119. auditRec.Success()
  120. c.LogAudit("success")
  121. w.WriteHeader(http.StatusCreated)
  122. w.Write([]byte(incomingHook.ToJson()))
  123. }
  124. func getIncomingHooks(c *Context, w http.ResponseWriter, r *http.Request) {
  125. teamId := r.URL.Query().Get("team_id")
  126. userId := c.App.Session().UserId
  127. var hooks []*model.IncomingWebhook
  128. var err *model.AppError
  129. if len(teamId) > 0 {
  130. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), teamId, model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) {
  131. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  132. return
  133. }
  134. // Remove userId as a filter if they have permission to manage others.
  135. if c.App.SessionHasPermissionToTeam(*c.App.Session(), teamId, model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS) {
  136. userId = ""
  137. }
  138. hooks, err = c.App.GetIncomingWebhooksForTeamPageByUser(teamId, userId, c.Params.Page, c.Params.PerPage)
  139. } else {
  140. if !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) {
  141. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  142. return
  143. }
  144. // Remove userId as a filter if they have permission to manage others.
  145. if c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS) {
  146. userId = ""
  147. }
  148. hooks, err = c.App.GetIncomingWebhooksPageByUser(userId, c.Params.Page, c.Params.PerPage)
  149. }
  150. if err != nil {
  151. c.Err = err
  152. return
  153. }
  154. w.Write([]byte(model.IncomingWebhookListToJson(hooks)))
  155. }
  156. func getIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  157. c.RequireHookId()
  158. if c.Err != nil {
  159. return
  160. }
  161. hookId := c.Params.HookId
  162. var err *model.AppError
  163. var hook *model.IncomingWebhook
  164. var channel *model.Channel
  165. hook, err = c.App.GetIncomingWebhook(hookId)
  166. if err != nil {
  167. c.Err = err
  168. return
  169. }
  170. auditRec := c.MakeAuditRecord("getIncomingHook", audit.Fail)
  171. defer c.LogAuditRec(auditRec)
  172. auditRec.AddMeta("hook_id", hook.Id)
  173. auditRec.AddMeta("hook_display", hook.DisplayName)
  174. auditRec.AddMeta("channel_id", hook.ChannelId)
  175. auditRec.AddMeta("team_id", hook.TeamId)
  176. c.LogAudit("attempt")
  177. channel, err = c.App.GetChannel(hook.ChannelId)
  178. if err != nil {
  179. c.Err = err
  180. return
  181. }
  182. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) ||
  183. (channel.Type != model.CHANNEL_OPEN && !c.App.SessionHasPermissionToChannel(*c.App.Session(), hook.ChannelId, model.PERMISSION_READ_CHANNEL)) {
  184. c.LogAudit("fail - bad permissions")
  185. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  186. return
  187. }
  188. if c.App.Session().UserId != hook.UserId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS) {
  189. c.LogAudit("fail - inappropriate permissions")
  190. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS)
  191. return
  192. }
  193. auditRec.Success()
  194. c.LogAudit("success")
  195. w.Write([]byte(hook.ToJson()))
  196. }
  197. func deleteIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  198. c.RequireHookId()
  199. if c.Err != nil {
  200. return
  201. }
  202. hookId := c.Params.HookId
  203. var err *model.AppError
  204. var hook *model.IncomingWebhook
  205. var channel *model.Channel
  206. hook, err = c.App.GetIncomingWebhook(hookId)
  207. if err != nil {
  208. c.Err = err
  209. return
  210. }
  211. channel, err = c.App.GetChannel(hook.ChannelId)
  212. if err != nil {
  213. c.Err = err
  214. return
  215. }
  216. auditRec := c.MakeAuditRecord("deleteIncomingHook", audit.Fail)
  217. defer c.LogAuditRec(auditRec)
  218. auditRec.AddMeta("hook_id", hook.Id)
  219. auditRec.AddMeta("hook_display", hook.DisplayName)
  220. auditRec.AddMeta("channel_id", channel.Id)
  221. auditRec.AddMeta("channel_name", channel.Name)
  222. auditRec.AddMeta("team_id", hook.TeamId)
  223. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_INCOMING_WEBHOOKS) ||
  224. (channel.Type != model.CHANNEL_OPEN && !c.App.SessionHasPermissionToChannel(*c.App.Session(), hook.ChannelId, model.PERMISSION_READ_CHANNEL)) {
  225. c.LogAudit("fail - bad permissions")
  226. c.SetPermissionError(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS)
  227. return
  228. }
  229. if c.App.Session().UserId != hook.UserId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS) {
  230. c.LogAudit("fail - inappropriate permissions")
  231. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_INCOMING_WEBHOOKS)
  232. return
  233. }
  234. if err = c.App.DeleteIncomingWebhook(hookId); err != nil {
  235. c.Err = err
  236. return
  237. }
  238. auditRec.Success()
  239. ReturnStatusOK(w)
  240. }
  241. func updateOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  242. c.RequireHookId()
  243. if c.Err != nil {
  244. return
  245. }
  246. updatedHook := model.OutgoingWebhookFromJson(r.Body)
  247. if updatedHook == nil {
  248. c.SetInvalidParam("outgoing_webhook")
  249. return
  250. }
  251. // The hook being updated in the payload must be the same one as indicated in the URL.
  252. if updatedHook.Id != c.Params.HookId {
  253. c.SetInvalidParam("hook_id")
  254. return
  255. }
  256. auditRec := c.MakeAuditRecord("updateOutgoingHook", audit.Fail)
  257. defer c.LogAuditRec(auditRec)
  258. auditRec.AddMeta("hook_id", updatedHook.Id)
  259. auditRec.AddMeta("hook_display", updatedHook.DisplayName)
  260. auditRec.AddMeta("channel_id", updatedHook.ChannelId)
  261. auditRec.AddMeta("team_id", updatedHook.TeamId)
  262. c.LogAudit("attempt")
  263. oldHook, err := c.App.GetOutgoingWebhook(c.Params.HookId)
  264. if err != nil {
  265. c.Err = err
  266. return
  267. }
  268. if updatedHook.TeamId == "" {
  269. updatedHook.TeamId = oldHook.TeamId
  270. }
  271. if updatedHook.TeamId != oldHook.TeamId {
  272. c.Err = model.NewAppError("updateOutgoingHook", "api.webhook.team_mismatch.app_error", nil, "user_id="+c.App.Session().UserId, http.StatusBadRequest)
  273. return
  274. }
  275. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), updatedHook.TeamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  276. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  277. return
  278. }
  279. if c.App.Session().UserId != oldHook.CreatorId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), updatedHook.TeamId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  280. c.LogAudit("fail - inappropriate permissions")
  281. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS)
  282. return
  283. }
  284. updatedHook.CreatorId = c.App.Session().UserId
  285. rhook, err := c.App.UpdateOutgoingWebhook(oldHook, updatedHook)
  286. if err != nil {
  287. c.Err = err
  288. return
  289. }
  290. auditRec.Success()
  291. c.LogAudit("success")
  292. w.Write([]byte(rhook.ToJson()))
  293. }
  294. func createOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  295. hook := model.OutgoingWebhookFromJson(r.Body)
  296. if hook == nil {
  297. c.SetInvalidParam("outgoing_webhook")
  298. return
  299. }
  300. auditRec := c.MakeAuditRecord("createOutgoingHook", audit.Fail)
  301. defer c.LogAuditRec(auditRec)
  302. auditRec.AddMeta("hook_id", hook.Id)
  303. c.LogAudit("attempt")
  304. hook.CreatorId = c.App.Session().UserId
  305. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  306. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  307. return
  308. }
  309. rhook, err := c.App.CreateOutgoingWebhook(hook)
  310. if err != nil {
  311. c.LogAudit("fail")
  312. c.Err = err
  313. return
  314. }
  315. auditRec.Success()
  316. auditRec.AddMeta("hook_display", rhook.DisplayName)
  317. auditRec.AddMeta("channel_id", rhook.ChannelId)
  318. auditRec.AddMeta("team_id", rhook.TeamId)
  319. c.LogAudit("success")
  320. w.WriteHeader(http.StatusCreated)
  321. w.Write([]byte(rhook.ToJson()))
  322. }
  323. func getOutgoingHooks(c *Context, w http.ResponseWriter, r *http.Request) {
  324. channelId := r.URL.Query().Get("channel_id")
  325. teamId := r.URL.Query().Get("team_id")
  326. userId := c.App.Session().UserId
  327. var hooks []*model.OutgoingWebhook
  328. var err *model.AppError
  329. if len(channelId) > 0 {
  330. if !c.App.SessionHasPermissionToChannel(*c.App.Session(), channelId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  331. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  332. return
  333. }
  334. // Remove userId as a filter if they have permission to manage others.
  335. if c.App.SessionHasPermissionToChannel(*c.App.Session(), channelId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  336. userId = ""
  337. }
  338. hooks, err = c.App.GetOutgoingWebhooksForChannelPageByUser(channelId, userId, c.Params.Page, c.Params.PerPage)
  339. } else if len(teamId) > 0 {
  340. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), teamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  341. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  342. return
  343. }
  344. // Remove userId as a filter if they have permission to manage others.
  345. if c.App.SessionHasPermissionToTeam(*c.App.Session(), teamId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  346. userId = ""
  347. }
  348. hooks, err = c.App.GetOutgoingWebhooksForTeamPageByUser(teamId, userId, c.Params.Page, c.Params.PerPage)
  349. } else {
  350. if !c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  351. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  352. return
  353. }
  354. // Remove userId as a filter if they have permission to manage others.
  355. if c.App.SessionHasPermissionTo(*c.App.Session(), model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  356. userId = ""
  357. }
  358. hooks, err = c.App.GetOutgoingWebhooksPageByUser(userId, c.Params.Page, c.Params.PerPage)
  359. }
  360. if err != nil {
  361. c.Err = err
  362. return
  363. }
  364. w.Write([]byte(model.OutgoingWebhookListToJson(hooks)))
  365. }
  366. func getOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  367. c.RequireHookId()
  368. if c.Err != nil {
  369. return
  370. }
  371. hook, err := c.App.GetOutgoingWebhook(c.Params.HookId)
  372. if err != nil {
  373. c.Err = err
  374. return
  375. }
  376. auditRec := c.MakeAuditRecord("getOutgoingHook", audit.Fail)
  377. defer c.LogAuditRec(auditRec)
  378. auditRec.AddMeta("hook_id", hook.Id)
  379. auditRec.AddMeta("hook_display", hook.DisplayName)
  380. auditRec.AddMeta("channel_id", hook.ChannelId)
  381. auditRec.AddMeta("team_id", hook.TeamId)
  382. c.LogAudit("attempt")
  383. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  384. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  385. return
  386. }
  387. if c.App.Session().UserId != hook.CreatorId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  388. c.LogAudit("fail - inappropriate permissions")
  389. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS)
  390. return
  391. }
  392. auditRec.Success()
  393. c.LogAudit("success")
  394. w.Write([]byte(hook.ToJson()))
  395. }
  396. func regenOutgoingHookToken(c *Context, w http.ResponseWriter, r *http.Request) {
  397. c.RequireHookId()
  398. if c.Err != nil {
  399. return
  400. }
  401. hook, err := c.App.GetOutgoingWebhook(c.Params.HookId)
  402. if err != nil {
  403. c.Err = err
  404. return
  405. }
  406. auditRec := c.MakeAuditRecord("regenOutgoingHookToken", audit.Fail)
  407. defer c.LogAuditRec(auditRec)
  408. auditRec.AddMeta("hook_id", hook.Id)
  409. auditRec.AddMeta("hook_display", hook.DisplayName)
  410. auditRec.AddMeta("channel_id", hook.ChannelId)
  411. auditRec.AddMeta("team_id", hook.TeamId)
  412. c.LogAudit("attempt")
  413. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  414. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  415. return
  416. }
  417. if c.App.Session().UserId != hook.CreatorId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  418. c.LogAudit("fail - inappropriate permissions")
  419. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS)
  420. return
  421. }
  422. rhook, err := c.App.RegenOutgoingWebhookToken(hook)
  423. if err != nil {
  424. c.Err = err
  425. return
  426. }
  427. auditRec.Success()
  428. c.LogAudit("success")
  429. w.Write([]byte(rhook.ToJson()))
  430. }
  431. func deleteOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) {
  432. c.RequireHookId()
  433. if c.Err != nil {
  434. return
  435. }
  436. hook, err := c.App.GetOutgoingWebhook(c.Params.HookId)
  437. if err != nil {
  438. c.Err = err
  439. return
  440. }
  441. auditRec := c.MakeAuditRecord("deleteOutgoingHook", audit.Fail)
  442. defer c.LogAuditRec(auditRec)
  443. auditRec.AddMeta("hook_id", hook.Id)
  444. auditRec.AddMeta("hook_display", hook.DisplayName)
  445. auditRec.AddMeta("channel_id", hook.ChannelId)
  446. auditRec.AddMeta("team_id", hook.TeamId)
  447. c.LogAudit("attempt")
  448. if !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS) {
  449. c.SetPermissionError(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS)
  450. return
  451. }
  452. if c.App.Session().UserId != hook.CreatorId && !c.App.SessionHasPermissionToTeam(*c.App.Session(), hook.TeamId, model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS) {
  453. c.LogAudit("fail - inappropriate permissions")
  454. c.SetPermissionError(model.PERMISSION_MANAGE_OTHERS_OUTGOING_WEBHOOKS)
  455. return
  456. }
  457. if err := c.App.DeleteOutgoingWebhook(hook.Id); err != nil {
  458. c.LogAudit("fail")
  459. c.Err = err
  460. return
  461. }
  462. auditRec.Success()
  463. c.LogAudit("success")
  464. ReturnStatusOK(w)
  465. }