abuse.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import * as express from 'express'
  2. import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared'
  3. import { logger } from '../../../helpers/logger'
  4. import { getFormattedObjects } from '../../../helpers/utils'
  5. import { sequelizeTypescript } from '../../../initializers/database'
  6. import {
  7. asyncMiddleware,
  8. asyncRetryTransactionMiddleware,
  9. authenticate,
  10. ensureUserHasRight,
  11. paginationValidator,
  12. setDefaultPagination,
  13. setDefaultSort,
  14. videoAbuseGetValidator,
  15. videoAbuseReportValidator,
  16. videoAbusesSortValidator,
  17. videoAbuseUpdateValidator,
  18. videoAbuseListValidator
  19. } from '../../../middlewares'
  20. import { AccountModel } from '../../../models/account/account'
  21. import { VideoAbuseModel } from '../../../models/video/video-abuse'
  22. import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger'
  23. import { Notifier } from '../../../lib/notifier'
  24. import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag'
  25. import { MVideoAbuseAccountVideo } from '../../../typings/models/video'
  26. import { getServerActor } from '@server/models/application/application'
  27. const auditLogger = auditLoggerFactory('abuse')
  28. const abuseVideoRouter = express.Router()
  29. abuseVideoRouter.get('/abuse',
  30. authenticate,
  31. ensureUserHasRight(UserRight.MANAGE_VIDEO_ABUSES),
  32. paginationValidator,
  33. videoAbusesSortValidator,
  34. setDefaultSort,
  35. setDefaultPagination,
  36. videoAbuseListValidator,
  37. asyncMiddleware(listVideoAbuses)
  38. )
  39. abuseVideoRouter.put('/:videoId/abuse/:id',
  40. authenticate,
  41. ensureUserHasRight(UserRight.MANAGE_VIDEO_ABUSES),
  42. asyncMiddleware(videoAbuseUpdateValidator),
  43. asyncRetryTransactionMiddleware(updateVideoAbuse)
  44. )
  45. abuseVideoRouter.post('/:videoId/abuse',
  46. authenticate,
  47. asyncMiddleware(videoAbuseReportValidator),
  48. asyncRetryTransactionMiddleware(reportVideoAbuse)
  49. )
  50. abuseVideoRouter.delete('/:videoId/abuse/:id',
  51. authenticate,
  52. ensureUserHasRight(UserRight.MANAGE_VIDEO_ABUSES),
  53. asyncMiddleware(videoAbuseGetValidator),
  54. asyncRetryTransactionMiddleware(deleteVideoAbuse)
  55. )
  56. // ---------------------------------------------------------------------------
  57. export {
  58. abuseVideoRouter
  59. }
  60. // ---------------------------------------------------------------------------
  61. async function listVideoAbuses (req: express.Request, res: express.Response) {
  62. const user = res.locals.oauth.token.user
  63. const serverActor = await getServerActor()
  64. const resultList = await VideoAbuseModel.listForApi({
  65. start: req.query.start,
  66. count: req.query.count,
  67. sort: req.query.sort,
  68. id: req.query.id,
  69. search: req.query.search,
  70. state: req.query.state,
  71. videoIs: req.query.videoIs,
  72. searchReporter: req.query.searchReporter,
  73. searchReportee: req.query.searchReportee,
  74. searchVideo: req.query.searchVideo,
  75. searchVideoChannel: req.query.searchVideoChannel,
  76. serverAccountId: serverActor.Account.id,
  77. user
  78. })
  79. return res.json(getFormattedObjects(resultList.data, resultList.total))
  80. }
  81. async function updateVideoAbuse (req: express.Request, res: express.Response) {
  82. const videoAbuse = res.locals.videoAbuse
  83. if (req.body.moderationComment !== undefined) videoAbuse.moderationComment = req.body.moderationComment
  84. if (req.body.state !== undefined) videoAbuse.state = req.body.state
  85. await sequelizeTypescript.transaction(t => {
  86. return videoAbuse.save({ transaction: t })
  87. })
  88. // Do not send the delete to other instances, we updated OUR copy of this video abuse
  89. return res.type('json').status(204).end()
  90. }
  91. async function deleteVideoAbuse (req: express.Request, res: express.Response) {
  92. const videoAbuse = res.locals.videoAbuse
  93. await sequelizeTypescript.transaction(t => {
  94. return videoAbuse.destroy({ transaction: t })
  95. })
  96. // Do not send the delete to other instances, we delete OUR copy of this video abuse
  97. return res.type('json').status(204).end()
  98. }
  99. async function reportVideoAbuse (req: express.Request, res: express.Response) {
  100. const videoInstance = res.locals.videoAll
  101. const body: VideoAbuseCreate = req.body
  102. const videoAbuse = await sequelizeTypescript.transaction(async t => {
  103. const reporterAccount = await AccountModel.load(res.locals.oauth.token.User.Account.id, t)
  104. const abuseToCreate = {
  105. reporterAccountId: reporterAccount.id,
  106. reason: body.reason,
  107. videoId: videoInstance.id,
  108. state: VideoAbuseState.PENDING
  109. }
  110. const videoAbuseInstance: MVideoAbuseAccountVideo = await VideoAbuseModel.create(abuseToCreate, { transaction: t })
  111. videoAbuseInstance.Video = videoInstance
  112. videoAbuseInstance.Account = reporterAccount
  113. // We send the video abuse to the origin server
  114. if (videoInstance.isOwned() === false) {
  115. await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance, t)
  116. }
  117. auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON()))
  118. return videoAbuseInstance
  119. })
  120. Notifier.Instance.notifyOnNewVideoAbuse(videoAbuse)
  121. logger.info('Abuse report for video %s created.', videoInstance.name)
  122. return res.json({ videoAbuse: videoAbuse.toFormattedJSON() }).end()
  123. }