WIP plugins: add ability to register plugins
[oweals/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 }