]>
Commit | Line | Data |
---|---|---|
1 | import validator from 'validator' | |
2 | import { Activity, ActivityType } from '../../../../shared/models/activitypub' | |
3 | import { isAbuseReasonValid } from '../abuses' | |
4 | import { exists } from '../misc' | |
5 | import { sanitizeAndCheckActorObject } from './actor' | |
6 | import { isCacheFileObjectValid } from './cache-file' | |
7 | import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc' | |
8 | import { isPlaylistObjectValid } from './playlist' | |
9 | import { sanitizeAndCheckVideoCommentObject } from './video-comments' | |
10 | import { sanitizeAndCheckVideoTorrentObject } from './videos' | |
11 | ||
12 | function isRootActivityValid (activity: any) { | |
13 | return isCollection(activity) || isActivity(activity) | |
14 | } | |
15 | ||
16 | function isCollection (activity: any) { | |
17 | return (activity.type === 'Collection' || activity.type === 'OrderedCollection') && | |
18 | validator.isInt(activity.totalItems, { min: 0 }) && | |
19 | Array.isArray(activity.items) | |
20 | } | |
21 | ||
22 | function isActivity (activity: any) { | |
23 | return isActivityPubUrlValid(activity.id) && | |
24 | exists(activity.actor) && | |
25 | (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) | |
26 | } | |
27 | ||
28 | const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = { | |
29 | Create: isCreateActivityValid, | |
30 | Update: isUpdateActivityValid, | |
31 | Delete: isDeleteActivityValid, | |
32 | Follow: isFollowActivityValid, | |
33 | Accept: isAcceptActivityValid, | |
34 | Reject: isRejectActivityValid, | |
35 | Announce: isAnnounceActivityValid, | |
36 | Undo: isUndoActivityValid, | |
37 | Like: isLikeActivityValid, | |
38 | View: isViewActivityValid, | |
39 | Flag: isFlagActivityValid, | |
40 | Dislike: isDislikeActivityValid | |
41 | } | |
42 | ||
43 | function isActivityValid (activity: any) { | |
44 | const checker = activityCheckers[activity.type] | |
45 | // Unknown activity type | |
46 | if (!checker) return false | |
47 | ||
48 | return checker(activity) | |
49 | } | |
50 | ||
51 | function isFlagActivityValid (activity: any) { | |
52 | return isBaseActivityValid(activity, 'Flag') && | |
53 | isAbuseReasonValid(activity.content) && | |
54 | isActivityPubUrlValid(activity.object) | |
55 | } | |
56 | ||
57 | function isLikeActivityValid (activity: any) { | |
58 | return isBaseActivityValid(activity, 'Like') && | |
59 | isObjectValid(activity.object) | |
60 | } | |
61 | ||
62 | function isDislikeActivityValid (activity: any) { | |
63 | return isBaseActivityValid(activity, 'Dislike') && | |
64 | isObjectValid(activity.object) | |
65 | } | |
66 | ||
67 | function isAnnounceActivityValid (activity: any) { | |
68 | return isBaseActivityValid(activity, 'Announce') && | |
69 | isObjectValid(activity.object) | |
70 | } | |
71 | ||
72 | function isViewActivityValid (activity: any) { | |
73 | return isBaseActivityValid(activity, 'View') && | |
74 | isActivityPubUrlValid(activity.actor) && | |
75 | isActivityPubUrlValid(activity.object) | |
76 | } | |
77 | ||
78 | function isCreateActivityValid (activity: any) { | |
79 | return isBaseActivityValid(activity, 'Create') && | |
80 | ( | |
81 | isViewActivityValid(activity.object) || | |
82 | isDislikeActivityValid(activity.object) || | |
83 | isFlagActivityValid(activity.object) || | |
84 | isPlaylistObjectValid(activity.object) || | |
85 | ||
86 | isCacheFileObjectValid(activity.object) || | |
87 | sanitizeAndCheckVideoCommentObject(activity.object) || | |
88 | sanitizeAndCheckVideoTorrentObject(activity.object) | |
89 | ) | |
90 | } | |
91 | ||
92 | function isUpdateActivityValid (activity: any) { | |
93 | return isBaseActivityValid(activity, 'Update') && | |
94 | ( | |
95 | isCacheFileObjectValid(activity.object) || | |
96 | isPlaylistObjectValid(activity.object) || | |
97 | sanitizeAndCheckVideoTorrentObject(activity.object) || | |
98 | sanitizeAndCheckActorObject(activity.object) | |
99 | ) | |
100 | } | |
101 | ||
102 | function isDeleteActivityValid (activity: any) { | |
103 | // We don't really check objects | |
104 | return isBaseActivityValid(activity, 'Delete') && | |
105 | isObjectValid(activity.object) | |
106 | } | |
107 | ||
108 | function isFollowActivityValid (activity: any) { | |
109 | return isBaseActivityValid(activity, 'Follow') && | |
110 | isObjectValid(activity.object) | |
111 | } | |
112 | ||
113 | function isAcceptActivityValid (activity: any) { | |
114 | return isBaseActivityValid(activity, 'Accept') | |
115 | } | |
116 | ||
117 | function isRejectActivityValid (activity: any) { | |
118 | return isBaseActivityValid(activity, 'Reject') | |
119 | } | |
120 | ||
121 | function isUndoActivityValid (activity: any) { | |
122 | return isBaseActivityValid(activity, 'Undo') && | |
123 | ( | |
124 | isFollowActivityValid(activity.object) || | |
125 | isLikeActivityValid(activity.object) || | |
126 | isDislikeActivityValid(activity.object) || | |
127 | isAnnounceActivityValid(activity.object) || | |
128 | isCreateActivityValid(activity.object) | |
129 | ) | |
130 | } | |
131 | ||
132 | // --------------------------------------------------------------------------- | |
133 | ||
134 | export { | |
135 | isRootActivityValid, | |
136 | isActivityValid, | |
137 | isFlagActivityValid, | |
138 | isLikeActivityValid, | |
139 | isDislikeActivityValid, | |
140 | isAnnounceActivityValid, | |
141 | isViewActivityValid, | |
142 | isCreateActivityValid, | |
143 | isUpdateActivityValid, | |
144 | isDeleteActivityValid, | |
145 | isFollowActivityValid, | |
146 | isAcceptActivityValid, | |
147 | isRejectActivityValid, | |
148 | isUndoActivityValid | |
149 | } |