aboutsummaryrefslogtreecommitdiff
path: root/lib/events/event.h
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-08-01 18:09:35 +0200
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-09-04 18:42:11 +0200
commit575534e7cca310c6d6195ab16d482bf9dfba755e (patch)
treefe105929f6a248c7df979d686b6902c8bacf84b7 /lib/events/event.h
parent8e58d28ca0517aeeb43c99bd97ec9ba5ada11c95 (diff)
downloadlibquotient-575534e7cca310c6d6195ab16d482bf9dfba755e.tar.gz
libquotient-575534e7cca310c6d6195ab16d482bf9dfba755e.zip
Disallow direct events construction from JSON
Direct construction (using makeEvent() or explicitly constructing an event) from JSON may create an event that has a type conflicting with that stored in JSON. There's no such problem with loadEvent(), even though it's considerably slower. Driven by the fact that almost nowhere in the code direct construction is used on checked JSON (one test is the only valid case), this commit moves all JSON-loading constructors to the protected section, thereby disabling usage of makeEvent() in JSON-loading capacity, and switches such cases across the library to loadEvent().
Diffstat (limited to 'lib/events/event.h')
-rw-r--r--lib/events/event.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/events/event.h b/lib/events/event.h
index 6a7acf28..9d7c61a9 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -203,6 +203,9 @@ private:
// === Event creation facilities ===
//! \brief Create an event of arbitrary type from its arguments
+//!
+//! This should not be used to load events from JSON - use loadEvent() for that.
+//! \sa loadEvent
template <typename EventT, typename... ArgTs>
inline event_ptr_tt<EventT> makeEvent(ArgTs&&... args)
{
@@ -266,8 +269,6 @@ public:
return BaseMetaType;
}
- explicit Event(const QJsonObject& json);
-
Q_DISABLE_COPY(Event)
Event(Event&&) noexcept = default;
Event& operator=(Event&&) = delete;
@@ -364,6 +365,10 @@ public:
[[deprecated("Use is<CallEvent>() instead")]] bool isCallEvent() const;
protected:
+ friend class EventMetaType<Event>; // To access the below constructor
+
+ explicit Event(const QJsonObject& json);
+
QJsonObject& editJson() { return _json; }
virtual void dumpTo(QDebug dbg) const;
@@ -427,6 +432,7 @@ public:
//! pointing to that BaseMetaType.
//! \sa EventMetaType, EventMetaType::SuppressLoadDerived
#define QUO_BASE_EVENT(CppType_, ...) \
+ friend class EventMetaType<CppType_>; \
static inline EventMetaType<CppType_> BaseMetaType{ \
#CppType_ __VA_OPT__(,) __VA_ARGS__ }; \
const AbstractEventMetaType& metaType() const override \
@@ -452,6 +458,7 @@ public:
//! \sa EventMetaType
#define QUO_EVENT(CppType_, MatrixType_, ...) \
static inline const auto& TypeId = MatrixType_##_ls; \
+ friend class EventMetaType<CppType_>; \
static inline const EventMetaType<CppType_> MetaType{ \
#CppType_, TypeId, BaseMetaType __VA_OPT__(,) __VA_ARGS__ \
}; \