123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- import { Response } from 'express'
- import 'express-validator'
- import { values } from 'lodash'
- import 'multer'
- import * as validator from 'validator'
- import { UserRight, VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
- import {
- CONSTRAINTS_FIELDS,
- MIMETYPES,
- VIDEO_CATEGORIES,
- VIDEO_LICENCES,
- VIDEO_PRIVACIES,
- VIDEO_RATE_TYPES,
- VIDEO_STATES
- } from '../../initializers/constants'
- import { VideoModel } from '../../models/video/video'
- import { exists, isArray, isDateValid, isFileValid } from './misc'
- import { VideoChannelModel } from '../../models/video/video-channel'
- import { UserModel } from '../../models/account/user'
- import * as magnetUtil from 'magnet-uri'
- import { fetchVideo, VideoFetchType } from '../video'
- const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
- function isVideoFilterValid (filter: VideoFilter) {
- return filter === 'local' || filter === 'all-local'
- }
- function isVideoCategoryValid (value: any) {
- return value === null || VIDEO_CATEGORIES[ value ] !== undefined
- }
- function isVideoStateValid (value: any) {
- return exists(value) && VIDEO_STATES[ value ] !== undefined
- }
- function isVideoLicenceValid (value: any) {
- return value === null || VIDEO_LICENCES[ value ] !== undefined
- }
- function isVideoLanguageValid (value: any) {
- return value === null ||
- (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
- }
- function isVideoDurationValid (value: string) {
- return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
- }
- function isVideoTruncatedDescriptionValid (value: string) {
- return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
- }
- function isVideoDescriptionValid (value: string) {
- return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
- }
- function isVideoSupportValid (value: string) {
- return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
- }
- function isVideoNameValid (value: string) {
- return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
- }
- function isVideoTagValid (tag: string) {
- return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
- }
- function isVideoTagsValid (tags: string[]) {
- return tags === null || (
- isArray(tags) &&
- validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
- tags.every(tag => isVideoTagValid(tag))
- )
- }
- function isVideoViewsValid (value: string) {
- return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
- }
- function isVideoRatingTypeValid (value: string) {
- return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
- }
- function isVideoFileExtnameValid (value: string) {
- return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
- }
- function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
- const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
- .map(m => `(${m})`)
- .join('|')
- return isFileValid(files, videoFileTypesRegex, 'videofile', null)
- }
- const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
- .map(v => v.replace('.', ''))
- .join('|')
- const videoImageTypesRegex = `image/(${videoImageTypes})`
- function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
- return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
- }
- function isVideoPrivacyValid (value: number) {
- return validator.isInt(value + '') && VIDEO_PRIVACIES[ value ] !== undefined
- }
- function isScheduleVideoUpdatePrivacyValid (value: number) {
- return validator.isInt(value + '') &&
- (
- value === VideoPrivacy.UNLISTED ||
- value === VideoPrivacy.PUBLIC
- )
- }
- function isVideoOriginallyPublishedAtValid (value: string | null) {
- return value === null || isDateValid(value)
- }
- function isVideoFileInfoHashValid (value: string | null | undefined) {
- return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
- }
- function isVideoFileResolutionValid (value: string) {
- return exists(value) && validator.isInt(value + '')
- }
- function isVideoFPSResolutionValid (value: string) {
- return value === null || validator.isInt(value + '')
- }
- function isVideoFileSizeValid (value: string) {
- return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
- }
- function isVideoMagnetUriValid (value: string) {
- if (!exists(value)) return false
- const parsed = magnetUtil.decode(value)
- return parsed && isVideoFileInfoHashValid(parsed.infoHash)
- }
- function checkUserCanManageVideo (user: UserModel, video: VideoModel, right: UserRight, res: Response) {
- // Retrieve the user who did the request
- if (video.isOwned() === false) {
- res.status(403)
- .json({ error: 'Cannot manage a video of another server.' })
- .end()
- return false
- }
- // Check if the user can delete the video
- // The user can delete it if he has the right
- // Or if s/he is the video's account
- const account = video.VideoChannel.Account
- if (user.hasRight(right) === false && account.userId !== user.id) {
- res.status(403)
- .json({ error: 'Cannot manage a video of another user.' })
- .end()
- return false
- }
- return true
- }
- async function doesVideoExist (id: number | string, res: Response, fetchType: VideoFetchType = 'all') {
- const userId = res.locals.oauth ? res.locals.oauth.token.User.id : undefined
- const video = await fetchVideo(id, fetchType, userId)
- if (video === null) {
- res.status(404)
- .json({ error: 'Video not found' })
- .end()
- return false
- }
- if (fetchType !== 'none') res.locals.video = video
- return true
- }
- async function doesVideoChannelOfAccountExist (channelId: number, user: UserModel, res: Response) {
- if (user.hasRight(UserRight.UPDATE_ANY_VIDEO) === true) {
- const videoChannel = await VideoChannelModel.loadAndPopulateAccount(channelId)
- if (videoChannel === null) {
- res.status(400)
- .json({ error: 'Unknown video `video channel` on this instance.' })
- .end()
- return false
- }
- res.locals.videoChannel = videoChannel
- return true
- }
- const videoChannel = await VideoChannelModel.loadByIdAndAccount(channelId, user.Account.id)
- if (videoChannel === null) {
- res.status(400)
- .json({ error: 'Unknown video `video channel` for this account.' })
- .end()
- return false
- }
- res.locals.videoChannel = videoChannel
- return true
- }
- // ---------------------------------------------------------------------------
- export {
- isVideoCategoryValid,
- checkUserCanManageVideo,
- isVideoLicenceValid,
- isVideoLanguageValid,
- isVideoTruncatedDescriptionValid,
- isVideoDescriptionValid,
- isVideoFileInfoHashValid,
- isVideoNameValid,
- isVideoTagsValid,
- isVideoFPSResolutionValid,
- isScheduleVideoUpdatePrivacyValid,
- isVideoOriginallyPublishedAtValid,
- isVideoFile,
- isVideoMagnetUriValid,
- isVideoStateValid,
- isVideoViewsValid,
- isVideoRatingTypeValid,
- isVideoFileExtnameValid,
- isVideoDurationValid,
- isVideoTagValid,
- isVideoPrivacyValid,
- isVideoFileResolutionValid,
- isVideoFileSizeValid,
- doesVideoExist,
- isVideoImage,
- doesVideoChannelOfAccountExist,
- isVideoSupportValid,
- isVideoFilterValid
- }
|