Added Validation on MessageId and RegistryPrefix
Message ID's and Registry prefixes used to subscribe to an event
will be checked against allowed values.
Corrected "Task" registry prefix to "TaskEvent".
Tested:
- Validated POST action with different combinations of
Message id's and Registry Prefix.
- Redfish validator passed.
Signed-off-by: P Dheeraj Srujan Kumar <p.dheeraj.srujan.kumar@intel.com>
Change-Id: I921cafeca8b2a1813f4aa4c41ecd01c831e3465b
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 148c703..34af41a 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -18,6 +18,7 @@
#include "registries.hpp"
#include "registries/base_message_registry.hpp"
#include "registries/openbmc_message_registry.hpp"
+#include "registries/task_event_message_registry.hpp"
#include <sys/inotify.h>
@@ -64,6 +65,24 @@
namespace message_registries
{
+inline boost::beast::span<const MessageEntry>
+ getRegistryFromPrefix(const std::string& registryName)
+{
+ if (task_event::header.registryPrefix == registryName)
+ {
+ return boost::beast::span<const MessageEntry>(task_event::registry);
+ }
+ if (openbmc::header.registryPrefix == registryName)
+ {
+ return boost::beast::span<const MessageEntry>(openbmc::registry);
+ }
+ if (base::header.registryPrefix == registryName)
+ {
+ return boost::beast::span<const MessageEntry>(base::registry);
+ }
+ return boost::beast::span<const MessageEntry>(openbmc::registry);
+}
+
static const Message*
getMsgFromRegistry(const std::string& messageKey,
const boost::beast::span<const MessageEntry>& registry)
@@ -97,18 +116,7 @@
std::string& messageKey = fields[3];
// Find the right registry and check it for the MessageKey
- if (std::string(base::header.registryPrefix) == registryName)
- {
- return getMsgFromRegistry(
- messageKey, boost::beast::span<const MessageEntry>(base::registry));
- }
- if (std::string(openbmc::header.registryPrefix) == registryName)
- {
- return getMsgFromRegistry(
- messageKey,
- boost::beast::span<const MessageEntry>(openbmc::registry));
- }
- return nullptr;
+ return getMsgFromRegistry(messageKey, getRegistryFromPrefix(registryName));
}
} // namespace message_registries
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index ad567ef..64a2009 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -22,7 +22,7 @@
static constexpr const std::array<const char*, 2> supportedEvtFormatTypes = {
eventFormatType, metricReportFormatType};
static constexpr const std::array<const char*, 3> supportedRegPrefixes = {
- "Base", "OpenBMC", "Task"};
+ "Base", "OpenBMC", "TaskEvent"};
static constexpr const std::array<const char*, 3> supportedRetryPolicies = {
"TerminateAfterRetries", "SuspendRetries", "RetryForever"};
@@ -397,8 +397,54 @@
if (msgIds)
{
- // Do we need to loop-up MessageRegistry and validate
- // data for authenticity??? Not mandate, i believe.
+ std::vector<std::string> registryPrefix;
+
+ // If no registry prefixes are mentioned, consider all supported
+ // prefixes
+ if (subValue->registryPrefixes.empty())
+ {
+ registryPrefix.assign(supportedRegPrefixes.begin(),
+ supportedRegPrefixes.end());
+ }
+ else
+ {
+ registryPrefix = subValue->registryPrefixes;
+ }
+
+ for (const std::string& id : *msgIds)
+ {
+ bool validId = false;
+
+ // Check for Message ID in each of the selected Registry
+ for (const std::string& it : registryPrefix)
+ {
+ const boost::beast::span<
+ const redfish::message_registries::MessageEntry>
+ registry =
+ redfish::message_registries::getRegistryFromPrefix(
+ it);
+
+ if (std::any_of(
+ registry.cbegin(), registry.cend(),
+ [&id](
+ const redfish::message_registries::MessageEntry&
+ messageEntry) {
+ return !id.compare(messageEntry.first);
+ }))
+ {
+ validId = true;
+ break;
+ }
+ }
+
+ if (!validId)
+ {
+ messages::propertyValueNotInList(asyncResp->res, id,
+ "MessageIds");
+ return;
+ }
+ }
+
subValue->registryMsgIds = *msgIds;
}