diff options
Diffstat (limited to 'server/helpers/core-utils.ts')
-rw-r--r-- | server/helpers/core-utils.ts | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/server/helpers/core-utils.ts b/server/helpers/core-utils.ts index 00bc0bdda..f38b82d97 100644 --- a/server/helpers/core-utils.ts +++ b/server/helpers/core-utils.ts | |||
@@ -5,12 +5,31 @@ | |||
5 | 5 | ||
6 | import * as bcrypt from 'bcrypt' | 6 | import * as bcrypt from 'bcrypt' |
7 | import * as createTorrent from 'create-torrent' | 7 | import * as createTorrent from 'create-torrent' |
8 | import { createHash, pseudoRandomBytes } from 'crypto' | 8 | import { createHash, HexBase64Latin1Encoding, pseudoRandomBytes } from 'crypto' |
9 | import { isAbsolute, join } from 'path' | 9 | import { isAbsolute, join } from 'path' |
10 | import * as pem from 'pem' | 10 | import * as pem from 'pem' |
11 | import { URL } from 'url' | 11 | import { URL } from 'url' |
12 | import { truncate } from 'lodash' | 12 | import { truncate } from 'lodash' |
13 | import { exec } from 'child_process' | 13 | import { exec } from 'child_process' |
14 | import { isArray } from './custom-validators/misc' | ||
15 | |||
16 | const objectConverter = (oldObject: any, keyConverter: (e: string) => string, valueConverter: (e: any) => any) => { | ||
17 | if (!oldObject || typeof oldObject !== 'object') { | ||
18 | return valueConverter(oldObject) | ||
19 | } | ||
20 | |||
21 | if (isArray(oldObject)) { | ||
22 | return oldObject.map(e => objectConverter(e, keyConverter, valueConverter)) | ||
23 | } | ||
24 | |||
25 | const newObject = {} | ||
26 | Object.keys(oldObject).forEach(oldKey => { | ||
27 | const newKey = keyConverter(oldKey) | ||
28 | newObject[ newKey ] = objectConverter(oldObject[ oldKey ], keyConverter, valueConverter) | ||
29 | }) | ||
30 | |||
31 | return newObject | ||
32 | } | ||
14 | 33 | ||
15 | const timeTable = { | 34 | const timeTable = { |
16 | ms: 1, | 35 | ms: 1, |
@@ -21,6 +40,7 @@ const timeTable = { | |||
21 | week: 3600000 * 24 * 7, | 40 | week: 3600000 * 24 * 7, |
22 | month: 3600000 * 24 * 30 | 41 | month: 3600000 * 24 * 30 |
23 | } | 42 | } |
43 | |||
24 | export function parseDuration (duration: number | string): number { | 44 | export function parseDuration (duration: number | string): number { |
25 | if (typeof duration === 'number') return duration | 45 | if (typeof duration === 'number') return duration |
26 | 46 | ||
@@ -41,6 +61,53 @@ export function parseDuration (duration: number | string): number { | |||
41 | throw new Error('Duration could not be properly parsed') | 61 | throw new Error('Duration could not be properly parsed') |
42 | } | 62 | } |
43 | 63 | ||
64 | export function parseBytes (value: string | number): number { | ||
65 | if (typeof value === 'number') return value | ||
66 | |||
67 | const tgm = /^(\d+)\s*TB\s*(\d+)\s*GB\s*(\d+)\s*MB$/ | ||
68 | const tg = /^(\d+)\s*TB\s*(\d+)\s*GB$/ | ||
69 | const tm = /^(\d+)\s*TB\s*(\d+)\s*MB$/ | ||
70 | const gm = /^(\d+)\s*GB\s*(\d+)\s*MB$/ | ||
71 | const t = /^(\d+)\s*TB$/ | ||
72 | const g = /^(\d+)\s*GB$/ | ||
73 | const m = /^(\d+)\s*MB$/ | ||
74 | const b = /^(\d+)\s*B$/ | ||
75 | let match | ||
76 | |||
77 | if (value.match(tgm)) { | ||
78 | match = value.match(tgm) | ||
79 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024 | ||
80 | + parseInt(match[2], 10) * 1024 * 1024 * 1024 | ||
81 | + parseInt(match[3], 10) * 1024 * 1024 | ||
82 | } else if (value.match(tg)) { | ||
83 | match = value.match(tg) | ||
84 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024 | ||
85 | + parseInt(match[2], 10) * 1024 * 1024 * 1024 | ||
86 | } else if (value.match(tm)) { | ||
87 | match = value.match(tm) | ||
88 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024 | ||
89 | + parseInt(match[2], 10) * 1024 * 1024 | ||
90 | } else if (value.match(gm)) { | ||
91 | match = value.match(gm) | ||
92 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 | ||
93 | + parseInt(match[2], 10) * 1024 * 1024 | ||
94 | } else if (value.match(t)) { | ||
95 | match = value.match(t) | ||
96 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 * 1024 | ||
97 | } else if (value.match(g)) { | ||
98 | match = value.match(g) | ||
99 | return parseInt(match[1], 10) * 1024 * 1024 * 1024 | ||
100 | } else if (value.match(m)) { | ||
101 | match = value.match(m) | ||
102 | return parseInt(match[1], 10) * 1024 * 1024 | ||
103 | } else if (value.match(b)) { | ||
104 | match = value.match(b) | ||
105 | return parseInt(match[1], 10) * 1024 | ||
106 | } else { | ||
107 | return parseInt(value, 10) | ||
108 | } | ||
109 | } | ||
110 | |||
44 | function sanitizeUrl (url: string) { | 111 | function sanitizeUrl (url: string) { |
45 | const urlObject = new URL(url) | 112 | const urlObject = new URL(url) |
46 | 113 | ||
@@ -126,8 +193,12 @@ function peertubeTruncate (str: string, maxLength: number) { | |||
126 | return truncate(str, options) | 193 | return truncate(str, options) |
127 | } | 194 | } |
128 | 195 | ||
129 | function sha256 (str: string) { | 196 | function sha256 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') { |
130 | return createHash('sha256').update(str).digest('hex') | 197 | return createHash('sha256').update(str).digest(encoding) |
198 | } | ||
199 | |||
200 | function sha1 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') { | ||
201 | return createHash('sha1').update(str).digest(encoding) | ||
131 | } | 202 | } |
132 | 203 | ||
133 | function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { | 204 | function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { |
@@ -187,6 +258,7 @@ export { | |||
187 | isTestInstance, | 258 | isTestInstance, |
188 | isProdInstance, | 259 | isProdInstance, |
189 | 260 | ||
261 | objectConverter, | ||
190 | root, | 262 | root, |
191 | escapeHTML, | 263 | escapeHTML, |
192 | pageToStartAndCount, | 264 | pageToStartAndCount, |
@@ -194,7 +266,9 @@ export { | |||
194 | sanitizeHost, | 266 | sanitizeHost, |
195 | buildPath, | 267 | buildPath, |
196 | peertubeTruncate, | 268 | peertubeTruncate, |
269 | |||
197 | sha256, | 270 | sha256, |
271 | sha1, | ||
198 | 272 | ||
199 | promisify0, | 273 | promisify0, |
200 | promisify1, | 274 | promisify1, |