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