]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/activitypub/activity.ts
Fix remote actor creation date
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / activity.ts
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 }