]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/activity.ts
Feature/filter already watched videos (#5739)
[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'
b2111066 11import { isWatchActionObjectValid } from './watch-action'
0d0e8dd0
C
12
13function isRootActivityValid (activity: any) {
4550872b
C
14 return isCollection(activity) || isActivity(activity)
15}
16
17function isCollection (activity: any) {
18 return (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
19 validator.isInt(activity.totalItems, { min: 0 }) &&
20 Array.isArray(activity.items)
21}
22
23function isActivity (activity: any) {
24 return isActivityPubUrlValid(activity.id) &&
25 exists(activity.actor) &&
26 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id))
0d0e8dd0
C
27}
28
54141398 29const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
67f87b66
C
30 Create: isCreateActivityValid,
31 Update: isUpdateActivityValid,
32 Delete: isDeleteActivityValid,
33 Follow: isFollowActivityValid,
34 Accept: isAcceptActivityValid,
35 Reject: isRejectActivityValid,
36 Announce: isAnnounceActivityValid,
37 Undo: isUndoActivityValid,
38 Like: isLikeActivityValid,
39 View: isViewActivityValid,
40 Flag: isFlagActivityValid,
41 Dislike: isDislikeActivityValid
54141398
C
42}
43
0d0e8dd0 44function isActivityValid (activity: any) {
db4b15f2 45 const checker = activityCheckers[activity.type]
54141398
C
46 // Unknown activity type
47 if (!checker) return false
48
49 return checker(activity)
0d0e8dd0
C
50}
51
67f87b66 52function isFlagActivityValid (activity: any) {
43b51366 53 return isBaseActivityValid(activity, 'Flag') &&
67f87b66
C
54 isAbuseReasonValid(activity.content) &&
55 isActivityPubUrlValid(activity.object)
0d0e8dd0 56}
54141398 57
67f87b66
C
58function isLikeActivityValid (activity: any) {
59 return isBaseActivityValid(activity, 'Like') &&
60 isObjectValid(activity.object)
848f499d
C
61}
62
67f87b66
C
63function isDislikeActivityValid (activity: any) {
64 return isBaseActivityValid(activity, 'Dislike') &&
65 isObjectValid(activity.object)
848f499d
C
66}
67
67f87b66
C
68function isAnnounceActivityValid (activity: any) {
69 return isBaseActivityValid(activity, 'Announce') &&
70 isObjectValid(activity.object)
74d249bc
C
71}
72
67f87b66
C
73function isViewActivityValid (activity: any) {
74 return isBaseActivityValid(activity, 'View') &&
75 isActivityPubUrlValid(activity.actor) &&
76 isActivityPubUrlValid(activity.object)
848f499d
C
77}
78
67f87b66 79function isCreateActivityValid (activity: any) {
848f499d
C
80 return isBaseActivityValid(activity, 'Create') &&
81 (
82 isViewActivityValid(activity.object) ||
83 isDislikeActivityValid(activity.object) ||
84 isFlagActivityValid(activity.object) ||
418d092a 85 isPlaylistObjectValid(activity.object) ||
b2111066 86 isWatchActionObjectValid(activity.object) ||
848f499d
C
87
88 isCacheFileObjectValid(activity.object) ||
89 sanitizeAndCheckVideoCommentObject(activity.object) ||
90 sanitizeAndCheckVideoTorrentObject(activity.object)
91 )
54141398
C
92}
93
67f87b66 94function isUpdateActivityValid (activity: any) {
848f499d
C
95 return isBaseActivityValid(activity, 'Update') &&
96 (
97 isCacheFileObjectValid(activity.object) ||
418d092a 98 isPlaylistObjectValid(activity.object) ||
848f499d
C
99 sanitizeAndCheckVideoTorrentObject(activity.object) ||
100 sanitizeAndCheckActorObject(activity.object)
101 )
54141398
C
102}
103
67f87b66 104function isDeleteActivityValid (activity: any) {
848f499d
C
105 // We don't really check objects
106 return isBaseActivityValid(activity, 'Delete') &&
107 isObjectValid(activity.object)
54141398
C
108}
109
67f87b66 110function isFollowActivityValid (activity: any) {
848f499d
C
111 return isBaseActivityValid(activity, 'Follow') &&
112 isObjectValid(activity.object)
54141398
C
113}
114
67f87b66 115function isAcceptActivityValid (activity: any) {
848f499d 116 return isBaseActivityValid(activity, 'Accept')
54141398
C
117}
118
67f87b66 119function isRejectActivityValid (activity: any) {
848f499d 120 return isBaseActivityValid(activity, 'Reject')
4bbc373f
C
121}
122
67f87b66 123function isUndoActivityValid (activity: any) {
848f499d
C
124 return isBaseActivityValid(activity, 'Undo') &&
125 (
67f87b66
C
126 isFollowActivityValid(activity.object) ||
127 isLikeActivityValid(activity.object) ||
128 isDislikeActivityValid(activity.object) ||
129 isAnnounceActivityValid(activity.object) ||
130 isCreateActivityValid(activity.object)
848f499d 131 )
0032ebe9 132}
67f87b66
C
133
134// ---------------------------------------------------------------------------
135
136export {
137 isRootActivityValid,
138 isActivityValid,
139 isFlagActivityValid,
140 isLikeActivityValid,
141 isDislikeActivityValid,
142 isAnnounceActivityValid,
143 isViewActivityValid,
144 isCreateActivityValid,
145 isUpdateActivityValid,
146 isDeleteActivityValid,
147 isFollowActivityValid,
148 isAcceptActivityValid,
149 isRejectActivityValid,
150 isUndoActivityValid
151}