]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/misc.ts
Check live duration and size
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / misc.ts
1 import 'multer'
2 import validator from 'validator'
3 import { sep } from 'path'
4
5 function exists (value: any) {
6 return value !== undefined && value !== null
7 }
8
9 function isSafePath (p: string) {
10 return exists(p) &&
11 (p + '').split(sep).every(part => {
12 return [ '..' ].includes(part) === false
13 })
14 }
15
16 function isArray (value: any) {
17 return Array.isArray(value)
18 }
19
20 function isNotEmptyIntArray (value: any) {
21 return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
22 }
23
24 function isArrayOf (value: any, validator: (value: any) => boolean) {
25 return isArray(value) && value.every(v => validator(v))
26 }
27
28 function isDateValid (value: string) {
29 return exists(value) && validator.isISO8601(value)
30 }
31
32 function isIdValid (value: string) {
33 return exists(value) && validator.isInt('' + value)
34 }
35
36 function isUUIDValid (value: string) {
37 return exists(value) && validator.isUUID('' + value, 4)
38 }
39
40 function isIdOrUUIDValid (value: string) {
41 return isIdValid(value) || isUUIDValid(value)
42 }
43
44 function isBooleanValid (value: any) {
45 return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
46 }
47
48 function isIntOrNull (value: any) {
49 return value === null || validator.isInt('' + value)
50 }
51
52 function toIntOrNull (value: string) {
53 const v = toValueOrNull(value)
54
55 if (v === null || v === undefined) return v
56 if (typeof v === 'number') return v
57
58 return validator.toInt('' + v)
59 }
60
61 function toBooleanOrNull (value: any) {
62 const v = toValueOrNull(value)
63
64 if (v === null || v === undefined) return v
65 if (typeof v === 'boolean') return v
66
67 return validator.toBoolean('' + v)
68 }
69
70 function toValueOrNull (value: string) {
71 if (value === 'null') return null
72
73 return value
74 }
75
76 function toArray (value: any) {
77 if (value && isArray(value) === false) return [ value ]
78
79 return value
80 }
81
82 function toIntArray (value: any) {
83 if (!value) return []
84 if (isArray(value) === false) return [ validator.toInt(value) ]
85
86 return value.map(v => validator.toInt(v))
87 }
88
89 function isFileValid (
90 files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
91 mimeTypeRegex: string,
92 field: string,
93 maxSize: number | null,
94 optional = false
95 ) {
96 // Should have files
97 if (!files) return optional
98 if (isArray(files)) return optional
99
100 // Should have a file
101 const fileArray = files[field]
102 if (!fileArray || fileArray.length === 0) {
103 return optional
104 }
105
106 // The file should exist
107 const file = fileArray[0]
108 if (!file || !file.originalname) return false
109
110 // Check size
111 if ((maxSize !== null) && file.size > maxSize) return false
112
113 return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
114 }
115
116 // ---------------------------------------------------------------------------
117
118 export {
119 exists,
120 isArrayOf,
121 isNotEmptyIntArray,
122 isArray,
123 isIntOrNull,
124 isIdValid,
125 isSafePath,
126 isUUIDValid,
127 isIdOrUUIDValid,
128 isDateValid,
129 toValueOrNull,
130 toBooleanOrNull,
131 isBooleanValid,
132 toIntOrNull,
133 toArray,
134 toIntArray,
135 isFileValid
136 }