diff options
author | Rigel Kent <sendmemail@rigelk.eu> | 2020-12-08 21:16:10 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-08 21:16:10 +0100 |
commit | f2eb23cd87cf32b8fe545178143b5f49e06a58da (patch) | |
tree | af7d59945af70e28fd85047e2c688c59a908f548 /server/helpers | |
parent | c977fd3ec931c059111ddb2b8d6ddbb20b6b99a1 (diff) | |
download | PeerTube-f2eb23cd87cf32b8fe545178143b5f49e06a58da.tar.gz PeerTube-f2eb23cd87cf32b8fe545178143b5f49e06a58da.tar.zst PeerTube-f2eb23cd87cf32b8fe545178143b5f49e06a58da.zip |
emit more specific status codes on video upload (#3423)
- reduce http status codes list to potentially useful codes
- convert more codes to typed ones
- factorize html generator for error responses
Diffstat (limited to 'server/helpers')
-rw-r--r-- | server/helpers/custom-validators/misc.ts | 46 | ||||
-rw-r--r-- | server/helpers/custom-validators/videos.ts | 8 | ||||
-rw-r--r-- | server/helpers/youtube-dl.ts | 5 |
3 files changed, 53 insertions, 6 deletions
diff --git a/server/helpers/custom-validators/misc.ts b/server/helpers/custom-validators/misc.ts index 61c03f0c9..effdd98cb 100644 --- a/server/helpers/custom-validators/misc.ts +++ b/server/helpers/custom-validators/misc.ts | |||
@@ -86,6 +86,50 @@ function toIntArray (value: any) { | |||
86 | return value.map(v => validator.toInt(v)) | 86 | return value.map(v => validator.toInt(v)) |
87 | } | 87 | } |
88 | 88 | ||
89 | function isFileFieldValid ( | ||
90 | files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], | ||
91 | field: string, | ||
92 | optional = false | ||
93 | ) { | ||
94 | // Should have files | ||
95 | if (!files) return optional | ||
96 | if (isArray(files)) return optional | ||
97 | |||
98 | // Should have a file | ||
99 | const fileArray = files[field] | ||
100 | if (!fileArray || fileArray.length === 0) { | ||
101 | return optional | ||
102 | } | ||
103 | |||
104 | // The file should exist | ||
105 | const file = fileArray[0] | ||
106 | if (!file || !file.originalname) return false | ||
107 | return file | ||
108 | } | ||
109 | |||
110 | function isFileMimeTypeValid ( | ||
111 | files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], | ||
112 | mimeTypeRegex: string, | ||
113 | field: string, | ||
114 | optional = false | ||
115 | ) { | ||
116 | // Should have files | ||
117 | if (!files) return optional | ||
118 | if (isArray(files)) return optional | ||
119 | |||
120 | // Should have a file | ||
121 | const fileArray = files[field] | ||
122 | if (!fileArray || fileArray.length === 0) { | ||
123 | return optional | ||
124 | } | ||
125 | |||
126 | // The file should exist | ||
127 | const file = fileArray[0] | ||
128 | if (!file || !file.originalname) return false | ||
129 | |||
130 | return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype) | ||
131 | } | ||
132 | |||
89 | function isFileValid ( | 133 | function isFileValid ( |
90 | files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], | 134 | files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], |
91 | mimeTypeRegex: string, | 135 | mimeTypeRegex: string, |
@@ -132,5 +176,7 @@ export { | |||
132 | toIntOrNull, | 176 | toIntOrNull, |
133 | toArray, | 177 | toArray, |
134 | toIntArray, | 178 | toIntArray, |
179 | isFileFieldValid, | ||
180 | isFileMimeTypeValid, | ||
135 | isFileValid | 181 | isFileValid |
136 | } | 182 | } |
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts index 8b309ae42..87966798f 100644 --- a/server/helpers/custom-validators/videos.ts +++ b/server/helpers/custom-validators/videos.ts | |||
@@ -11,7 +11,7 @@ import { | |||
11 | VIDEO_STATES, | 11 | VIDEO_STATES, |
12 | VIDEO_LIVE | 12 | VIDEO_LIVE |
13 | } from '../../initializers/constants' | 13 | } from '../../initializers/constants' |
14 | import { exists, isArray, isDateValid, isFileValid } from './misc' | 14 | import { exists, isArray, isDateValid, isFileMimeTypeValid, isFileValid } from './misc' |
15 | import * as magnetUtil from 'magnet-uri' | 15 | import * as magnetUtil from 'magnet-uri' |
16 | 16 | ||
17 | const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS | 17 | const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS |
@@ -81,8 +81,8 @@ function isVideoFileExtnameValid (value: string) { | |||
81 | return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined) | 81 | return exists(value) && (value === VIDEO_LIVE.EXTENSION || MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined) |
82 | } | 82 | } |
83 | 83 | ||
84 | function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { | 84 | function isVideoFileMimeTypeValid (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { |
85 | return isFileValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile', null) | 85 | return isFileMimeTypeValid(files, MIMETYPES.VIDEO.MIMETYPES_REGEX, 'videofile') |
86 | } | 86 | } |
87 | 87 | ||
88 | const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME | 88 | const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME |
@@ -143,12 +143,12 @@ export { | |||
143 | isVideoFPSResolutionValid, | 143 | isVideoFPSResolutionValid, |
144 | isScheduleVideoUpdatePrivacyValid, | 144 | isScheduleVideoUpdatePrivacyValid, |
145 | isVideoOriginallyPublishedAtValid, | 145 | isVideoOriginallyPublishedAtValid, |
146 | isVideoFile, | ||
147 | isVideoMagnetUriValid, | 146 | isVideoMagnetUriValid, |
148 | isVideoStateValid, | 147 | isVideoStateValid, |
149 | isVideoViewsValid, | 148 | isVideoViewsValid, |
150 | isVideoRatingTypeValid, | 149 | isVideoRatingTypeValid, |
151 | isVideoFileExtnameValid, | 150 | isVideoFileExtnameValid, |
151 | isVideoFileMimeTypeValid, | ||
152 | isVideoDurationValid, | 152 | isVideoDurationValid, |
153 | isVideoTagValid, | 153 | isVideoTagValid, |
154 | isVideoPrivacyValid, | 154 | isVideoPrivacyValid, |
diff --git a/server/helpers/youtube-dl.ts b/server/helpers/youtube-dl.ts index 302b2e206..9e8ef90d8 100644 --- a/server/helpers/youtube-dl.ts +++ b/server/helpers/youtube-dl.ts | |||
@@ -7,6 +7,7 @@ import { ensureDir, remove, writeFile } from 'fs-extra' | |||
7 | import * as request from 'request' | 7 | import * as request from 'request' |
8 | import { createWriteStream } from 'fs' | 8 | import { createWriteStream } from 'fs' |
9 | import { CONFIG } from '@server/initializers/config' | 9 | import { CONFIG } from '@server/initializers/config' |
10 | import { HttpStatusCode } from '../../shared/core-utils/miscs/http-error-codes' | ||
10 | 11 | ||
11 | export type YoutubeDLInfo = { | 12 | export type YoutubeDLInfo = { |
12 | name?: string | 13 | name?: string |
@@ -154,7 +155,7 @@ async function updateYoutubeDLBinary () { | |||
154 | return res() | 155 | return res() |
155 | } | 156 | } |
156 | 157 | ||
157 | if (result.statusCode !== 302) { | 158 | if (result.statusCode !== HttpStatusCode.FOUND_302) { |
158 | logger.error('youtube-dl update error: did not get redirect for the latest version link. Status %d', result.statusCode) | 159 | logger.error('youtube-dl update error: did not get redirect for the latest version link. Status %d', result.statusCode) |
159 | return res() | 160 | return res() |
160 | } | 161 | } |
@@ -164,7 +165,7 @@ async function updateYoutubeDLBinary () { | |||
164 | const newVersion = /yt-dl\.org\/downloads\/(\d{4}\.\d\d\.\d\d(\.\d)?)\/youtube-dl/.exec(url)[1] | 165 | const newVersion = /yt-dl\.org\/downloads\/(\d{4}\.\d\d\.\d\d(\.\d)?)\/youtube-dl/.exec(url)[1] |
165 | 166 | ||
166 | downloadFile.on('response', result => { | 167 | downloadFile.on('response', result => { |
167 | if (result.statusCode !== 200) { | 168 | if (result.statusCode !== HttpStatusCode.OK_200) { |
168 | logger.error('Cannot update youtube-dl: new version response is not 200, it\'s %d.', result.statusCode) | 169 | logger.error('Cannot update youtube-dl: new version response is not 200, it\'s %d.', result.statusCode) |
169 | return res() | 170 | return res() |
170 | } | 171 | } |