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