]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/activitypub/activity.ts
Federate likes/dislikes
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / activity.ts
1 import * as validator from 'validator'
2 import { Activity, ActivityType } from '../../../../shared/models/activitypub/activity'
3 import { isAccountAcceptActivityValid, isAccountDeleteActivityValid, isAccountFollowActivityValid } from './account'
4 import { isAnnounceActivityValid } from './announce'
5 import { isActivityPubUrlValid } from './misc'
6 import { isUndoActivityValid } from './undo'
7 import { isVideoChannelCreateActivityValid, isVideoChannelDeleteActivityValid, isVideoChannelUpdateActivityValid } from './video-channels'
8 import {
9 isVideoFlagValid,
10 isVideoTorrentAddActivityValid,
11 isVideoTorrentDeleteActivityValid,
12 isVideoTorrentUpdateActivityValid
13 } from './videos'
14 import { isViewActivityValid } from './view'
15 import { isDislikeActivityValid, isLikeActivityValid } from './rate'
16
17 function isRootActivityValid (activity: any) {
18 return Array.isArray(activity['@context']) &&
19 (
20 (activity.type === 'Collection' || activity.type === 'OrderedCollection') &&
21 validator.isInt(activity.totalItems, { min: 0 }) &&
22 Array.isArray(activity.items)
23 ) ||
24 (
25 isActivityPubUrlValid(activity.id) &&
26 isActivityPubUrlValid(activity.actor)
27 )
28 }
29
30 const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean } = {
31 Create: checkCreateActivity,
32 Add: checkAddActivity,
33 Update: checkUpdateActivity,
34 Delete: checkDeleteActivity,
35 Follow: checkFollowActivity,
36 Accept: checkAcceptActivity,
37 Announce: checkAnnounceActivity,
38 Undo: checkUndoActivity,
39 Like: checkLikeActivity
40 }
41
42 function isActivityValid (activity: any) {
43 const checker = activityCheckers[activity.type]
44 // Unknown activity type
45 if (!checker) return false
46
47 return checker(activity)
48 }
49
50 // ---------------------------------------------------------------------------
51
52 export {
53 isRootActivityValid,
54 isActivityValid
55 }
56
57 // ---------------------------------------------------------------------------
58
59 function checkCreateActivity (activity: any) {
60 return isViewActivityValid(activity) ||
61 isDislikeActivityValid(activity) ||
62 isVideoChannelCreateActivityValid(activity) ||
63 isVideoFlagValid(activity)
64 }
65
66 function checkAddActivity (activity: any) {
67 return isVideoTorrentAddActivityValid(activity)
68 }
69
70 function checkUpdateActivity (activity: any) {
71 return isVideoTorrentUpdateActivityValid(activity) ||
72 isVideoChannelUpdateActivityValid(activity)
73 }
74
75 function checkDeleteActivity (activity: any) {
76 return isVideoTorrentDeleteActivityValid(activity) ||
77 isVideoChannelDeleteActivityValid(activity) ||
78 isAccountDeleteActivityValid(activity)
79 }
80
81 function checkFollowActivity (activity: any) {
82 return isAccountFollowActivityValid(activity)
83 }
84
85 function checkAcceptActivity (activity: any) {
86 return isAccountAcceptActivityValid(activity)
87 }
88
89 function checkAnnounceActivity (activity: any) {
90 return isAnnounceActivityValid(activity)
91 }
92
93 function checkUndoActivity (activity: any) {
94 return isUndoActivityValid(activity)
95 }
96
97 function checkLikeActivity (activity: any) {
98 return isLikeActivityValid(activity)
99 }