inbox.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import express from 'express'
  2. import { InboxManager } from '@server/lib/activitypub/inbox-manager'
  3. import { Activity, ActivityPubCollection, ActivityPubOrderedCollection, RootActivity } from '../../../shared'
  4. import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
  5. import { isActivityValid } from '../../helpers/custom-validators/activitypub/activity'
  6. import { logger } from '../../helpers/logger'
  7. import { asyncMiddleware, checkSignature, localAccountValidator, localVideoChannelValidator, signatureValidator } from '../../middlewares'
  8. import { activityPubValidator } from '../../middlewares/validators/activitypub/activity'
  9. const inboxRouter = express.Router()
  10. inboxRouter.post('/inbox',
  11. signatureValidator,
  12. asyncMiddleware(checkSignature),
  13. asyncMiddleware(activityPubValidator),
  14. inboxController
  15. )
  16. inboxRouter.post('/accounts/:name/inbox',
  17. signatureValidator,
  18. asyncMiddleware(checkSignature),
  19. asyncMiddleware(localAccountValidator),
  20. asyncMiddleware(activityPubValidator),
  21. inboxController
  22. )
  23. inboxRouter.post('/video-channels/:name/inbox',
  24. signatureValidator,
  25. asyncMiddleware(checkSignature),
  26. asyncMiddleware(localVideoChannelValidator),
  27. asyncMiddleware(activityPubValidator),
  28. inboxController
  29. )
  30. // ---------------------------------------------------------------------------
  31. export {
  32. inboxRouter
  33. }
  34. // ---------------------------------------------------------------------------
  35. function inboxController (req: express.Request, res: express.Response) {
  36. const rootActivity: RootActivity = req.body
  37. let activities: Activity[]
  38. if ([ 'Collection', 'CollectionPage' ].includes(rootActivity.type)) {
  39. activities = (rootActivity as ActivityPubCollection).items
  40. } else if ([ 'OrderedCollection', 'OrderedCollectionPage' ].includes(rootActivity.type)) {
  41. activities = (rootActivity as ActivityPubOrderedCollection<Activity>).orderedItems
  42. } else {
  43. activities = [ rootActivity as Activity ]
  44. }
  45. // Only keep activities we are able to process
  46. logger.debug('Filtering %d activities...', activities.length)
  47. activities = activities.filter(a => isActivityValid(a))
  48. logger.debug('We keep %d activities.', activities.length, { activities })
  49. const accountOrChannel = res.locals.account || res.locals.videoChannel
  50. logger.info('Receiving inbox requests for %d activities by %s.', activities.length, res.locals.signature.actor.url)
  51. InboxManager.Instance.addInboxMessage({
  52. activities,
  53. signatureActor: res.locals.signature.actor,
  54. inboxActor: accountOrChannel
  55. ? accountOrChannel.Actor
  56. : undefined
  57. })
  58. return res.status(HttpStatusCode.NO_CONTENT_204).end()
  59. }