]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/activitypub/videos.ts
Follow works
[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 { isActivityPubUrlValid, 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 isVideoTorrentDeleteActivityValid (activity: any) {
30 return isBaseActivityValid(activity, 'Delete')
31 }
32
33 function 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)
49 }
50
51 function isVideoChannelCreateActivityValid (activity: any) {
52 return isBaseActivityValid(activity, 'Create') &&
53 isVideoChannelObjectValid(activity.object)
54 }
55
56 function isVideoChannelUpdateActivityValid (activity: any) {
57 return isBaseActivityValid(activity, 'Update') &&
58 isVideoChannelObjectValid(activity.object)
59 }
60
61 function isVideoChannelDeleteActivityValid (activity: any) {
62 return isBaseActivityValid(activity, 'Delete')
63 }
64
65 function isVideoChannelObjectValid (videoChannel: any) {
66 return videoChannel.type === 'VideoChannel' &&
67 isVideoChannelNameValid(videoChannel.name) &&
68 isVideoChannelDescriptionValid(videoChannel.description) &&
69 isUUIDValid(videoChannel.uuid)
70 }
71
72 // ---------------------------------------------------------------------------
73
74 export {
75 isVideoTorrentAddActivityValid,
76 isVideoChannelCreateActivityValid,
77 isVideoTorrentUpdateActivityValid,
78 isVideoChannelUpdateActivityValid,
79 isVideoChannelDeleteActivityValid,
80 isVideoTorrentDeleteActivityValid
81 }
82
83 // ---------------------------------------------------------------------------
84
85 function setValidRemoteTags (video: any) {
86 if (Array.isArray(video.tag) === false) return false
87
88 const newTag = video.tag.filter(t => {
89 return t.type === 'Hashtag' &&
90 isVideoTagValid(t.name)
91 })
92
93 video.tag = newTag
94 return true
95 }
96
97 function isRemoteIdentifierValid (data: any) {
98 return validator.isInt(data.identifier, { min: 0 })
99 }
100
101 function isRemoteVideoContentValid (mediaType: string, content: string) {
102 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
103 }
104
105 function isRemoteVideoIconValid (icon: any) {
106 return icon.type === 'Image' &&
107 isVideoUrlValid(icon.url) &&
108 icon.mediaType === 'image/jpeg' &&
109 validator.isInt(icon.width, { min: 0 }) &&
110 validator.isInt(icon.height, { min: 0 })
111 }
112
113 function setValidRemoteVideoUrls (video: any) {
114 if (Array.isArray(video.url) === false) return false
115
116 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
117 video.url = newUrl
118
119 return true
120 }
121
122 function isRemoteVideoUrlValid (url: any) {
123 return url.type === 'Link' &&
124 ACTIVITY_PUB.VIDEO_URL_MIME_TYPES.indexOf(url.mimeType) !== -1 &&
125 isVideoUrlValid(url.url) &&
126 validator.isInt(url.width, { min: 0 }) &&
127 validator.isInt(url.size, { min: 0 })
128 }