]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/activity.ts
Add ability to cleanup remote AP interactions
[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'
74d249bc 3import { exists } from '../misc'
848f499d 4import { sanitizeAndCheckActorObject } from './actor'
74d249bc
C
5import { isCacheFileObjectValid } from './cache-file'
6import { isFlagActivityValid } from './flag'
848f499d 7import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
74d249bc
C
8import { isPlaylistObjectValid } from './playlist'
9import { isDislikeActivityValid, isLikeActivityValid } from './rate'
10import { isShareActivityValid } from './share'
848f499d
C
11import { sanitizeAndCheckVideoCommentObject } from './video-comments'
12import { sanitizeAndCheckVideoTorrentObject } from './videos'
40ff5707 13import { isViewActivityValid } from './view'
0d0e8dd0
C
14
15function isRootActivityValid (activity: any) {
4550872b
C
16 return isCollection(activity) || isActivity(activity)
17}
18
19function isCollection (activity: any) {
20 return (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
21 validator.isInt(activity.totalItems, { min: 0 }) &&
22 Array.isArray(activity.items)
23}
24
25function isActivity (activity: any) {
26 return isActivityPubUrlValid(activity.id) &&
27 exists(activity.actor) &&
28 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
0d0e8dd0
C
29}
30
54141398
C
31const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
32 Create: checkCreateActivity,
54141398
C
33 Update: checkUpdateActivity,
34 Delete: checkDeleteActivity,
35 Follow: checkFollowActivity,
36 Accept: checkAcceptActivity,
4bbc373f 37 Reject: checkRejectActivity,
54141398 38 Announce: checkAnnounceActivity,
0032ebe9 39 Undo: checkUndoActivity,
848f499d
C
40 Like: checkLikeActivity,
41 View: checkViewActivity,
42 Flag: checkFlagActivity,
43 Dislike: checkDislikeActivity
54141398
C
44}
45
0d0e8dd0 46function isActivityValid (activity: any) {
54141398
C
47 const checker = activityCheckers[activity.type]
48 // Unknown activity type
49 if (!checker) return false
50
51 return checker(activity)
0d0e8dd0
C
52}
53
54// ---------------------------------------------------------------------------
55
56export {
57 isRootActivityValid,
58 isActivityValid
59}
54141398
C
60
61// ---------------------------------------------------------------------------
62
848f499d
C
63function checkViewActivity (activity: any) {
64 return isBaseActivityValid(activity, 'View') &&
65 isViewActivityValid(activity)
66}
67
68function checkFlagActivity (activity: any) {
69 return isBaseActivityValid(activity, 'Flag') &&
70 isFlagActivityValid(activity)
71}
72
73function checkDislikeActivity (activity: any) {
74d249bc
C
74 return isDislikeActivityValid(activity)
75}
76
77function checkLikeActivity (activity: any) {
78 return isLikeActivityValid(activity)
848f499d
C
79}
80
54141398 81function checkCreateActivity (activity: any) {
848f499d
C
82 return isBaseActivityValid(activity, 'Create') &&
83 (
84 isViewActivityValid(activity.object) ||
85 isDislikeActivityValid(activity.object) ||
86 isFlagActivityValid(activity.object) ||
418d092a 87 isPlaylistObjectValid(activity.object) ||
848f499d
C
88
89 isCacheFileObjectValid(activity.object) ||
90 sanitizeAndCheckVideoCommentObject(activity.object) ||
91 sanitizeAndCheckVideoTorrentObject(activity.object)
92 )
54141398
C
93}
94
54141398 95function checkUpdateActivity (activity: any) {
848f499d
C
96 return isBaseActivityValid(activity, 'Update') &&
97 (
98 isCacheFileObjectValid(activity.object) ||
418d092a 99 isPlaylistObjectValid(activity.object) ||
848f499d
C
100 sanitizeAndCheckVideoTorrentObject(activity.object) ||
101 sanitizeAndCheckActorObject(activity.object)
102 )
54141398
C
103}
104
105function checkDeleteActivity (activity: any) {
848f499d
C
106 // We don't really check objects
107 return isBaseActivityValid(activity, 'Delete') &&
108 isObjectValid(activity.object)
54141398
C
109}
110
111function checkFollowActivity (activity: any) {
848f499d
C
112 return isBaseActivityValid(activity, 'Follow') &&
113 isObjectValid(activity.object)
54141398
C
114}
115
116function checkAcceptActivity (activity: any) {
848f499d 117 return isBaseActivityValid(activity, 'Accept')
54141398
C
118}
119
4bbc373f 120function checkRejectActivity (activity: any) {
848f499d 121 return isBaseActivityValid(activity, 'Reject')
4bbc373f
C
122}
123
54141398 124function checkAnnounceActivity (activity: any) {
74d249bc 125 return isShareActivityValid(activity)
54141398
C
126}
127
128function checkUndoActivity (activity: any) {
848f499d
C
129 return isBaseActivityValid(activity, 'Undo') &&
130 (
131 checkFollowActivity(activity.object) ||
132 checkLikeActivity(activity.object) ||
133 checkDislikeActivity(activity.object) ||
134 checkAnnounceActivity(activity.object) ||
135 checkCreateActivity(activity.object)
136 )
0032ebe9 137}