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