2017-12-19 17:00:31 +00:00
|
|
|
/*
|
2020-04-17 13:19:33 +00:00
|
|
|
Copyright 2016-2020 Balena Ltd.
|
2016-01-04 03:58:51 +00:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
2017-12-19 17:00:31 +00:00
|
|
|
*/
|
2016-01-04 03:58:51 +00:00
|
|
|
|
2017-12-19 17:00:31 +00:00
|
|
|
import validEmail = require('@resin.io/valid-email');
|
2020-04-17 13:19:33 +00:00
|
|
|
import { ExpectedError } from '../errors';
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2019-04-24 09:06:53 +00:00
|
|
|
const APPNAME_REGEX = new RegExp(/^[a-zA-Z0-9_-]+$/);
|
|
|
|
// An regex to detect an IP address, from https://www.regular-expressions.info/ip.html
|
|
|
|
const IP_REGEX = new RegExp(
|
|
|
|
/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/,
|
|
|
|
);
|
2019-05-01 07:50:27 +00:00
|
|
|
const DOTLOCAL_REGEX = new RegExp(/^([a-zA-Z0-9-]+\.)+local$/);
|
2019-04-24 17:45:19 +00:00
|
|
|
const UUID_REGEX = new RegExp(/^[0-9a-f]+$/);
|
2019-04-24 09:06:53 +00:00
|
|
|
|
2017-12-20 21:46:01 +00:00
|
|
|
export function validateEmail(input: string) {
|
2017-12-19 17:00:31 +00:00
|
|
|
if (!validEmail(input)) {
|
|
|
|
return 'Email is not valid';
|
|
|
|
}
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2017-12-19 17:00:31 +00:00
|
|
|
return true;
|
2018-01-04 14:07:55 +00:00
|
|
|
}
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2017-12-20 21:46:01 +00:00
|
|
|
export function validatePassword(input: string) {
|
2017-12-19 17:00:31 +00:00
|
|
|
if (input.length < 8) {
|
|
|
|
return 'Password should be 8 characters long';
|
|
|
|
}
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2017-12-19 17:00:31 +00:00
|
|
|
return true;
|
2018-01-04 14:07:55 +00:00
|
|
|
}
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2017-12-20 21:46:01 +00:00
|
|
|
export function validateApplicationName(input: string) {
|
2017-12-19 17:00:31 +00:00
|
|
|
if (input.length < 4) {
|
|
|
|
return 'The application name should be at least 4 characters';
|
|
|
|
}
|
2015-10-21 13:37:25 +00:00
|
|
|
|
2019-04-24 09:06:53 +00:00
|
|
|
return APPNAME_REGEX.test(input);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function validateIPAddress(input: string): boolean {
|
|
|
|
return IP_REGEX.test(input);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function validateDotLocalUrl(input: string): boolean {
|
|
|
|
return DOTLOCAL_REGEX.test(input);
|
2018-01-04 14:07:55 +00:00
|
|
|
}
|
2019-04-24 17:45:19 +00:00
|
|
|
|
2020-09-09 12:20:57 +00:00
|
|
|
export function validateLocalHostnameOrIp(input: string): boolean {
|
|
|
|
return validateIPAddress(input) || validateDotLocalUrl(input);
|
|
|
|
}
|
|
|
|
|
2019-04-24 17:45:19 +00:00
|
|
|
export function validateLongUuid(input: string): boolean {
|
2020-05-26 09:17:30 +00:00
|
|
|
if (input.length !== 32 && input.length !== 62) {
|
2019-04-24 17:45:19 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return UUID_REGEX.test(input);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function validateShortUuid(input: string): boolean {
|
|
|
|
if (input.length !== 7) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return UUID_REGEX.test(input);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function validateUuid(input: string): boolean {
|
|
|
|
return validateLongUuid(input) || validateShortUuid(input);
|
|
|
|
}
|
2020-04-17 13:19:33 +00:00
|
|
|
|
2020-08-25 11:45:39 +00:00
|
|
|
export function looksLikeInteger(input: string) {
|
2020-04-17 13:19:33 +00:00
|
|
|
// Allow only digits, no leading 0
|
2020-08-25 11:45:39 +00:00
|
|
|
return /^(?:0|[1-9][0-9]*)$/.test(input);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseAsInteger(input: string, paramName?: string) {
|
|
|
|
if (!looksLikeInteger(input)) {
|
2020-04-17 13:19:33 +00:00
|
|
|
const message =
|
|
|
|
paramName == null
|
|
|
|
? 'The parameter must be an integer.'
|
|
|
|
: `The parameter '${paramName}' must be an integer.`;
|
|
|
|
|
|
|
|
throw new ExpectedError(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Number(input);
|
|
|
|
}
|
2020-05-11 15:40:50 +00:00
|
|
|
|
2020-05-26 09:17:30 +00:00
|
|
|
export function tryAsInteger(input: string): number | string {
|
2020-05-11 15:40:50 +00:00
|
|
|
try {
|
2020-05-26 09:17:30 +00:00
|
|
|
return parseAsInteger(input);
|
2020-05-11 15:40:50 +00:00
|
|
|
} catch {
|
|
|
|
return input;
|
|
|
|
}
|
|
|
|
}
|
2020-09-09 12:20:57 +00:00
|
|
|
|
|
|
|
export function parseAsLocalHostnameOrIp(input: string, paramName?: string) {
|
|
|
|
if (input && !validateLocalHostnameOrIp(input)) {
|
|
|
|
const message =
|
|
|
|
paramName == null
|
|
|
|
? 'The parameter must be a local hostname or IP address.'
|
|
|
|
: `The parameter '${paramName}' must be a local hostname or IP address.`;
|
|
|
|
|
|
|
|
throw new ExpectedError(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
return input;
|
|
|
|
}
|
2020-12-18 15:56:47 +00:00
|
|
|
|
|
|
|
export function looksLikeAppSlug(input: string) {
|
|
|
|
// One or more non whitespace chars, /, 4 or more non whitespace chars
|
|
|
|
return /[\S]+\/[\S]{4,}/.test(input);
|
|
|
|
}
|