Merge branch 'release/v1.0.0' into develop
[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 {
4   isActorAcceptActivityValid,
5   isActorDeleteActivityValid,
6   isActorFollowActivityValid,
7   isActorRejectActivityValid,
8   isActorUpdateActivityValid
9 } from './actor'
10 import { isAnnounceActivityValid } from './announce'
11 import { isActivityPubUrlValid } from './misc'
12 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
13 import { isUndoActivityValid } from './undo'
14 import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
15 import {
16   isVideoFlagValid,
17   isVideoTorrentDeleteActivityValid,
18   sanitizeAndCheckVideoTorrentCreateActivity,
19   sanitizeAndCheckVideoTorrentUpdateActivity
20 } from './videos'
21 import { isViewActivityValid } from './view'
22 import { exists } from '../misc'
23 import { isCacheFileCreateActivityValid, isCacheFileUpdateActivityValid } from './cache-file'
24
25 function isRootActivityValid (activity: any) {
26   return Array.isArray(activity['@context']) && (
27     (
28       (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
29       validator.isInt(activity.totalItems, { min: 0 }) &&
30       Array.isArray(activity.items)
31     ) ||
32     (
33       isActivityPubUrlValid(activity.id) &&
34       exists(activity.actor) &&
35       (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
36     )
37   )
38 }
39
40 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
41   Create: checkCreateActivity,
42   Update: checkUpdateActivity,
43   Delete: checkDeleteActivity,
44   Follow: checkFollowActivity,
45   Accept: checkAcceptActivity,
46   Reject: checkRejectActivity,
47   Announce: checkAnnounceActivity,
48   Undo: checkUndoActivity,
49   Like: checkLikeActivity
50 }
51
52 function isActivityValid (activity: any) {
53   const checker = activityCheckers[activity.type]
54   // Unknown activity type
55   if (!checker) return false
56
57   return checker(activity)
58 }
59
60 // ---------------------------------------------------------------------------
61
62 export {
63   isRootActivityValid,
64   isActivityValid
65 }
66
67 // ---------------------------------------------------------------------------
68
69 function checkCreateActivity (activity: any) {
70   return isViewActivityValid(activity) ||
71     isDislikeActivityValid(activity) ||
72     sanitizeAndCheckVideoTorrentCreateActivity(activity) ||
73     isVideoFlagValid(activity) ||
74     isVideoCommentCreateActivityValid(activity) ||
75     isCacheFileCreateActivityValid(activity)
76 }
77
78 function checkUpdateActivity (activity: any) {
79   return isCacheFileUpdateActivityValid(activity) ||
80     sanitizeAndCheckVideoTorrentUpdateActivity(activity) ||
81     isActorUpdateActivityValid(activity)
82 }
83
84 function checkDeleteActivity (activity: any) {
85   return isVideoTorrentDeleteActivityValid(activity) ||
86     isActorDeleteActivityValid(activity) ||
87     isVideoCommentDeleteActivityValid(activity)
88 }
89
90 function checkFollowActivity (activity: any) {
91   return isActorFollowActivityValid(activity)
92 }
93
94 function checkAcceptActivity (activity: any) {
95   return isActorAcceptActivityValid(activity)
96 }
97
98 function checkRejectActivity (activity: any) {
99   return isActorRejectActivityValid(activity)
100 }
101
102 function checkAnnounceActivity (activity: any) {
103   return isAnnounceActivityValid(activity)
104 }
105
106 function checkUndoActivity (activity: any) {
107   return isUndoActivityValid(activity)
108 }
109
110 function checkLikeActivity (activity: any) {
111   return isLikeActivityValid(activity)
112 }