blocklist.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { body, param } from 'express-validator'
  2. import * as express from 'express'
  3. import { logger } from '../../helpers/logger'
  4. import { areValidationErrors } from './utils'
  5. import { AccountBlocklistModel } from '../../models/account/account-blocklist'
  6. import { isHostValid } from '../../helpers/custom-validators/servers'
  7. import { ServerBlocklistModel } from '../../models/server/server-blocklist'
  8. import { ServerModel } from '../../models/server/server'
  9. import { WEBSERVER } from '../../initializers/constants'
  10. import { doesAccountNameWithHostExist } from '../../helpers/middlewares'
  11. import { getServerActor } from '@server/models/application/application'
  12. import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
  13. const blockAccountValidator = [
  14. body('accountName').exists().withMessage('Should have an account name with host'),
  15. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  16. logger.debug('Checking blockAccountByAccountValidator parameters', { parameters: req.body })
  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.status(HttpStatusCode.CONFLICT_409)
  23. .json({ error: 'You cannot block yourself.' })
  24. return
  25. }
  26. return next()
  27. }
  28. ]
  29. const unblockAccountByAccountValidator = [
  30. param('accountName').exists().withMessage('Should have an account name with host'),
  31. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  32. logger.debug('Checking unblockAccountByAccountValidator parameters', { parameters: req.params })
  33. if (areValidationErrors(req, res)) return
  34. if (!await doesAccountNameWithHostExist(req.params.accountName, res)) return
  35. const user = res.locals.oauth.token.User
  36. const targetAccount = res.locals.account
  37. if (!await doesUnblockAccountExist(user.Account.id, targetAccount.id, res)) return
  38. return next()
  39. }
  40. ]
  41. const unblockAccountByServerValidator = [
  42. param('accountName').exists().withMessage('Should have an account name with host'),
  43. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  44. logger.debug('Checking unblockAccountByServerValidator parameters', { parameters: req.params })
  45. if (areValidationErrors(req, res)) return
  46. if (!await doesAccountNameWithHostExist(req.params.accountName, res)) return
  47. const serverActor = await getServerActor()
  48. const targetAccount = res.locals.account
  49. if (!await doesUnblockAccountExist(serverActor.Account.id, targetAccount.id, res)) return
  50. return next()
  51. }
  52. ]
  53. const blockServerValidator = [
  54. body('host').custom(isHostValid).withMessage('Should have a valid host'),
  55. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  56. logger.debug('Checking serverGetValidator parameters', { parameters: req.body })
  57. if (areValidationErrors(req, res)) return
  58. const host: string = req.body.host
  59. if (host === WEBSERVER.HOST) {
  60. return res.status(HttpStatusCode.CONFLICT_409)
  61. .json({ error: 'You cannot block your own server.' })
  62. }
  63. const server = await ServerModel.loadOrCreateByHost(host)
  64. res.locals.server = server
  65. return next()
  66. }
  67. ]
  68. const unblockServerByAccountValidator = [
  69. param('host').custom(isHostValid).withMessage('Should have an account name with host'),
  70. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  71. logger.debug('Checking unblockServerByAccountValidator parameters', { parameters: req.params })
  72. if (areValidationErrors(req, res)) return
  73. const user = res.locals.oauth.token.User
  74. if (!await doesUnblockServerExist(user.Account.id, req.params.host, res)) return
  75. return next()
  76. }
  77. ]
  78. const unblockServerByServerValidator = [
  79. param('host').custom(isHostValid).withMessage('Should have an account name with host'),
  80. async (req: express.Request, res: express.Response, next: express.NextFunction) => {
  81. logger.debug('Checking unblockServerByServerValidator parameters', { parameters: req.params })
  82. if (areValidationErrors(req, res)) return
  83. const serverActor = await getServerActor()
  84. if (!await doesUnblockServerExist(serverActor.Account.id, req.params.host, res)) return
  85. return next()
  86. }
  87. ]
  88. // ---------------------------------------------------------------------------
  89. export {
  90. blockServerValidator,
  91. blockAccountValidator,
  92. unblockAccountByAccountValidator,
  93. unblockServerByAccountValidator,
  94. unblockAccountByServerValidator,
  95. unblockServerByServerValidator
  96. }
  97. // ---------------------------------------------------------------------------
  98. async function doesUnblockAccountExist (accountId: number, targetAccountId: number, res: express.Response) {
  99. const accountBlock = await AccountBlocklistModel.loadByAccountAndTarget(accountId, targetAccountId)
  100. if (!accountBlock) {
  101. res.status(HttpStatusCode.NOT_FOUND_404)
  102. .json({ error: 'Account block entry not found.' })
  103. return false
  104. }
  105. res.locals.accountBlock = accountBlock
  106. return true
  107. }
  108. async function doesUnblockServerExist (accountId: number, host: string, res: express.Response) {
  109. const serverBlock = await ServerBlocklistModel.loadByAccountAndHost(accountId, host)
  110. if (!serverBlock) {
  111. res.status(HttpStatusCode.NOT_FOUND_404)
  112. .json({ error: 'Server block entry not found.' })
  113. return false
  114. }
  115. res.locals.serverBlock = serverBlock
  116. return true
  117. }