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