blocklist.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import express from 'express'
  2. import { body, param, query } from 'express-validator'
  3. import { areValidActorHandles } from '@server/helpers/custom-validators/activitypub/actor'
  4. import { getServerActor } from '@server/models/application/application'
  5. import { arrayify } from '@shared/core-utils'
  6. import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
  7. import { isEachUniqueHostValid, isHostValid } from '../../helpers/custom-validators/servers'
  8. import { WEBSERVER } from '../../initializers/constants'
  9. import { AccountBlocklistModel } from '../../models/account/account-blocklist'
  10. import { ServerModel } from '../../models/server/server'
  11. import { ServerBlocklistModel } from '../../models/server/server-blocklist'
  12. import { areValidationErrors, doesAccountNameWithHostExist } from './shared'
  13. const blockAccountValidator = [
  14. body('accountName')
  15. .exists(),
  16. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  17. if (areValidationErrors(req, res)) return
  18. if (!await doesAccountNameWithHostExist(req.body.accountName, res)) return
  19. const user = res.locals.oauth.token.User
  20. const accountToBlock = res.locals.account
  21. if (user.Account.id === accountToBlock.id) {
  22. res.fail({
  23. status: HttpStatusCode.CONFLICT_409,
  24. message: 'You cannot block yourself.'
  25. })
  26. return
  27. }
  28. return next()
  29. }
  30. ]
  31. const unblockAccountByAccountValidator = [
  32. param('accountName')
  33. .exists(),
  34. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  35. if (areValidationErrors(req, res)) return
  36. if (!await doesAccountNameWithHostExist(req.params.accountName, res)) return
  37. const user = res.locals.oauth.token.User
  38. const targetAccount = res.locals.account
  39. if (!await doesUnblockAccountExist(user.Account.id, targetAccount.id, res)) return
  40. return next()
  41. }
  42. ]
  43. const unblockAccountByServerValidator = [
  44. param('accountName')
  45. .exists(),
  46. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  47. if (areValidationErrors(req, res)) return
  48. if (!await doesAccountNameWithHostExist(req.params.accountName, res)) return
  49. const serverActor = await getServerActor()
  50. const targetAccount = res.locals.account
  51. if (!await doesUnblockAccountExist(serverActor.Account.id, targetAccount.id, res)) return
  52. return next()
  53. }
  54. ]
  55. const blockServerValidator = [
  56. body('host')
  57. .custom(isHostValid),
  58. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  59. if (areValidationErrors(req, res)) return
  60. const host: string = req.body.host
  61. if (host === WEBSERVER.HOST) {
  62. return res.fail({
  63. status: HttpStatusCode.CONFLICT_409,
  64. message: 'You cannot block your own server.'
  65. })
  66. }
  67. const server = await ServerModel.loadOrCreateByHost(host)
  68. res.locals.server = server
  69. return next()
  70. }
  71. ]
  72. const unblockServerByAccountValidator = [
  73. param('host')
  74. .custom(isHostValid),
  75. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  76. if (areValidationErrors(req, res)) return
  77. const user = res.locals.oauth.token.User
  78. if (!await doesUnblockServerExist(user.Account.id, req.params.host, res)) return
  79. return next()
  80. }
  81. ]
  82. const unblockServerByServerValidator = [
  83. param('host')
  84. .custom(isHostValid),
  85. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  86. if (areValidationErrors(req, res)) return
  87. const serverActor = await getServerActor()
  88. if (!await doesUnblockServerExist(serverActor.Account.id, req.params.host, res)) return
  89. return next()
  90. }
  91. ]
  92. const blocklistStatusValidator = [
  93. query('hosts')
  94. .optional()
  95. .customSanitizer(arrayify)
  96. .custom(isEachUniqueHostValid).withMessage('Should have a valid hosts array'),
  97. query('accounts')
  98. .optional()
  99. .customSanitizer(arrayify)
  100. .custom(areValidActorHandles).withMessage('Should have a valid accounts array'),
  101. (req: express.Request, res: express.Response, next: express.NextFunction) => {
  102. if (areValidationErrors(req, res)) return
  103. return next()
  104. }
  105. ]
  106. // ---------------------------------------------------------------------------
  107. export {
  108. blockServerValidator,
  109. blockAccountValidator,
  110. unblockAccountByAccountValidator,
  111. unblockServerByAccountValidator,
  112. unblockAccountByServerValidator,
  113. unblockServerByServerValidator,
  114. blocklistStatusValidator
  115. }
  116. // ---------------------------------------------------------------------------
  117. async function doesUnblockAccountExist (accountId: number, targetAccountId: number, res: express.Response) {
  118. const accountBlock = await AccountBlocklistModel.loadByAccountAndTarget(accountId, targetAccountId)
  119. if (!accountBlock) {
  120. res.fail({
  121. status: HttpStatusCode.NOT_FOUND_404,
  122. message: 'Account block entry not found.'
  123. })
  124. return false
  125. }
  126. res.locals.accountBlock = accountBlock
  127. return true
  128. }
  129. async function doesUnblockServerExist (accountId: number, host: string, res: express.Response) {
  130. const serverBlock = await ServerBlocklistModel.loadByAccountAndHost(accountId, host)
  131. if (!serverBlock) {
  132. res.fail({
  133. status: HttpStatusCode.NOT_FOUND_404,
  134. message: 'Server block entry not found.'
  135. })
  136. return false
  137. }
  138. res.locals.serverBlock = serverBlock
  139. return true
  140. }