Perform validity checking on received modes when UpdateMode/UpdateZoneMode/SaveMode are called from a network client

This commit is contained in:
Adam Honse
2026-06-07 02:08:56 -05:00
parent 431a432a74
commit b8b297f675
3 changed files with 67 additions and 11 deletions

View File

@@ -2725,6 +2725,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateSaveMode(Netwo
unsigned int data_size_pkt;
unsigned char* data_start = data_ptr;
int mode_idx;
mode temp_mode;
/*-----------------------------------------------------*\
| If data pointer is null, return |
@@ -2780,14 +2781,20 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateSaveMode(Netwo
}
/*-----------------------------------------------------*\
| Set active mode |
| Read mode description |
\*-----------------------------------------------------*/
controllers[controller_idx]->active_mode = mode_idx;
data_ptr = RGBController::SetModeDescription(data_ptr, data_size - (data_ptr - data_start), &temp_mode, client_info->client_protocol_version);
/*-----------------------------------------------------*\
| Set mode description |
| Set mode values and active mode |
\*-----------------------------------------------------*/
data_ptr = controllers[controller_idx]->SetModeDescription(data_ptr, data_size - (data_ptr - data_start), &controllers[controller_idx]->modes[mode_idx], client_info->client_protocol_version);
if((mode_idx < controllers[controller_idx]->modes.size()) && (mode_idx >= 0))
{
if(RGBController::SetModeValuesFromMode(controllers[controller_idx]->modes[mode_idx], temp_mode))
{
controllers[controller_idx]->active_mode = mode_idx;
}
}
/*-----------------------------------------------------*\
| Unlock access mutex |
@@ -3005,6 +3012,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateZoneMode(Netwo
unsigned int data_size_pkt;
unsigned char* data_start = data_ptr;
int mode_idx;
mode temp_mode;
int zone_idx;
/*-----------------------------------------------------*\
@@ -3066,16 +3074,22 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateZoneMode(Netwo
}
/*-----------------------------------------------------*\
| Set active mode |
\*-----------------------------------------------------*/
controllers[controller_idx]->zones[zone_idx].active_mode = mode_idx;
/*-----------------------------------------------------*\
| Set mode description |
| Read mode description |
\*-----------------------------------------------------*/
if(mode_idx >= 0)
{
data_ptr = controllers[controller_idx]->SetModeDescription(data_ptr, data_size - (data_ptr - data_start), &controllers[controller_idx]->zones[zone_idx].modes[mode_idx], client_info->client_protocol_version);
data_ptr = RGBController::SetModeDescription(data_ptr, data_size - (data_ptr - data_start), &temp_mode, client_info->client_protocol_version);
}
/*-----------------------------------------------------*\
| Set mode values and active mode |
\*-----------------------------------------------------*/
if((mode_idx < controllers[controller_idx]->zones[zone_idx].modes.size()) && (mode_idx >= 0))
{
if(RGBController::SetModeValuesFromMode(controllers[controller_idx]->zones[zone_idx].modes[mode_idx], temp_mode))
{
controllers[controller_idx]->zones[zone_idx].active_mode = mode_idx;
}
}
/*-----------------------------------------------------*\

View File

@@ -4432,6 +4432,46 @@ zone RGBController::SetZoneDescriptionJSON(nlohmann::json zone_json)
return(new_zone);
}
bool RGBController::SetModeValuesFromMode(mode& destination, mode& source)
{
/*-----------------------------------------------------*\
| Validate source mode before updating destination |
\*-----------------------------------------------------*/
if((destination.name == source.name)
&& (destination.brightness_max == source.brightness_max)
&& (destination.brightness_min == source.brightness_min)
&& (((destination.brightness_max >= destination.brightness_min) && (source.brightness >= destination.brightness_min) && (source.brightness <= destination.brightness_max))
|| ((destination.brightness_max <= destination.brightness_min) && (source.brightness <= destination.brightness_min) && (source.brightness >= destination.brightness_max)))
&& ((((destination.flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR)) == 0) && (source.color_mode == MODE_COLORS_NONE))
|| ((destination.flags & MODE_FLAG_HAS_PER_LED_COLOR) && (source.color_mode == MODE_COLORS_PER_LED))
|| ((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (source.color_mode == MODE_COLORS_MODE_SPECIFIC))
|| ((destination.flags & MODE_FLAG_HAS_RANDOM_COLOR) && (source.color_mode == MODE_COLORS_RANDOM)))
&& (destination.colors_max == source.colors_max)
&& (destination.colors_min == source.colors_min)
&& ((source.colors.size() >= destination.colors_min) && (source.colors.size() <= destination.colors_max))
&& ((((destination.flags & (MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD)) == 0) && (source.direction == 0))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_HV) && ((source.direction == MODE_DIRECTION_HORIZONTAL) || (source.direction == MODE_DIRECTION_VERTICAL)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_LR) && ((source.direction == MODE_DIRECTION_LEFT) || (source.direction == MODE_DIRECTION_RIGHT)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_UD) && ((source.direction == MODE_DIRECTION_UP) || (source.direction == MODE_DIRECTION_DOWN))))
&& (destination.speed_max == source.speed_max)
&& (destination.speed_min == source.speed_min)
&& (((destination.speed_max >= destination.speed_min) && (source.speed >= destination.speed_min) && (source.speed <= destination.speed_max))
|| ((destination.speed_max <= destination.speed_min) && (source.speed <= destination.speed_min) && (source.speed >= destination.speed_max))))
{
destination.brightness = source.brightness;
destination.color_mode = source.color_mode;
destination.colors = source.colors;
destination.direction = source.direction;
destination.speed = source.speed;
return(true);
}
else
{
return(false);
}
}
std::string RGBController::DeviceTypeToString(device_type type)
{
switch(type)

View File

@@ -259,6 +259,8 @@ public:
static segment SetSegmentDescriptionJSON(nlohmann::json segment_json);
static zone SetZoneDescriptionJSON(nlohmann::json zone_json);
static bool SetModeValuesFromMode(mode& destination, mode& source);
static std::string DeviceTypeToString(device_type type);
protected: