add defensive checks against data being funny (#4633)
This commit is contained in:
parent
2855ed4887
commit
4dc106545b
@ -1557,10 +1557,36 @@ class EventNamespace(AsyncNamespace):
|
|||||||
Args:
|
Args:
|
||||||
sid: The Socket.IO session id.
|
sid: The Socket.IO session id.
|
||||||
data: The event data.
|
data: The event data.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
EventDeserializationError: If the event data is not a dictionary.
|
||||||
"""
|
"""
|
||||||
fields = data
|
fields = data
|
||||||
# Get the event.
|
|
||||||
event = Event(**{k: v for k, v in fields.items() if k in _EVENT_FIELDS})
|
if isinstance(fields, str):
|
||||||
|
console.warn(
|
||||||
|
"Received event data as a string. This generally should not happen and may indicate a bug."
|
||||||
|
f" Event data: {fields}"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
fields = json.loads(fields)
|
||||||
|
except json.JSONDecodeError as ex:
|
||||||
|
raise exceptions.EventDeserializationError(
|
||||||
|
f"Failed to deserialize event data: {fields}."
|
||||||
|
) from ex
|
||||||
|
|
||||||
|
if not isinstance(fields, dict):
|
||||||
|
raise exceptions.EventDeserializationError(
|
||||||
|
f"Event data must be a dictionary, but received {fields} of type {type(fields)}."
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Get the event.
|
||||||
|
event = Event(**{k: v for k, v in fields.items() if k in _EVENT_FIELDS})
|
||||||
|
except (TypeError, ValueError) as ex:
|
||||||
|
raise exceptions.EventDeserializationError(
|
||||||
|
f"Failed to deserialize event data: {fields}."
|
||||||
|
) from ex
|
||||||
|
|
||||||
self.token_to_sid[event.token] = sid
|
self.token_to_sid[event.token] = sid
|
||||||
self.sid_to_token[sid] = event.token
|
self.sid_to_token[sid] = event.token
|
||||||
|
@ -187,6 +187,10 @@ class SystemPackageMissingError(ReflexError):
|
|||||||
"""Raised when a system package is missing."""
|
"""Raised when a system package is missing."""
|
||||||
|
|
||||||
|
|
||||||
|
class EventDeserializationError(ReflexError, ValueError):
|
||||||
|
"""Raised when an event cannot be deserialized."""
|
||||||
|
|
||||||
|
|
||||||
def raise_system_package_missing_error(package: str) -> NoReturn:
|
def raise_system_package_missing_error(package: str) -> NoReturn:
|
||||||
"""Raise a SystemPackageMissingError.
|
"""Raise a SystemPackageMissingError.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user