]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/activity.ts
Fix remote actor creation date
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / activity.ts
CommitLineData
7cde3b9c 1import validator from 'validator'
3fd3ab2d 2import { Activity, ActivityType } from '../../../../shared/models/activitypub'
67f87b66 3import { isAbuseReasonValid } from '../abuses'
74d249bc 4import { exists } from '../misc'
848f499d 5import { sanitizeAndCheckActorObject } from './actor'
74d249bc 6import { isCacheFileObjectValid } from './cache-file'
848f499d 7import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
74d249bc 8import { isPlaylistObjectValid } from './playlist'
848f499d
C
9import { sanitizeAndCheckVideoCommentObject } from './video-comments'
10import { sanitizeAndCheckVideoTorrentObject } from './videos'
0d0e8dd0
C
11
12function isRootActivityValid (activity: any) {
4550872b
C
13 return isCollection(activity) || isActivity(activity)
14}
15
16function 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
22function isActivity (activity: any) {
23 return isActivityPubUrlValid(activity.id) &&
24 exists(activity.actor) &&
25 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
0d0e8dd0
C
26}
27
54141398 28const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
67f87b66
C
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
54141398
C
41}
42
0d0e8dd0 43function isActivityValid (activity: any) {
db4b15f2 44 const checker = activityCheckers[activity.type]
54141398
C
45 // Unknown activity type
46 if (!checker) return false
47
48 return checker(activity)
0d0e8dd0
C
49}
50
67f87b66 51function isFlagActivityValid (activity: any) {
43b51366 52 return isBaseActivityValid(activity, 'Flag') &&
67f87b66
C
53 isAbuseReasonValid(activity.content) &&
54 isActivityPubUrlValid(activity.object)
0d0e8dd0 55}
54141398 56
67f87b66
C
57function isLikeActivityValid (activity: any) {
58 return isBaseActivityValid(activity, 'Like') &&
59 isObjectValid(activity.object)
848f499d
C
60}
61
67f87b66
C
62function isDislikeActivityValid (activity: any) {
63 return isBaseActivityValid(activity, 'Dislike') &&
64 isObjectValid(activity.object)
848f499d
C
65}
66
67f87b66
C
67function isAnnounceActivityValid (activity: any) {
68 return isBaseActivityValid(activity, 'Announce') &&
69 isObjectValid(activity.object)
74d249bc
C
70}
71
67f87b66
C
72function isViewActivityValid (activity: any) {
73 return isBaseActivityValid(activity, 'View') &&
74 isActivityPubUrlValid(activity.actor) &&
75 isActivityPubUrlValid(activity.object)
848f499d
C
76}
77
67f87b66 78function isCreateActivityValid (activity: any) {
848f499d
C
79 return isBaseActivityValid(activity, 'Create') &&
80 (
81 isViewActivityValid(activity.object) ||
82 isDislikeActivityValid(activity.object) ||
83 isFlagActivityValid(activity.object) ||
418d092a 84 isPlaylistObjectValid(activity.object) ||
848f499d
C
85
86 isCacheFileObjectValid(activity.object) ||
87 sanitizeAndCheckVideoCommentObject(activity.object) ||
88 sanitizeAndCheckVideoTorrentObject(activity.object)
89 )
54141398
C
90}
91
67f87b66 92function isUpdateActivityValid (activity: any) {
848f499d
C
93 return isBaseActivityValid(activity, 'Update') &&
94 (
95 isCacheFileObjectValid(activity.object) ||
418d092a 96 isPlaylistObjectValid(activity.object) ||
848f499d
C
97 sanitizeAndCheckVideoTorrentObject(activity.object) ||
98 sanitizeAndCheckActorObject(activity.object)
99 )
54141398
C
100}
101
67f87b66 102function isDeleteActivityValid (activity: any) {
848f499d
C
103 // We don't really check objects
104 return isBaseActivityValid(activity, 'Delete') &&
105 isObjectValid(activity.object)
54141398
C
106}
107
67f87b66 108function isFollowActivityValid (activity: any) {
848f499d
C
109 return isBaseActivityValid(activity, 'Follow') &&
110 isObjectValid(activity.object)
54141398
C
111}
112
67f87b66 113function isAcceptActivityValid (activity: any) {
848f499d 114 return isBaseActivityValid(activity, 'Accept')
54141398
C
115}
116
67f87b66 117function isRejectActivityValid (activity: any) {
848f499d 118 return isBaseActivityValid(activity, 'Reject')
4bbc373f
C
119}
120
67f87b66 121function isUndoActivityValid (activity: any) {
848f499d
C
122 return isBaseActivityValid(activity, 'Undo') &&
123 (
67f87b66
C
124 isFollowActivityValid(activity.object) ||
125 isLikeActivityValid(activity.object) ||
126 isDislikeActivityValid(activity.object) ||
127 isAnnounceActivityValid(activity.object) ||
128 isCreateActivityValid(activity.object)
848f499d 129 )
0032ebe9 130}
67f87b66
C
131
132// ---------------------------------------------------------------------------
133
134export {
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}