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'
6 isVideoAbuseReasonValid,
11 isVideoTruncatedDescriptionValid,
15 import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
17 function isVideoTorrentAddActivityValid (activity: any) {
18 return isBaseActivityValid(activity, 'Add') &&
19 isVideoTorrentObjectValid(activity.object)
22 function isVideoTorrentUpdateActivityValid (activity: any) {
23 return isBaseActivityValid(activity, 'Update') &&
24 isVideoTorrentObjectValid(activity.object)
27 function isVideoTorrentDeleteActivityValid (activity: any) {
28 return isBaseActivityValid(activity, 'Delete')
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]+/, ''))
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)
58 function isVideoFlagValid (activity: any) {
59 return isBaseActivityValid(activity, 'Flag') &&
60 isVideoAbuseReasonValid(activity.content) &&
61 isActivityPubUrlValid(activity.object)
64 function isVideoAnnounceValid (activity: any) {
65 return isBaseActivityValid(activity, 'Announce') &&
66 isVideoTorrentObjectValid(activity.object)
69 function isVideoChannelAnnounceValid (activity: any) {
70 return isBaseActivityValid(activity, 'Announce') &&
71 isVideoChannelObjectValid(activity.object)
74 function isVideoChannelCreateActivityValid (activity: any) {
75 return isBaseActivityValid(activity, 'Create') &&
76 isVideoChannelObjectValid(activity.object)
79 function isVideoChannelUpdateActivityValid (activity: any) {
80 return isBaseActivityValid(activity, 'Update') &&
81 isVideoChannelObjectValid(activity.object)
84 function isVideoChannelDeleteActivityValid (activity: any) {
85 return isBaseActivityValid(activity, 'Delete')
88 function isVideoChannelObjectValid (videoChannel: any) {
89 return videoChannel.type === 'VideoChannel' &&
90 isVideoChannelNameValid(videoChannel.name) &&
91 isVideoChannelDescriptionValid(videoChannel.description) &&
92 isUUIDValid(videoChannel.uuid)
95 // ---------------------------------------------------------------------------
98 isVideoTorrentAddActivityValid,
99 isVideoChannelCreateActivityValid,
100 isVideoTorrentUpdateActivityValid,
101 isVideoChannelUpdateActivityValid,
102 isVideoChannelDeleteActivityValid,
103 isVideoTorrentDeleteActivityValid,
105 isVideoAnnounceValid,
106 isVideoChannelAnnounceValid
109 // ---------------------------------------------------------------------------
111 function setValidRemoteTags (video: any) {
112 if (Array.isArray(video.tag) === false) return false
114 const newTag = video.tag.filter(t => {
115 return t.type === 'Hashtag' &&
116 isVideoTagValid(t.name)
123 function isRemoteIdentifierValid (data: any) {
124 return validator.isInt(data.identifier, { min: 0 })
127 function isRemoteVideoContentValid (mediaType: string, content: string) {
128 return mediaType === 'text/markdown' && isVideoTruncatedDescriptionValid(content)
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 })
139 function setValidRemoteVideoUrls (video: any) {
140 if (Array.isArray(video.url) === false) return false
142 const newUrl = video.url.filter(u => isRemoteVideoUrlValid(u))
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 })