]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/custom-validators/misc.ts
f72513c1c643cc193baa4f463d22e718b4145fbc
[github/Chocobozzz/PeerTube.git] / server / helpers / custom-validators / misc.ts
1 import 'multer'
2 import * as 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 toIntOrNull (value: string) {
49 if (value === 'null') return null
50
51 return validator.toInt(value)
52 }
53
54 function toValueOrNull (value: string) {
55 if (value === 'null') return null
56
57 return value
58 }
59
60 function toArray (value: any) {
61 if (value && isArray(value) === false) return [ value ]
62
63 return value
64 }
65
66 function toIntArray (value: any) {
67 if (!value) return []
68 if (isArray(value) === false) return [ validator.toInt(value) ]
69
70 return value.map(v => validator.toInt(v))
71 }
72
73 function isFileValid (
74 files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
75 mimeTypeRegex: string,
76 field: string,
77 maxSize: number | null,
78 optional = false
79 ) {
80 // Should have files
81 if (!files) return optional
82 if (isArray(files)) return optional
83
84 // Should have a file
85 const fileArray = files[ field ]
86 if (!fileArray || fileArray.length === 0) {
87 return optional
88 }
89
90 // The file should exist
91 const file = fileArray[ 0 ]
92 if (!file || !file.originalname) return false
93
94 // Check size
95 if ((maxSize !== null) && file.size > maxSize) return false
96
97 return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
98 }
99
100 // ---------------------------------------------------------------------------
101
102 export {
103 exists,
104 isArrayOf,
105 isNotEmptyIntArray,
106 isArray,
107 isIdValid,
108 isSafePath,
109 isUUIDValid,
110 isIdOrUUIDValid,
111 isDateValid,
112 toValueOrNull,
113 isBooleanValid,
114 toIntOrNull,
115 toArray,
116 toIntArray,
117 isFileValid
118 }