1 import validator from 'validator'
2 import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3 import { exists } from '../misc'
4 import { sanitizeAndCheckActorObject } from './actor'
5 import { isCacheFileObjectValid } from './cache-file'
6 import { isFlagActivityValid } from './flag'
7 import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
8 import { isPlaylistObjectValid } from './playlist'
9 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
10 import { isShareActivityValid } from './share'
11 import { sanitizeAndCheckVideoCommentObject } from './video-comments'
12 import { sanitizeAndCheckVideoTorrentObject } from './videos'
13 import { isViewActivityValid } from './view'
15 function isRootActivityValid (activity: any) {
16 return isCollection(activity) || isActivity(activity)
19 function isCollection (activity: any) {
20 return (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
21 validator.isInt(activity.totalItems, { min: 0 }) &&
22 Array.isArray(activity.items)
25 function isActivity (activity: any) {
26 return isActivityPubUrlValid(activity.id) &&
27 exists(activity.actor) &&
28 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
31 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
32 Create: checkCreateActivity,
33 Update: checkUpdateActivity,
34 Delete: checkDeleteActivity,
35 Follow: checkFollowActivity,
36 Accept: checkAcceptActivity,
37 Reject: checkRejectActivity,
38 Announce: checkAnnounceActivity,
39 Undo: checkUndoActivity,
40 Like: checkLikeActivity,
41 View: checkViewActivity,
42 Flag: checkFlagActivity,
43 Dislike: checkDislikeActivity
46 function isActivityValid (activity: any) {
47 const checker = activityCheckers[activity.type]
48 // Unknown activity type
49 if (!checker) return false
51 return checker(activity)
54 // ---------------------------------------------------------------------------
61 // ---------------------------------------------------------------------------
63 function checkViewActivity (activity: any) {
64 return isBaseActivityValid(activity, 'View') &&
65 isViewActivityValid(activity)
68 function checkFlagActivity (activity: any) {
69 return isBaseActivityValid(activity, 'Flag') &&
70 isFlagActivityValid(activity)
73 function checkDislikeActivity (activity: any) {
74 return isDislikeActivityValid(activity)
77 function checkLikeActivity (activity: any) {
78 return isLikeActivityValid(activity)
81 function checkCreateActivity (activity: any) {
82 return isBaseActivityValid(activity, 'Create') &&
84 isViewActivityValid(activity.object) ||
85 isDislikeActivityValid(activity.object) ||
86 isFlagActivityValid(activity.object) ||
87 isPlaylistObjectValid(activity.object) ||
89 isCacheFileObjectValid(activity.object) ||
90 sanitizeAndCheckVideoCommentObject(activity.object) ||
91 sanitizeAndCheckVideoTorrentObject(activity.object)
95 function checkUpdateActivity (activity: any) {
96 return isBaseActivityValid(activity, 'Update') &&
98 isCacheFileObjectValid(activity.object) ||
99 isPlaylistObjectValid(activity.object) ||
100 sanitizeAndCheckVideoTorrentObject(activity.object) ||
101 sanitizeAndCheckActorObject(activity.object)
105 function checkDeleteActivity (activity: any) {
106 // We don't really check objects
107 return isBaseActivityValid(activity, 'Delete') &&
108 isObjectValid(activity.object)
111 function checkFollowActivity (activity: any) {
112 return isBaseActivityValid(activity, 'Follow') &&
113 isObjectValid(activity.object)
116 function checkAcceptActivity (activity: any) {
117 return isBaseActivityValid(activity, 'Accept')
120 function checkRejectActivity (activity: any) {
121 return isBaseActivityValid(activity, 'Reject')
124 function checkAnnounceActivity (activity: any) {
125 return isShareActivityValid(activity)
128 function checkUndoActivity (activity: any) {
129 return isBaseActivityValid(activity, 'Undo') &&
131 checkFollowActivity(activity.object) ||
132 checkLikeActivity(activity.object) ||
133 checkDislikeActivity(activity.object) ||
134 checkAnnounceActivity(activity.object) ||
135 checkCreateActivity(activity.object)