blocklist.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import express from 'express'
  2. import { handleToNameAndHost } from '@server/helpers/actors.js'
  3. import { logger } from '@server/helpers/logger.js'
  4. import { AccountBlocklistModel } from '@server/models/account/account-blocklist.js'
  5. import { getServerActor } from '@server/models/application/application.js'
  6. import { ServerBlocklistModel } from '@server/models/server/server-blocklist.js'
  7. import { MActorAccountId, MUserAccountId } from '@server/types/models/index.js'
  8. import { BlockStatus } from '@peertube/peertube-models'
  9. import { apiRateLimiter, asyncMiddleware, blocklistStatusValidator, optionalAuthenticate } from '../../middlewares/index.js'
  10. const blocklistRouter = express.Router()
  11. blocklistRouter.use(apiRateLimiter)
  12. blocklistRouter.get('/status',
  13. optionalAuthenticate,
  14. blocklistStatusValidator,
  15. asyncMiddleware(getBlocklistStatus)
  16. )
  17. // ---------------------------------------------------------------------------
  18. export {
  19. blocklistRouter
  20. }
  21. // ---------------------------------------------------------------------------
  22. async function getBlocklistStatus (req: express.Request, res: express.Response) {
  23. const hosts = req.query.hosts as string[]
  24. const accounts = req.query.accounts as string[]
  25. const user = res.locals.oauth?.token.User
  26. const serverActor = await getServerActor()
  27. const byAccountIds = [ serverActor.Account.id ]
  28. if (user) byAccountIds.push(user.Account.id)
  29. const status: BlockStatus = {
  30. accounts: {},
  31. hosts: {}
  32. }
  33. const baseOptions = {
  34. byAccountIds,
  35. user,
  36. serverActor,
  37. status
  38. }
  39. await Promise.all([
  40. populateServerBlocklistStatus({ ...baseOptions, hosts }),
  41. populateAccountBlocklistStatus({ ...baseOptions, accounts })
  42. ])
  43. return res.json(status)
  44. }
  45. async function populateServerBlocklistStatus (options: {
  46. byAccountIds: number[]
  47. user?: MUserAccountId
  48. serverActor: MActorAccountId
  49. hosts: string[]
  50. status: BlockStatus
  51. }) {
  52. const { byAccountIds, user, serverActor, hosts, status } = options
  53. if (!hosts || hosts.length === 0) return
  54. const serverBlocklistStatus = await ServerBlocklistModel.getBlockStatus(byAccountIds, hosts)
  55. logger.debug('Got server blocklist status.', { serverBlocklistStatus, byAccountIds, hosts })
  56. for (const host of hosts) {
  57. const block = serverBlocklistStatus.find(b => b.host === host)
  58. status.hosts[host] = getStatus(block, serverActor, user)
  59. }
  60. }
  61. async function populateAccountBlocklistStatus (options: {
  62. byAccountIds: number[]
  63. user?: MUserAccountId
  64. serverActor: MActorAccountId
  65. accounts: string[]
  66. status: BlockStatus
  67. }) {
  68. const { byAccountIds, user, serverActor, accounts, status } = options
  69. if (!accounts || accounts.length === 0) return
  70. const accountBlocklistStatus = await AccountBlocklistModel.getBlockStatus(byAccountIds, accounts)
  71. logger.debug('Got account blocklist status.', { accountBlocklistStatus, byAccountIds, accounts })
  72. for (const account of accounts) {
  73. const sanitizedHandle = handleToNameAndHost(account)
  74. const block = accountBlocklistStatus.find(b => b.name === sanitizedHandle.name && b.host === sanitizedHandle.host)
  75. status.accounts[sanitizedHandle.handle] = getStatus(block, serverActor, user)
  76. }
  77. }
  78. function getStatus (block: { accountId: number }, serverActor: MActorAccountId, user?: MUserAccountId) {
  79. return {
  80. blockedByServer: !!(block && block.accountId === serverActor.Account.id),
  81. blockedByUser: !!(block && user && block.accountId === user.Account.id)
  82. }
  83. }