]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/activitypub/videos.ts
9ddacd6010ab25628902e8a6a47ba9851b5ccc9d
[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 isVideoAbuseReasonValid,
7 isVideoDurationValid,
8 isVideoNameValid,
9 isVideoNSFWValid,
10 isVideoTagValid,
11 isVideoTruncatedDescriptionValid,
12 isVideoUrlValid,
13 isVideoViewsValid
14 } from '../videos'
15 import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
16
17 function isVideoTorrentAddActivityValid (activity: any) {
18 return isBaseActivityValid(activity, 'Add') &&
19 isVideoTorrentObjectValid(activity.object)
20 }
21
22 function isVideoTorrentUpdateActivityValid (activity: any) {
23 return isBaseActivityValid(activity, 'Update') &&
24 isVideoTorrentObjectValid(activity.object)
25 }
26
27 function isVideoTorrentDeleteActivityValid (activity: any) {
28 return isBaseActivityValid(activity, 'Delete')
29 }
30
31 function 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
40 function isVideoTorrentObjectValid (video: any) {
41 return video.type === 'Video' &&
42 isVideoNameValid(video.name) &&
43 isActivityPubVideoDurationValid(video.duration) &&
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)
56 }
57
58 function isVideoFlagValid (activity: any) {
59 return isBaseActivityValid(activity, 'Flag') &&
60 isVideoAbuseReasonValid(activity.content) &&
61 isActivityPubUrlValid(activity.object)
62 }
63
64 function isVideoAnnounceValid (activity: any) {
65 return isBaseActivityValid(activity, 'Announce') &&
66 isVideoTorrentObjectValid(activity.object)
67 }
68
69 function isVideoChannelAnnounceValid (activity: any) {
70 return isBaseActivityValid(activity, 'Announce') &&
71 isVideoChannelObjectValid(activity.object)
72 }
73
74 function isVideoChannelCreateActivityValid (activity: any) {
75 return isBaseActivityValid(activity, 'Create') &&
76 isVideoChannelObjectValid(activity.object)
77 }
78
79 function isVideoChannelUpdateActivityValid (activity: any) {
80 return isBaseActivityValid(activity, 'Update') &&
81 isVideoChannelObjectValid(activity.object)
82 }
83
84 function isVideoChannelDeleteActivityValid (activity: any) {
85 return isBaseActivityValid(activity, 'Delete')
86 }
87
88 function isVideoChannelObjectValid (videoChannel: any) {
89 return videoChannel.type === 'VideoChannel' &&
90 isVideoChannelNameValid(videoChannel.name) &&
91 isVideoChannelDescriptionValid(videoChannel.description) &&
92 isUUIDValid(videoChannel.uuid)
93 }
94
95 // ---------------------------------------------------------------------------
96
97 export {
98 isVideoTorrentAddActivityValid,
99 isVideoChannelCreateActivityValid,
100 isVideoTorrentUpdateActivityValid,
101 isVideoChannelUpdateActivityValid,
102 isVideoChannelDeleteActivityValid,
103 isVideoTorrentDeleteActivityValid,
104 isVideoFlagValid,
105 isVideoAnnounceValid,
106 isVideoChannelAnnounceValid
107 }
108
109 // ---------------------------------------------------------------------------
110
111 function setValidRemoteTags (video: any) {
112 if (Array.isArray(video.tag) === false) return false
113
114 const newTag = video.tag.filter(t => {
115 return t.type === 'Hashtag' &&
116 isVideoTagValid(t.name)
117 })
118
119 video.tag = newTag
120 return true
121 }
122
123 function isRemoteIdentifierValid (data: any) {
124 return validator.isInt(data.identifier, { min: 0 })
125 }
126
127 function isRemoteVideoContentValid (mediaType: string, content: string) {
128 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
129 }
130
131 function isRemoteVideoIconValid (icon: any) {
132 return icon.type === 'Image' &&
133 isVideoUrlValid(icon.url) &&
134 icon.mediaType === 'image/jpeg' &&
135 validator.isInt(icon.width, { min: 0 }) &&
136 validator.isInt(icon.height, { min: 0 })
137 }
138
139 function setValidRemoteVideoUrls (video: any) {
140 if (Array.isArray(video.url) === false) return false
141
142 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
143 video.url = newUrl
144
145 return true
146 }
147
148 function isRemoteVideoUrlValid (url: any) {
149 return url.type === 'Link' &&
150 ACTIVITY_PUB.VIDEO_URL_MIME_TYPES.indexOf(url.mimeType) !== -1 &&
151 isVideoUrlValid(url.url) &&
152 validator.isInt(url.width, { min: 0 }) &&
153 validator.isInt(url.size, { min: 0 })
154 }