]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/custom-validators/activitypub/videos.ts
Add video abuse to activity pub
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / activitypub / videos.ts
CommitLineData
0d0e8dd0 1import * as validator from 'validator'
65fcc311
C
2
3import {
0d0e8dd0 4 ACTIVITY_PUB
65fcc311 5} from '../../../initializers'
0d0e8dd0 6import { isDateValid, isUUIDValid } from '../misc'
65fcc311 7import {
65fcc311 8 isVideoViewsValid,
65fcc311 9 isVideoNSFWValid,
9567011b 10 isVideoTruncatedDescriptionValid,
65fcc311 11 isVideoDurationValid,
65fcc311 12 isVideoNameValid,
e34c85e5
C
13 isVideoTagValid,
14 isVideoUrlValid
65fcc311 15} from '../videos'
72c7248b 16import { isVideoChannelDescriptionValid, isVideoChannelNameValid } from '../video-channels'
350e31d6 17import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
0d0e8dd0
C
18
19function isVideoTorrentAddActivityValid (activity: any) {
20 return isBaseActivityValid(activity, 'Add') &&
21 isVideoTorrentObjectValid(activity.object)
22}
23
24function isVideoTorrentUpdateActivityValid (activity: any) {
25 return isBaseActivityValid(activity, 'Update') &&
26 isVideoTorrentObjectValid(activity.object)
65fcc311
C
27}
28
350e31d6
C
29function isVideoTorrentDeleteActivityValid (activity: any) {
30 return isBaseActivityValid(activity, 'Delete')
31}
32
0d0e8dd0
C
33function isVideoTorrentObjectValid (video: any) {
34 return video.type === 'Video' &&
35 isVideoNameValid(video.name) &&
36 isVideoDurationValid(video.duration) &&
37 isUUIDValid(video.uuid) &&
38 setValidRemoteTags(video) &&
39 isRemoteIdentifierValid(video.category) &&
40 isRemoteIdentifierValid(video.licence) &&
41 isRemoteIdentifierValid(video.language) &&
42 isVideoViewsValid(video.video) &&
43 isVideoNSFWValid(video.nsfw) &&
44 isDateValid(video.published) &&
45 isDateValid(video.updated) &&
46 isRemoteVideoContentValid(video.mediaType, video.content) &&
47 isRemoteVideoIconValid(video.icon) &&
48 setValidRemoteVideoUrls(video.url)
65fcc311
C
49}
50
0d0e8dd0
C
51function isVideoChannelCreateActivityValid (activity: any) {
52 return isBaseActivityValid(activity, 'Create') &&
53 isVideoChannelObjectValid(activity.object)
54}
55
56function isVideoChannelUpdateActivityValid (activity: any) {
57 return isBaseActivityValid(activity, 'Update') &&
58 isVideoChannelObjectValid(activity.object)
59}
60
350e31d6
C
61function isVideoChannelDeleteActivityValid (activity: any) {
62 return isBaseActivityValid(activity, 'Delete')
63}
64
0d0e8dd0
C
65function isVideoChannelObjectValid (videoChannel: any) {
66 return videoChannel.type === 'VideoChannel' &&
67 isVideoChannelNameValid(videoChannel.name) &&
68 isVideoChannelDescriptionValid(videoChannel.description) &&
69 isUUIDValid(videoChannel.uuid)
65fcc311
C
70}
71
72// ---------------------------------------------------------------------------
73
74export {
0d0e8dd0
C
75 isVideoTorrentAddActivityValid,
76 isVideoChannelCreateActivityValid,
77 isVideoTorrentUpdateActivityValid,
350e31d6
C
78 isVideoChannelUpdateActivityValid,
79 isVideoChannelDeleteActivityValid,
80 isVideoTorrentDeleteActivityValid
65fcc311
C
81}
82
83// ---------------------------------------------------------------------------
84
0d0e8dd0
C
85function setValidRemoteTags (video: any) {
86 if (Array.isArray(video.tag) === false) return false
65fcc311 87
0d0e8dd0
C
88 const newTag = video.tag.filter(t => {
89 return t.type === 'Hashtag' &&
90 isVideoTagValid(t.name)
91 })
72c7248b 92
0d0e8dd0
C
93 video.tag = newTag
94 return true
72c7248b
C
95}
96
0d0e8dd0
C
97function isRemoteIdentifierValid (data: any) {
98 return validator.isInt(data.identifier, { min: 0 })
72c7248b
C
99}
100
0d0e8dd0
C
101function isRemoteVideoContentValid (mediaType: string, content: string) {
102 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
72c7248b
C
103}
104
0d0e8dd0
C
105function isRemoteVideoIconValid (icon: any) {
106 return icon.type === 'Image' &&
e34c85e5 107 isVideoUrlValid(icon.url) &&
0d0e8dd0
C
108 icon.mediaType === 'image/jpeg' &&
109 validator.isInt(icon.width, { min: 0 }) &&
110 validator.isInt(icon.height, { min: 0 })
72c7248b
C
111}
112
0d0e8dd0
C
113function setValidRemoteVideoUrls (video: any) {
114 if (Array.isArray(video.url) === false) return false
65fcc311 115
0d0e8dd0
C
116 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
117 video.url = newUrl
65fcc311 118
0d0e8dd0 119 return true
65fcc311
C
120}
121
0d0e8dd0
C
122function isRemoteVideoUrlValid (url: any) {
123 return url.type === 'Link' &&
124 ACTIVITY_PUB.VIDEO_URL_MIME_TYPES.indexOf(url.mimeType) !== -1 &&
e34c85e5 125 isVideoUrlValid(url.url) &&
0d0e8dd0
C
126 validator.isInt(url.width, { min: 0 }) &&
127 validator.isInt(url.size, { min: 0 })
65fcc311 128}