X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fhelpers%2Fcustom-validators%2Fvideos.ts;h=07aadadb100f3596d0008d43def68431bd409f43;hb=40ff57078e15d5b86ee6b71e198b95d3feb78eaf;hp=6389998e1320c831d0891d5cf78f76756c04a1f2;hpb=4d4e5cd4dca78480ec7f40e747f424cd107376a4;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts index 6389998e1..07aadadb1 100644 --- a/server/helpers/custom-validators/videos.ts +++ b/server/helpers/custom-validators/videos.ts @@ -1,118 +1,137 @@ +import * as Promise from 'bluebird' +import * as express from 'express' +import 'express-validator' import { values } from 'lodash' +import 'multer' import * as validator from 'validator' - +import { VideoRateType } from '../../../shared' +import { logger } from '../../helpers' import { CONSTRAINTS_FIELDS, + database as db, VIDEO_CATEGORIES, - VIDEO_LICENCES, VIDEO_LANGUAGES, + VIDEO_LICENCES, + VIDEO_PRIVACIES, VIDEO_RATE_TYPES } from '../../initializers' -import { isUserUsernameValid } from './users' -import { isArray } from './misc' +import { VideoInstance } from '../../models' +import { isActivityPubUrlValid } from './activitypub/misc' +import { exists, isArray } from './misc' const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES const VIDEO_EVENTS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_EVENTS -function isVideoAuthorValid (value) { - return isUserUsernameValid(value) +function isVideoCategoryValid (value: number) { + return VIDEO_CATEGORIES[value] !== undefined } -function isVideoDateValid (value) { - return validator.isDate(value) +// Maybe we don't know the remote category, but that doesn't matter +function isRemoteVideoCategoryValid (value: string) { + return validator.isInt('' + value) } -function isVideoCategoryValid (value) { - return VIDEO_CATEGORIES[value] !== undefined +function isVideoUrlValid (value: string) { + return isActivityPubUrlValid(value) } -function isVideoLicenceValid (value) { +function isVideoLicenceValid (value: number) { return VIDEO_LICENCES[value] !== undefined } -function isVideoLanguageValid (value) { - return value === null || VIDEO_LANGUAGES[value] !== undefined +function isVideoPrivacyValid (value: string) { + return VIDEO_PRIVACIES[value] !== undefined } -function isVideoNSFWValid (value) { - return validator.isBoolean(value) +// Maybe we don't know the remote privacy setting, but that doesn't matter +function isRemoteVideoPrivacyValid (value: string) { + return validator.isInt('' + value) } -function isVideoDescriptionValid (value) { - return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION) +// Maybe we don't know the remote licence, but that doesn't matter +function isRemoteVideoLicenceValid (value: string) { + return validator.isInt('' + value) } -function isVideoDurationValid (value) { - return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION) +function isVideoLanguageValid (value: number) { + return value === null || VIDEO_LANGUAGES[value] !== undefined } -function isVideoExtnameValid (value) { - return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1 +// Maybe we don't know the remote language, but that doesn't matter +function isRemoteVideoLanguageValid (value: string) { + return validator.isInt('' + value) } -function isVideoInfoHashValid (value) { - return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH) +function isVideoNSFWValid (value: any) { + return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value)) } -function isVideoNameValid (value) { - return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME) +function isVideoDurationValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION) } -function isVideoTagsValid (tags) { - return isArray(tags) && - validator.isInt(tags.length, VIDEOS_CONSTRAINTS_FIELDS.TAGS) && - tags.every(function (tag) { - return validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG) - }) +function isVideoTruncatedDescriptionValid (value: string) { + return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION) +} + +function isVideoDescriptionValid (value: string) { + return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION) } -function isVideoThumbnailValid (value) { - return validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL) +function isVideoNameValid (value: string) { + return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME) } -function isVideoThumbnailDataValid (value) { - return validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA) +function isVideoTagValid (tag: string) { + return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG) } -function isVideoRemoteIdValid (value) { - return validator.isUUID(value, 4) +function isVideoTagsValid (tags: string[]) { + return isArray(tags) && + validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) && + tags.every(tag => isVideoTagValid(tag)) } -function isVideoAbuseReasonValid (value) { - return validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON) +function isVideoThumbnailValid (value: string) { + return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL) } -function isVideoAbuseReporterUsernameValid (value) { - return isUserUsernameValid(value) +function isVideoThumbnailDataValid (value: string) { + return exists(value) && validator.isByteLength(value, VIDEOS_CONSTRAINTS_FIELDS.THUMBNAIL_DATA) } -function isVideoViewsValid (value) { - return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS) +function isVideoAbuseReasonValid (value: string) { + return exists(value) && validator.isLength(value, VIDEO_ABUSES_CONSTRAINTS_FIELDS.REASON) } -function isVideoLikesValid (value) { - return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES) +function isVideoViewsValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS) } -function isVideoDislikesValid (value) { - return validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES) +function isVideoLikesValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.LIKES) } -function isVideoEventCountValid (value) { - return validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT) +function isVideoDislikesValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DISLIKES) } -function isVideoRatingTypeValid (value) { - return values(VIDEO_RATE_TYPES).indexOf(value) !== -1 +function isVideoEventCountValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEO_EVENTS_CONSTRAINTS_FIELDS.COUNT) } -function isVideoFile (value, files) { +function isVideoRatingTypeValid (value: string) { + return values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1 +} + +function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { // Should have files if (!files) return false + if (isArray(files)) return false // Should have videofile file - const videofile = files.videofile + const videofile = files['videofile'] if (!videofile || videofile.length === 0) return false // The file should exist @@ -122,30 +141,77 @@ function isVideoFile (value, files) { return new RegExp('^video/(webm|mp4|ogg)$', 'i').test(file.mimetype) } +function isVideoFileSizeValid (value: string) { + return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE) +} + +function isVideoFileResolutionValid (value: string) { + return exists(value) && validator.isInt(value + '') +} + +function isVideoFileExtnameValid (value: string) { + return VIDEOS_CONSTRAINTS_FIELDS.EXTNAME.indexOf(value) !== -1 +} + +function isVideoFileInfoHashValid (value: string) { + return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH) +} + +function checkVideoExists (id: string, res: express.Response, callback: () => void) { + let promise: Promise + if (validator.isInt(id)) { + promise = db.Video.loadAndPopulateAccountAndServerAndTags(+id) + } else { // UUID + promise = db.Video.loadByUUIDAndPopulateAccountAndServerAndTags(id) + } + + promise.then(video => { + if (!video) { + return res.status(404) + .json({ error: 'Video not found' }) + .end() + } + + res.locals.video = video + callback() + }) + .catch(err => { + logger.error('Error in video request validator.', err) + return res.sendStatus(500) + }) +} + // --------------------------------------------------------------------------- export { - isVideoAuthorValid, - isVideoDateValid, isVideoCategoryValid, isVideoLicenceValid, isVideoLanguageValid, isVideoNSFWValid, + isVideoTruncatedDescriptionValid, isVideoDescriptionValid, - isVideoDurationValid, - isVideoInfoHashValid, + isVideoFileInfoHashValid, isVideoNameValid, isVideoTagsValid, isVideoThumbnailValid, isVideoThumbnailDataValid, - isVideoExtnameValid, - isVideoRemoteIdValid, + isVideoFileExtnameValid, isVideoAbuseReasonValid, - isVideoAbuseReporterUsernameValid, isVideoFile, isVideoViewsValid, isVideoLikesValid, isVideoRatingTypeValid, isVideoDislikesValid, - isVideoEventCountValid + isVideoEventCountValid, + isVideoFileSizeValid, + isVideoPrivacyValid, + isRemoteVideoPrivacyValid, + isVideoDurationValid, + isVideoFileResolutionValid, + checkVideoExists, + isVideoTagValid, + isRemoteVideoCategoryValid, + isRemoteVideoLicenceValid, + isVideoUrlValid, + isRemoteVideoLanguageValid }