Add MANAGE_PEERTUBE_FOLLOW right
[oweals/peertube.git] / server / controllers / activitypub / inbox.ts
1 import * as express from 'express'
2 import { Activity, ActivityPubCollection, ActivityPubOrderedCollection, ActivityType, RootActivity } from '../../../shared'
3 import { logger } from '../../helpers'
4 import { isActivityValid } from '../../helpers/custom-validators/activitypub/activity'
5 import { processCreateActivity, processFlagActivity, processUpdateActivity } from '../../lib'
6 import { processAcceptActivity } from '../../lib/activitypub/process-accept'
7 import { processAddActivity } from '../../lib/activitypub/process-add'
8 import { processDeleteActivity } from '../../lib/activitypub/process-delete'
9 import { processFollowActivity } from '../../lib/activitypub/process-follow'
10 import { asyncMiddleware, checkSignature, localAccountValidator, signatureValidator } from '../../middlewares'
11 import { activityPubValidator } from '../../middlewares/validators/activitypub/activity'
12 import { AccountInstance } from '../../models/account/account-interface'
13
14 const processActivity: { [ P in ActivityType ]: (activity: Activity, inboxAccount?: AccountInstance) => Promise<any> } = {
15   Create: processCreateActivity,
16   Add: processAddActivity,
17   Update: processUpdateActivity,
18   Flag: processFlagActivity,
19   Delete: processDeleteActivity,
20   Follow: processFollowActivity,
21   Accept: processAcceptActivity
22 }
23
24 const inboxRouter = express.Router()
25
26 inboxRouter.post('/inbox',
27   signatureValidator,
28   asyncMiddleware(checkSignature),
29   activityPubValidator,
30   asyncMiddleware(inboxController)
31 )
32
33 inboxRouter.post('/:nameWithHost/inbox',
34   signatureValidator,
35   asyncMiddleware(checkSignature),
36   localAccountValidator,
37   activityPubValidator,
38   asyncMiddleware(inboxController)
39 )
40
41 // ---------------------------------------------------------------------------
42
43 export {
44   inboxRouter
45 }
46
47 // ---------------------------------------------------------------------------
48
49 async function inboxController (req: express.Request, res: express.Response, next: express.NextFunction) {
50   const rootActivity: RootActivity = req.body
51   let activities: Activity[] = []
52
53   if ([ 'Collection', 'CollectionPage' ].indexOf(rootActivity.type) !== -1) {
54     activities = (rootActivity as ActivityPubCollection).items
55   } else if ([ 'OrderedCollection', 'OrderedCollectionPage' ].indexOf(rootActivity.type) !== -1) {
56     activities = (rootActivity as ActivityPubOrderedCollection).orderedItems
57   } else {
58     activities = [ rootActivity as Activity ]
59   }
60
61   // Only keep activities we are able to process
62   activities = activities.filter(a => isActivityValid(a))
63
64   await processActivities(activities, res.locals.account)
65
66   res.status(204).end()
67 }
68
69 async function processActivities (activities: Activity[], inboxAccount?: AccountInstance) {
70   for (const activity of activities) {
71     const activityProcessor = processActivity[activity.type]
72     if (activityProcessor === undefined) {
73       logger.warn('Unknown activity type %s.', activity.type, { activityId: activity.id })
74       continue
75     }
76
77     await activityProcessor(activity, inboxAccount)
78   }
79 }