From b8b297f67552e6ac9197d4bfa3a9f489bcccd0de Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 7 Jun 2026 02:08:56 -0500 Subject: [PATCH] Perform validity checking on received modes when UpdateMode/UpdateZoneMode/SaveMode are called from a network client --- NetworkServer.cpp | 36 ++++++++++++++++++++--------- RGBController/RGBController.cpp | 40 +++++++++++++++++++++++++++++++++ RGBController/RGBController.h | 2 ++ 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/NetworkServer.cpp b/NetworkServer.cpp index 1b6538c7a..d2132de44 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -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; + } } /*-----------------------------------------------------*\ diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 18ed0c70a..e77128fb0 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -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) diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index d93d18f03..c69a17b07 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -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: