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