ae7732194adde6fb8a2573332db3d3a5491a9cdd
[oweals/peertube.git] / server / helpers / custom-validators / activitypub / activity.ts
1 import * as validator from 'validator'
2 import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3 import { isAccountAcceptActivityValid, isAccountDeleteActivityValid, isAccountFollowActivityValid } from './actor'
4 import { isAnnounceActivityValid } from './announce'
5 import { isActivityPubUrlValid } from './misc'
6 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
7 import { isUndoActivityValid } from './undo'
8 import { isVideoChannelCreateActivityValid, isVideoChannelDeleteActivityValid, isVideoChannelUpdateActivityValid } from './video-channels'
9 import {
10   isVideoFlagValid,
11   isVideoTorrentAddActivityValid,
12   isVideoTorrentDeleteActivityValid,
13   isVideoTorrentUpdateActivityValid
14 } from './videos'
15 import { isViewActivityValid } from './view'
16
17 function isRootActivityValid (activity: any) {
18   return Array.isArray(activity['@context']) &&
19     (
20       (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
21       validator.isInt(activity.totalItems, { min: 0 }) &&
22       Array.isArray(activity.items)
23     ) ||
24     (
25       isActivityPubUrlValid(activity.id) &&
26       isActivityPubUrlValid(activity.actor)
27     )
28 }
29
30 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
31   Create: checkCreateActivity,
32   Add: checkAddActivity,
33   Update: checkUpdateActivity,
34   Delete: checkDeleteActivity,
35   Follow: checkFollowActivity,
36   Accept: checkAcceptActivity,
37   Announce: checkAnnounceActivity,
38   Undo: checkUndoActivity,
39   Like: checkLikeActivity
40 }
41
42 function isActivityValid (activity: any) {
43   const checker = activityCheckers[activity.type]
44   // Unknown activity type
45   if (!checker) return false
46
47   return checker(activity)
48 }
49
50 // ---------------------------------------------------------------------------
51
52 export {
53   isRootActivityValid,
54   isActivityValid
55 }
56
57 // ---------------------------------------------------------------------------
58
59 function checkCreateActivity (activity: any) {
60   return isViewActivityValid(activity) ||
61     isDislikeActivityValid(activity) ||
62     isVideoChannelCreateActivityValid(activity) ||
63     isVideoFlagValid(activity)
64 }
65
66 function checkAddActivity (activity: any) {
67   return isVideoTorrentAddActivityValid(activity)
68 }
69
70 function checkUpdateActivity (activity: any) {
71   return isVideoTorrentUpdateActivityValid(activity) ||
72     isVideoChannelUpdateActivityValid(activity)
73 }
74
75 function checkDeleteActivity (activity: any) {
76   return isVideoTorrentDeleteActivityValid(activity) ||
77     isVideoChannelDeleteActivityValid(activity) ||
78     isAccountDeleteActivityValid(activity)
79 }
80
81 function checkFollowActivity (activity: any) {
82   return isAccountFollowActivityValid(activity)
83 }
84
85 function checkAcceptActivity (activity: any) {
86   return isAccountAcceptActivityValid(activity)
87 }
88
89 function checkAnnounceActivity (activity: any) {
90   return isAnnounceActivityValid(activity)
91 }
92
93 function checkUndoActivity (activity: any) {
94   return isUndoActivityValid(activity)
95 }
96
97 function checkLikeActivity (activity: any) {
98   return isLikeActivityValid(activity)
99 }