mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 08:19:52 +03:00
formatting
This commit is contained in:
@@ -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
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user