formatting

This commit is contained in:
proddy
2024-04-21 15:10:22 +02:00
parent befa487482
commit ac39a46442
100 changed files with 2778 additions and 798 deletions

View File

@@ -6,15 +6,27 @@ import { IP_ADDRESS_VALIDATOR } from './shared';
export const createAPSettingsValidator = (apSettings: APSettingsType) =>
new Schema({
provision_mode: { required: true, message: 'Please provide a provision mode' },
provision_mode: {
required: true,
message: 'Please provide a provision mode'
},
...(isAPEnabled(apSettings) && {
ssid: [
{ required: true, message: 'Please provide an SSID' },
{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }
{
type: 'string',
max: 32,
message: 'SSID must be 32 characters or less'
}
],
password: [
{ required: true, message: 'Please provide an access point password' },
{ type: 'string', min: 8, max: 64, message: 'Password must be 8-64 characters' }
{
type: 'string',
min: 8,
max: 64,
message: 'Password must be 8-64 characters'
}
],
channel: [
{ required: true, message: 'Please provide a network channel' },
@@ -22,10 +34,24 @@ export const createAPSettingsValidator = (apSettings: APSettingsType) =>
],
max_clients: [
{ required: true, message: 'Please specify a value for max clients' },
{ type: 'number', min: 1, max: 9, message: 'Max clients must be between 1 and 9' }
{
type: 'number',
min: 1,
max: 9,
message: 'Max clients must be between 1 and 9'
}
],
local_ip: [{ required: true, message: 'Local IP address is required' }, IP_ADDRESS_VALIDATOR],
gateway_ip: [{ required: true, message: 'Gateway IP address is required' }, IP_ADDRESS_VALIDATOR],
subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR]
local_ip: [
{ required: true, message: 'Local IP address is required' },
IP_ADDRESS_VALIDATOR
],
gateway_ip: [
{ required: true, message: 'Gateway IP address is required' },
IP_ADDRESS_VALIDATOR
],
subnet_mask: [
{ required: true, message: 'Subnet mask is required' },
IP_ADDRESS_VALIDATOR
]
})
});

View File

@@ -6,7 +6,10 @@ import { IP_OR_HOSTNAME_VALIDATOR } from './shared';
export const createMqttSettingsValidator = (mqttSettings: MqttSettingsType) =>
new Schema({
...(mqttSettings.enabled && {
host: [{ required: true, message: 'Host is required' }, IP_OR_HOSTNAME_VALIDATOR],
host: [
{ required: true, message: 'Host is required' },
IP_OR_HOSTNAME_VALIDATOR
],
base: { required: true, message: 'Base is required' },
port: [
{ required: true, message: 'Port is required' },
@@ -14,11 +17,21 @@ export const createMqttSettingsValidator = (mqttSettings: MqttSettingsType) =>
],
keep_alive: [
{ required: true, message: 'Keep alive is required' },
{ type: 'number', min: 1, max: 86400, message: 'Keep alive must be between 1 and 86400' }
{
type: 'number',
min: 1,
max: 86400,
message: 'Keep alive must be between 1 and 86400'
}
],
publish_time_heartbeat: [
{ required: true, message: 'Heartbeat is required' },
{ type: 'number', min: 10, max: 86400, message: 'Heartbeat must be between 10 and 86400' }
{
type: 'number',
min: 10,
max: 86400,
message: 'Heartbeat must be between 10 and 86400'
}
]
})
});

View File

@@ -3,16 +3,42 @@ import type { NetworkSettingsType } from 'types';
import { HOSTNAME_VALIDATOR, IP_ADDRESS_VALIDATOR } from './shared';
export const createNetworkSettingsValidator = (networkSettings: NetworkSettingsType) =>
export const createNetworkSettingsValidator = (
networkSettings: NetworkSettingsType
) =>
new Schema({
ssid: [{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }],
bssid: [{ type: 'string', max: 17, message: 'BSSID must be 17 characters or empty' }],
password: { type: 'string', max: 64, message: 'Password must be 64 characters or less' },
hostname: [{ required: true, message: 'Hostname is required' }, HOSTNAME_VALIDATOR],
ssid: [
{ type: 'string', max: 32, message: 'SSID must be 32 characters or less' }
],
bssid: [
{
type: 'string',
max: 17,
message: 'BSSID must be 17 characters or empty'
}
],
password: {
type: 'string',
max: 64,
message: 'Password must be 64 characters or less'
},
hostname: [
{ required: true, message: 'Hostname is required' },
HOSTNAME_VALIDATOR
],
...(networkSettings.static_ip_config && {
local_ip: [{ required: true, message: 'Local IP is required' }, IP_ADDRESS_VALIDATOR],
gateway_ip: [{ required: true, message: 'Gateway IP is required' }, IP_ADDRESS_VALIDATOR],
subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR],
local_ip: [
{ required: true, message: 'Local IP is required' },
IP_ADDRESS_VALIDATOR
],
gateway_ip: [
{ required: true, message: 'Gateway IP is required' },
IP_ADDRESS_VALIDATOR
],
subnet_mask: [
{ required: true, message: 'Subnet mask is required' },
IP_ADDRESS_VALIDATOR
],
dns_ip_1: IP_ADDRESS_VALIDATOR,
dns_ip_2: IP_ADDRESS_VALIDATOR
})

View File

@@ -3,7 +3,10 @@ import Schema from 'async-validator';
import { IP_OR_HOSTNAME_VALIDATOR } from './shared';
export const NTP_SETTINGS_VALIDATOR = new Schema({
server: [{ required: true, message: 'Server is required' }, IP_OR_HOSTNAME_VALIDATOR],
server: [
{ required: true, message: 'Server is required' },
IP_OR_HOSTNAME_VALIDATOR
],
tz_label: {
required: true,
message: 'Time zone is required'

View File

@@ -5,12 +5,21 @@ import type { UserType } from 'types';
export const SECURITY_SETTINGS_VALIDATOR = new Schema({
jwt_secret: [
{ required: true, message: 'JWT secret is required' },
{ type: 'string', min: 1, max: 64, message: 'JWT secret must be between 1 and 64 characters' }
{
type: 'string',
min: 1,
max: 64,
message: 'JWT secret must be between 1 and 64 characters'
}
]
});
export const createUniqueUsernameValidator = (users: UserType[]) => ({
validator(rule: InternalRuleItem, username: string, callback: (error?: string) => void) {
validator(
rule: InternalRuleItem,
username: string,
callback: (error?: string) => void
) {
if (username && users.find((u) => u.username === username)) {
callback('Username already in use');
} else {
@@ -32,6 +41,11 @@ export const createUserValidator = (users: UserType[], creating: boolean) =>
],
password: [
{ required: true, message: 'Please provide a password' },
{ type: 'string', min: 1, max: 64, message: 'Password must be 1-64 characters' }
{
type: 'string',
min: 1,
max: 64,
message: 'Password must be 1-64 characters'
}
]
});

View File

@@ -7,13 +7,17 @@ export const validate = <T extends object>(
options?: ValidateOption
): Promise<T> =>
new Promise((resolve, reject) => {
void validator.validate(source, options ? options : {}, (errors, fieldErrors) => {
if (errors) {
reject(fieldErrors);
} else {
resolve(source as T);
void validator.validate(
source,
options ? options : {},
(errors, fieldErrors) => {
if (errors) {
reject(fieldErrors);
} else {
resolve(source as T);
}
}
});
);
});
// updated to support both IPv4 and IPv6
@@ -23,7 +27,11 @@ const IP_ADDRESS_REGEXP =
const isValidIpAddress = (value: string) => IP_ADDRESS_REGEXP.test(value);
export const IP_ADDRESS_VALIDATOR = {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) {
validator(
rule: InternalRuleItem,
value: string,
callback: (error?: string) => void
) {
if (value && !isValidIpAddress(value)) {
callback('Must be an IP address');
} else {
@@ -36,10 +44,15 @@ const HOSTNAME_LENGTH_REGEXP = /^.{0,200}$/;
const HOSTNAME_PATTERN_REGEXP =
/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/;
const isValidHostname = (value: string) => HOSTNAME_LENGTH_REGEXP.test(value) && HOSTNAME_PATTERN_REGEXP.test(value);
const isValidHostname = (value: string) =>
HOSTNAME_LENGTH_REGEXP.test(value) && HOSTNAME_PATTERN_REGEXP.test(value);
export const HOSTNAME_VALIDATOR = {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) {
validator(
rule: InternalRuleItem,
value: string,
callback: (error?: string) => void
) {
if (value && !isValidHostname(value)) {
callback('Must be a valid hostname');
} else {
@@ -49,7 +62,11 @@ export const HOSTNAME_VALIDATOR = {
};
export const IP_OR_HOSTNAME_VALIDATOR = {
validator(rule: InternalRuleItem, value: string, callback: (error?: string) => void) {
validator(
rule: InternalRuleItem,
value: string,
callback: (error?: string) => void
) {
if (value && !(isValidIpAddress(value) || isValidHostname(value))) {
callback('Must be a valid IP address or hostname');
} else {

View File

@@ -3,10 +3,20 @@ import Schema from 'async-validator';
export const OTA_SETTINGS_VALIDATOR = new Schema({
port: [
{ required: true, message: 'Port is required' },
{ type: 'number', min: 1025, max: 65535, message: 'Port must be between 1025 and 65535' }
{
type: 'number',
min: 1025,
max: 65535,
message: 'Port must be between 1025 and 65535'
}
],
password: [
{ required: true, message: 'Password is required' },
{ type: 'string', min: 1, max: 64, message: 'Password must be between 1 and 64 characters' }
{
type: 'string',
min: 1,
max: 64,
message: 'Password must be between 1 and 64 characters'
}
]
});