diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 9118e9d9..90b41686 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.12.12", + "version": "2.12.13", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", @@ -70,4 +70,4 @@ "build": "tsc", "build:watch": "tsc --watch" } -} +} \ No newline at end of file diff --git a/packages/hydrooj/src/lib/validator.ts b/packages/hydrooj/src/lib/validator.ts index ebd154cd..a84c8ff9 100644 --- a/packages/hydrooj/src/lib/validator.ts +++ b/packages/hydrooj/src/lib/validator.ts @@ -3,7 +3,7 @@ import { ValidationError } from '../error'; const RE_UID = /^-?\d+$/i; const RE_PID = /^[a-zA-Z]+[a-zA-Z0-9]*$/i; -const RE_UNAME = /[^\s\u3000](.{,254}[^\s\u3000])?$/i; +const RE_UNAME = /^.{3,254}$/i; const RE_ROLE = /^[_0-9A-Za-z]{1,256}$/i; const RE_MAIL = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+$/i; diff --git a/packages/hydrooj/src/utils.ts b/packages/hydrooj/src/utils.ts index 8f16b86e..e18ff292 100644 --- a/packages/hydrooj/src/utils.ts +++ b/packages/hydrooj/src/utils.ts @@ -152,7 +152,7 @@ export function parseTimeMS(str: string) { export function parseMemoryMB(str: string) { const match = MEMORY_RE.exec(str); if (!match) throw new Error(`${str} error parsing memory`); - return Math.floor(parseFloat(match[1]) * MEMORY_UNITS[match[2]]); + return Math.ceil(parseFloat(match[1]) * MEMORY_UNITS[match[2]]); } export function isClass(obj: any, strict = false) { diff --git a/packages/hydrooj/test/lib.validator.spec.ts b/packages/hydrooj/test/lib.validator.spec.ts new file mode 100644 index 00000000..5c514b43 --- /dev/null +++ b/packages/hydrooj/test/lib.validator.spec.ts @@ -0,0 +1,103 @@ +import 'hydrooj'; +import * as validator from 'hydrooj/src/lib/validator'; + +describe('Validator', () => { + test('uid', () => { + expect(validator.isUid('123')).toBeTruthy(); + expect(validator.isUid('123')).toBeTruthy(); + expect(validator.isUid('-456')).toBeTruthy(); + expect(validator.isUid('')).toBeFalsy(); + expect(validator.isUid('1.23')).toBeFalsy(); + expect(validator.isUid('xyz')).toBeFalsy(); + }); + + test('uname', () => { + expect(validator.isUname('twd2')).toBeTruthy(); + expect(validator.isUname('123twd3')).toBeTruthy(); + expect(validator.isUname('$%1234')).toBeTruthy(); + expect(validator.isUname('12<> { + expect(validator.isPassword('123twd3')).toBeTruthy(); + expect(validator.isPassword('12<> { + expect(validator.isEmail('ex@example.com')).toBeTruthy(); + expect(validator.isEmail('1+e-x@example.com')).toBeTruthy(); + expect(validator.isEmail('example.net@example.com')).toBeTruthy(); + expect(validator.isEmail('example:net@example.com')).toBeFalsy(); + expect(validator.isEmail('ex@examplecom')).toBeFalsy(); + expect(validator.isEmail('example.com')).toBeFalsy(); + expect(validator.isEmail('examplecom')).toBeFalsy(); + expect(validator.isEmail('1+e=x@example.com')).toBeFalsy(); + }); + + /* + test('domainId', () => { + expect(validator.is_domain_id('my_domain_1')).toBeTruthy(); + expect(validator.is_domain_id('My_Domain')).toBeTruthy(); + expect(validator.is_domain_id('MyDomain')).toBeTruthy(); + expect(validator.is_domain_id('myDomain')).toBeTruthy(); + expect(validator.is_domain_id('twd2')).toBeTruthy(); + expect(validator.is_domain_id('twd' * 10)).toBeTruthy(); + expect(validator.is_domain_id('C:\\a.txt')).toBeFalsy(); + expect(validator.is_domain_id('/etc/hosts')).toBeFalsy(); + expect(validator.is_domain_id('')).toBeFalsy(); + expect(validator.is_domain_id(' twd4')).toBeFalsy(); + expect(validator.is_domain_id('twd4\u3000')).toBeFalsy(); + expect(validator.is_domain_id('\ntwd4')).toBeFalsy(); + expect(validator.is_domain_id('22domain')).toBeFalsy(); + expect(validator.is_domain_id('22-Domain')).toBeFalsy(); + expect(validator.is_domain_id('My-Domain')).toBeFalsy(); + expect(validator.is_domain_id('dom')).toBeFalsy(); + expect(validator.is_domain_id('twd' * 500)).toBeFalsy(); + expect(validator.is_domain_id('twd\r\n2')).toBeFalsy(); + expect(validator.is_domain_id('$domain')).toBeFalsy(); + expect(validator.is_domain_id('12<> { + expect(validator.isRole('my_domain_1')).toBeTruthy(); + expect(validator.isRole('My_Domain')).toBeTruthy(); + expect(validator.isRole('MyDomain')).toBeTruthy(); + expect(validator.isRole('myDomain')).toBeTruthy(); + expect(validator.isRole('twd2')).toBeTruthy(); + expect(validator.isRole('twd'.repeat(10))).toBeTruthy(); + expect(validator.isRole('r0le')).toBeTruthy(); + expect(validator.isRole('1role')).toBeTruthy(); + expect(validator.isRole('C:\\a.txt')).toBeFalsy(); + expect(validator.isRole('/etc/hosts')).toBeFalsy(); + expect(validator.isRole('')).toBeFalsy(); + expect(validator.isRole(' twd4')).toBeFalsy(); + expect(validator.isRole('twd4\u3000')).toBeFalsy(); + expect(validator.isRole('\ntwd4')).toBeFalsy(); + expect(validator.isRole('My-Role')).toBeFalsy(); + expect(validator.isRole('twd'.repeat(90))).toBeFalsy(); + expect(validator.isRole('twd\r\n2')).toBeFalsy(); + expect(validator.isRole('$role')).toBeFalsy(); + expect(validator.isRole('role.admin')).toBeFalsy(); + expect(validator.isRole('12<> { + expect(validator.isContent('dummy_name')).toBeTruthy(); + expect(validator.isContent('x'.repeat(300))).toBeTruthy(); + expect(validator.isContent('c')).toBeTruthy(); + expect(validator.isContent('')).toBeFalsy(); + expect(validator.isContent('x'.repeat(700000))).toBeFalsy(); + }); +}); diff --git a/packages/hydrooj/test/utils.spec.ts b/packages/hydrooj/test/utils.spec.ts new file mode 100644 index 00000000..adce6362 --- /dev/null +++ b/packages/hydrooj/test/utils.spec.ts @@ -0,0 +1,80 @@ +import 'hydrooj'; +import * as utils from 'hydrooj/src/utils'; + +describe('Utils', () => { + test('Array.isDiff', () => { + expect(Array.isDiff([1], [2])).toBeTruthy(); + expect(Array.isDiff([1, 2, 3], [1, 2])).toBeTruthy(); + expect(Array.isDiff(['1'], [1])).toBeTruthy(); + expect(Array.isDiff(['2'], [])).toBeTruthy(); + expect(Array.isDiff([1], [1])).toBeFalsy(); + expect(Array.isDiff([1, 2], [2, 1])).toBeFalsy(); + }); + + test('Date.format', () => { + const date = new Date('1926-08-17 00:00:00'); + expect(date.format()).toStrictEqual('1926-08-17 00:00:00'); + expect(date.format('%Y-%m+%d')).toStrictEqual('1926-08+17'); + }); + + test('Math.sum', () => { + expect(Math.sum(1, 2, 3)).toStrictEqual(6); + expect(Math.sum([1, 2], 3)).toStrictEqual(6); + expect(Math.sum(-1, 2, 3)).toStrictEqual(4); + expect(Math.sum()).toStrictEqual(0); + }); + + test('Set.isSuperset', () => { + const setA = new Set([1, 2, 3]); + const setB = new Set([1]); + const setC = new Set([2]); + const setD = new Set(); + expect(Set.isSuperset(setA, setA)).toBeTruthy(); + expect(Set.isSuperset(setA, setB)).toBeTruthy(); + expect(Set.isSuperset(setB, setA)).toBeFalsy(); + expect(Set.isSuperset(setB, setC)).toBeFalsy(); + expect(Set.isSuperset(setA, setD)).toBeTruthy(); + }); + + test('Set.union', () => { + const setA = new Set([1, 2, 3]); + const setB = new Set([2]); + const setC = new Set([4]); + const setD = new Set([1, 2, 3, 4]); + expect(Set.union(setA, setB)).toStrictEqual(setA); + expect(Set.union(setA, setC)).toStrictEqual(setD); + }); + + test('Set.intersection', () => { + const setA = new Set([1, 2, 3]); + const setB = new Set([2]); + const setC = new Set([4]); + const setD = new Set(); + expect(Set.intersection(setA, setB)).toStrictEqual(setB); + expect(Set.intersection(setA, setC)).toStrictEqual(setD); + expect(Set.intersection(setA, setD)).toStrictEqual(setD); + }); + + test('parseTimeMs', () => { + expect(utils.parseTimeMS('1000ms')).toStrictEqual(1000); + expect(utils.parseTimeMS('1s')).toStrictEqual(1000); + expect(utils.parseTimeMS('1.5s')).toStrictEqual(1500); + expect(utils.parseTimeMS('13000us')).toStrictEqual(13); + }); + + test('parseMemoryMB', () => { + expect(utils.parseMemoryMB('1mb')).toStrictEqual(1); + expect(utils.parseMemoryMB('10kb')).toStrictEqual(1); + expect(utils.parseMemoryMB('0.2g')).toStrictEqual(205); + }); + + test('isClass', () => { + const classA = class { }; + const classB = function () { }; + classB.prototype.get = function () { return 1 }; + const funcA = function () { }; + expect(utils.isClass(classA)).toBeTruthy(); + expect(utils.isClass(classB)).toBeTruthy(); + expect(utils.isClass(funcA)).toBeFalsy(); + }) +});