1 import * as validator from 'validator'
2 import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3 import { sanitizeAndCheckActorObject } from './actor'
4 import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
5 import { isDislikeActivityValid } from './rate'
6 import { sanitizeAndCheckVideoCommentObject } from './video-comments'
7 import { sanitizeAndCheckVideoTorrentObject } from './videos'
8 import { isViewActivityValid } from './view'
9 import { exists } from '../misc'
10 import { isCacheFileObjectValid } from './cache-file'
11 import { isFlagActivityValid } from './flag'
12 import { isPlaylistObjectValid } from './playlist'
14 function isRootActivityValid (activity: any) {
15 return Array.isArray(activity['@context']) && (
17 (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
18 validator.isInt(activity.totalItems, { min: 0 }) &&
19 Array.isArray(activity.items)
22 isActivityPubUrlValid(activity.id) &&
23 exists(activity.actor) &&
24 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
29 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
30 Create: checkCreateActivity,
31 Update: checkUpdateActivity,
32 Delete: checkDeleteActivity,
33 Follow: checkFollowActivity,
34 Accept: checkAcceptActivity,
35 Reject: checkRejectActivity,
36 Announce: checkAnnounceActivity,
37 Undo: checkUndoActivity,
38 Like: checkLikeActivity,
39 View: checkViewActivity,
40 Flag: checkFlagActivity,
41 Dislike: checkDislikeActivity
44 function isActivityValid (activity: any) {
45 const checker = activityCheckers[activity.type]
46 // Unknown activity type
47 if (!checker) return false
49 return checker(activity)
52 // ---------------------------------------------------------------------------
59 // ---------------------------------------------------------------------------
61 function checkViewActivity (activity: any) {
62 return isBaseActivityValid(activity, 'View') &&
63 isViewActivityValid(activity)
66 function checkFlagActivity (activity: any) {
67 return isBaseActivityValid(activity, 'Flag') &&
68 isFlagActivityValid(activity)
71 function checkDislikeActivity (activity: any) {
72 return isBaseActivityValid(activity, 'Dislike') &&
73 isDislikeActivityValid(activity)
76 function checkCreateActivity (activity: any) {
77 return isBaseActivityValid(activity, 'Create') &&
79 isViewActivityValid(activity.object) ||
80 isDislikeActivityValid(activity.object) ||
81 isFlagActivityValid(activity.object) ||
82 isPlaylistObjectValid(activity.object) ||
84 isCacheFileObjectValid(activity.object) ||
85 sanitizeAndCheckVideoCommentObject(activity.object) ||
86 sanitizeAndCheckVideoTorrentObject(activity.object)
90 function checkUpdateActivity (activity: any) {
91 return isBaseActivityValid(activity, 'Update') &&
93 isCacheFileObjectValid(activity.object) ||
94 isPlaylistObjectValid(activity.object) ||
95 sanitizeAndCheckVideoTorrentObject(activity.object) ||
96 sanitizeAndCheckActorObject(activity.object)
100 function checkDeleteActivity (activity: any) {
101 // We don't really check objects
102 return isBaseActivityValid(activity, 'Delete') &&
103 isObjectValid(activity.object)
106 function checkFollowActivity (activity: any) {
107 return isBaseActivityValid(activity, 'Follow') &&
108 isObjectValid(activity.object)
111 function checkAcceptActivity (activity: any) {
112 return isBaseActivityValid(activity, 'Accept')
115 function checkRejectActivity (activity: any) {
116 return isBaseActivityValid(activity, 'Reject')
119 function checkAnnounceActivity (activity: any) {
120 return isBaseActivityValid(activity, 'Announce') &&
121 isObjectValid(activity.object)
124 function checkUndoActivity (activity: any) {
125 return isBaseActivityValid(activity, 'Undo') &&
127 checkFollowActivity(activity.object) ||
128 checkLikeActivity(activity.object) ||
129 checkDislikeActivity(activity.object) ||
130 checkAnnounceActivity(activity.object) ||
131 checkCreateActivity(activity.object)
135 function checkLikeActivity (activity: any) {
136 return isBaseActivityValid(activity, 'Like') &&
137 isObjectValid(activity.object)