mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-06-13 16:35:03 -04:00
Perform validity checking on received modes when UpdateMode/UpdateZoneMode/SaveMode are called from a network client
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user