hardened WiFi-String stuff
This commit is contained in:
parent
956cc49e6f
commit
6574947a80
@ -102,7 +102,6 @@ uint32_t Checksum_EEPROM(uint8_t const *data, size_t len);
|
|||||||
void dumpEEPROM(uint16_t memoryAddress, uint16_t length);
|
void dumpEEPROM(uint16_t memoryAddress, uint16_t length);
|
||||||
void MovePersistencePage_EEPROM(boolean reset);
|
void MovePersistencePage_EEPROM(boolean reset);
|
||||||
uint32_t ConfigSanityCheck(bool autocorrect = false);
|
uint32_t ConfigSanityCheck(bool autocorrect = false);
|
||||||
bool validateWiFiString(char *string, size_t size);
|
|
||||||
void writeSequentialToEEPROM(uint16_t memoryAddress, uint16_t length);
|
void writeSequentialToEEPROM(uint16_t memoryAddress, uint16_t length);
|
||||||
void writeZeroToEEPROM(uint16_t memoryAddress, uint16_t length);
|
void writeZeroToEEPROM(uint16_t memoryAddress, uint16_t length);
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ typedef struct Globals_s
|
|||||||
tSystem_Status resumeStatus = sysStat_Startup; /**< Status to resume after rain mode */
|
tSystem_Status resumeStatus = sysStat_Startup; /**< Status to resume after rain mode */
|
||||||
char systemStatustxt[16] = ""; /**< Text representation of system status */
|
char systemStatustxt[16] = ""; /**< Text representation of system status */
|
||||||
EERequest_t requestEEAction = EE_IDLE; /**< EEPROM-related request */
|
EERequest_t requestEEAction = EE_IDLE; /**< EEPROM-related request */
|
||||||
char DeviceName[33]; /**< Device name */
|
char DeviceName[25]; /**< Device name */
|
||||||
char DeviceNameId[sizeof(DeviceName) + 8]; /**< Device name plus 8 chars chipID */
|
char DeviceNameId[sizeof(DeviceName) + 8]; /**< Device name plus 8 chars chipID */
|
||||||
char FlashVersion[10]; /**< Flash version */
|
char FlashVersion[10]; /**< Flash version */
|
||||||
uint16_t eePersistanceAdress; /**< EEPROM persistence address */
|
uint16_t eePersistanceAdress; /**< EEPROM persistence address */
|
||||||
|
36
Software/include/utilities.h
Normal file
36
Software/include/utilities.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef UTILITIES_H
|
||||||
|
#define UTILITIES_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Validates whether a given string contains only characters allowed in WiFi SSIDs and passwords.
|
||||||
|
*
|
||||||
|
* This function checks each character in the provided string to ensure
|
||||||
|
* that it contains only characters allowed in WiFi SSIDs and passwords.
|
||||||
|
* It considers characters from 'A' to 'Z', 'a' to 'z', '0' to '9', as well as
|
||||||
|
* the following special characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
|
||||||
|
*
|
||||||
|
* @param string Pointer to the string to be validated.
|
||||||
|
* @param size Size of the string including the null-terminator.
|
||||||
|
* @return true if the string contains only allowed characters or is NULL,
|
||||||
|
* false otherwise.
|
||||||
|
*/
|
||||||
|
bool validateWiFiString(char *string, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies a string to a buffer, replacing invalid WiFi SSID characters with a placeholder.
|
||||||
|
*
|
||||||
|
* This function checks each character in the provided input string to ensure
|
||||||
|
* that it contains only characters allowed in WiFi SSIDs and passwords. If a character
|
||||||
|
* is invalid, it replaces it with a placeholder character (e.g., '_').
|
||||||
|
* It considers characters from 'A' to 'Z', 'a' to 'z', '0' to '9', as well as
|
||||||
|
* the following special characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
|
||||||
|
*
|
||||||
|
* @param input Pointer to the input string to be validated and copied.
|
||||||
|
* @param buffer Pointer to the buffer where the output string will be copied.
|
||||||
|
* @param bufferSize Size of the buffer including the null-terminator.
|
||||||
|
*/
|
||||||
|
void sanitizeWiFiString(const char *input, char *buffer, size_t bufferSize);
|
||||||
|
|
||||||
|
#endif // UTILITIES_H
|
@ -9,6 +9,7 @@
|
|||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
// Instance of I2C_eeprom for EEPROM access
|
// Instance of I2C_eeprom for EEPROM access
|
||||||
I2C_eeprom ee(I2C_EE_ADDRESS, EEPROM_SIZE_BYTES);
|
I2C_eeprom ee(I2C_EE_ADDRESS, EEPROM_SIZE_BYTES);
|
||||||
@ -430,48 +431,6 @@ uint32_t ConfigSanityCheck(bool autocorrect)
|
|||||||
return setting_reset_bits;
|
return setting_reset_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Validates whether a given string contains only characters allowed in WiFi SSIDs and passwords.
|
|
||||||
*
|
|
||||||
* This function checks each character in the provided string to ensure
|
|
||||||
* that it contains only characters allowed in WiFi SSIDs and passwords.
|
|
||||||
* It considers characters from 'A' to 'Z', 'a' to 'z', '0' to '9', as well as
|
|
||||||
* the following special characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
|
|
||||||
*
|
|
||||||
* @param string Pointer to the string to be validated.
|
|
||||||
* @param size Size of the string including the null-terminator.
|
|
||||||
* @return true if the string contains only allowed characters or is NULL,
|
|
||||||
* false otherwise.
|
|
||||||
*/
|
|
||||||
bool validateWiFiString(char *string, size_t size)
|
|
||||||
{
|
|
||||||
if (string == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
{
|
|
||||||
char c = string[i];
|
|
||||||
if (c == '\0')
|
|
||||||
{
|
|
||||||
// Reached the end of the string, all characters were valid WiFi characters.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
|
|
||||||
(c >= '0' && c <= '9') || c == '!' || c == '"' || c == '#' ||
|
|
||||||
c == '$' || c == '%' || c == '&' || c == '\'' || c == '(' ||
|
|
||||||
c == ')' || c == '*' || c == '+' || c == ',' || c == '-' ||
|
|
||||||
c == '.' || c == '/' || c == ':' || c == ';' || c == '<' ||
|
|
||||||
c == '=' || c == '>' || c == '?' || c == '@' || c == '[' ||
|
|
||||||
c == '\\' || c == ']' || c == '^' || c == '_' || c == '`' ||
|
|
||||||
c == '{' || c == '|' || c == '}' || c == '~'))
|
|
||||||
{
|
|
||||||
// Found a character that is not a valid WiFi character.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If the loop completes without finding a null terminator, the string is invalid.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write sequential numbers to a portion of EEPROM.
|
* @brief Write sequential numbers to a portion of EEPROM.
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "dtc.h"
|
#include "dtc.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "utilities.h"
|
||||||
#if defined(FEATURE_ENABLE_LORA) || defined(FEATURE_ENABLE_UARTLORA)
|
#if defined(FEATURE_ENABLE_LORA) || defined(FEATURE_ENABLE_UARTLORA)
|
||||||
#include "lora_net.h"
|
#include "lora_net.h"
|
||||||
#endif
|
#endif
|
||||||
@ -571,6 +572,7 @@ void wifiMaintainConnectionTicker_callback()
|
|||||||
*/
|
*/
|
||||||
void toggleWiFiAP(bool shutdown)
|
void toggleWiFiAP(bool shutdown)
|
||||||
{
|
{
|
||||||
|
char buffer[33];
|
||||||
// Check if WiFi is currently active
|
// Check if WiFi is currently active
|
||||||
if (WiFi.getMode() != WIFI_OFF)
|
if (WiFi.getMode() != WIFI_OFF)
|
||||||
{
|
{
|
||||||
@ -588,7 +590,8 @@ void toggleWiFiAP(bool shutdown)
|
|||||||
// Start WiFi in Access Point (AP) mode
|
// Start WiFi in Access Point (AP) mode
|
||||||
WiFi.mode(WIFI_AP);
|
WiFi.mode(WIFI_AP);
|
||||||
WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
|
WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
|
||||||
WiFi.softAP(globals.DeviceNameId, QUOTE(WIFI_AP_PASSWORD));
|
sanitizeWiFiString(globals.DeviceNameId, buffer, sizeof(buffer));
|
||||||
|
WiFi.softAP(buffer, QUOTE(WIFI_AP_PASSWORD));
|
||||||
|
|
||||||
// Stop WiFi maintenance connection ticker if enabled and display debug messages
|
// Stop WiFi maintenance connection ticker if enabled and display debug messages
|
||||||
#ifdef FEATURE_ENABLE_WIFI_CLIENT
|
#ifdef FEATURE_ENABLE_WIFI_CLIENT
|
||||||
|
94
Software/src/utilities.cpp
Normal file
94
Software/src/utilities.cpp
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#include "utilities.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Validates whether a given string contains only characters allowed in WiFi SSIDs and passwords.
|
||||||
|
*
|
||||||
|
* This function checks each character in the provided string to ensure
|
||||||
|
* that it contains only characters allowed in WiFi SSIDs and passwords.
|
||||||
|
* It considers characters from 'A' to 'Z', 'a' to 'z', '0' to '9', as well as
|
||||||
|
* the following special characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
|
||||||
|
*
|
||||||
|
* @param string Pointer to the string to be validated.
|
||||||
|
* @param size Size of the string including the null-terminator.
|
||||||
|
* @return true if the string contains only allowed characters or is NULL,
|
||||||
|
* false otherwise.
|
||||||
|
*/
|
||||||
|
bool validateWiFiString(char *string, size_t size)
|
||||||
|
{
|
||||||
|
if (string == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
char c = string[i];
|
||||||
|
if (c == '\0')
|
||||||
|
{
|
||||||
|
// Reached the end of the string, all characters were valid WiFi characters.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
|
||||||
|
(c >= '0' && c <= '9') || c == '!' || c == '"' || c == '#' ||
|
||||||
|
c == '$' || c == '%' || c == '&' || c == '\'' || c == '(' ||
|
||||||
|
c == ')' || c == '*' || c == '+' || c == ',' || c == '-' ||
|
||||||
|
c == '.' || c == '/' || c == ':' || c == ';' || c == '<' ||
|
||||||
|
c == '=' || c == '>' || c == '?' || c == '@' || c == '[' ||
|
||||||
|
c == '\\' || c == ']' || c == '^' || c == '_' || c == '`' ||
|
||||||
|
c == '{' || c == '|' || c == '}' || c == '~'))
|
||||||
|
{
|
||||||
|
// Found a character that is not a valid WiFi character.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the loop completes without finding a null terminator, the string is invalid.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies a string to a buffer, replacing invalid WiFi SSID characters with a placeholder.
|
||||||
|
*
|
||||||
|
* This function checks each character in the provided input string to ensure
|
||||||
|
* that it contains only characters allowed in WiFi SSIDs and passwords. If a character
|
||||||
|
* is invalid, it replaces it with a placeholder character (e.g., '_').
|
||||||
|
* It considers characters from 'A' to 'Z', 'a' to 'z', '0' to '9', as well as
|
||||||
|
* the following special characters: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
|
||||||
|
*
|
||||||
|
* @param input Pointer to the input string to be validated and copied.
|
||||||
|
* @param buffer Pointer to the buffer where the output string will be copied.
|
||||||
|
* @param bufferSize Size of the buffer including the null-terminator.
|
||||||
|
*/
|
||||||
|
void sanitizeWiFiString(const char *input, char *buffer, size_t bufferSize)
|
||||||
|
{
|
||||||
|
if (input == NULL || buffer == NULL || bufferSize == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < bufferSize - 1; i++) // Leave space for null-terminator
|
||||||
|
{
|
||||||
|
char c = input[i];
|
||||||
|
if (c == '\0')
|
||||||
|
{
|
||||||
|
// Reached the end of the input string, terminate the buffer
|
||||||
|
buffer[i] = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
|
||||||
|
(c >= '0' && c <= '9') || c == '!' || c == '"' || c == '#' ||
|
||||||
|
c == '$' || c == '%' || c == '&' || c == '\'' || c == '(' ||
|
||||||
|
c == ')' || c == '*' || c == '+' || c == ',' || c == '-' ||
|
||||||
|
c == '.' || c == '/' || c == ':' || c == ';' || c == '<' ||
|
||||||
|
c == '=' || c == '>' || c == '?' || c == '@' || c == '[' ||
|
||||||
|
c == '\\' || c == ']' || c == '^' || c == '_' || c == '`' ||
|
||||||
|
c == '{' || c == '|' || c == '}' || c == '~'))
|
||||||
|
{
|
||||||
|
// Replace invalid character with placeholder
|
||||||
|
buffer[i] = '_';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Copy valid character to buffer
|
||||||
|
buffer[i] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Null-terminate the buffer
|
||||||
|
buffer[i] = '\0';
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user