/* // Copyright (c) 2018 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ #include "error_messages.hpp" #include "http_response.hpp" #include "logging.hpp" #include "registries.hpp" #include "registries/base_message_registry.hpp" #include #include #include #include #include #include #include #include #include #include #include #include // IWYU pragma: no_include namespace redfish { namespace messages { static void addMessageToErrorJson(nlohmann::json& target, const nlohmann::json& message) { auto& error = target["error"]; // If this is the first error message, fill in the information from the // first error message to the top level struct if (!error.is_object()) { auto messageIdIterator = message.find("MessageId"); if (messageIdIterator == message.end()) { BMCWEB_LOG_CRITICAL( "Attempt to add error message without MessageId"); return; } auto messageFieldIterator = message.find("Message"); if (messageFieldIterator == message.end()) { BMCWEB_LOG_CRITICAL("Attempt to add error message without Message"); return; } error["code"] = *messageIdIterator; error["message"] = *messageFieldIterator; } else { // More than 1 error occurred, so the message has to be generic error["code"] = std::string(messageVersionPrefix) + "GeneralError"; error["message"] = "A general error has occurred. See Resolution for " "information on how to resolve the error."; } // This check could technically be done in the default construction // branch above, but because we need the pointer to the extended info field // anyway, it's more efficient to do it here. auto& extendedInfo = error[messages::messageAnnotation]; if (!extendedInfo.is_array()) { extendedInfo = nlohmann::json::array(); } extendedInfo.push_back(message); } void moveErrorsToErrorJson(nlohmann::json& target, nlohmann::json& source) { if (!source.is_object()) { return; } auto errorIt = source.find("error"); if (errorIt == source.end()) { // caller puts error message in root messages::addMessageToErrorJson(target, source); source.clear(); return; } auto extendedInfoIt = errorIt->find(messages::messageAnnotation); if (extendedInfoIt == errorIt->end()) { return; } const nlohmann::json::array_t* extendedInfo = (*extendedInfoIt).get_ptr(); if (extendedInfo == nullptr) { source.erase(errorIt); return; } for (const nlohmann::json& message : *extendedInfo) { addMessageToErrorJson(target, message); } source.erase(errorIt); } static void addMessageToJsonRoot(nlohmann::json& target, const nlohmann::json& message) { if (!target[messages::messageAnnotation].is_array()) { // Force object to be an array target[messages::messageAnnotation] = nlohmann::json::array(); } target[messages::messageAnnotation].push_back(message); } static void addMessageToJson(nlohmann::json& target, const nlohmann::json& message, std::string_view fieldPath) { std::string extendedInfo(fieldPath); extendedInfo += messages::messageAnnotation; nlohmann::json& field = target[extendedInfo]; if (!field.is_array()) { // Force object to be an array field = nlohmann::json::array(); } // Object exists and it is an array so we can just push in the message field.push_back(message); } static nlohmann::json getLog(redfish::registries::base::Index name, std::span args) { size_t index = static_cast(name); if (index >= redfish::registries::base::registry.size()) { return {}; } return getLogFromRegistry(redfish::registries::base::header, redfish::registries::base::registry, index, args); } /** * @internal * @brief Formats ResourceInUse message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceInUse() { return getLog(redfish::registries::base::Index::resourceInUse, {}); } void resourceInUse(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, resourceInUse()); } /** * @internal * @brief Formats MalformedJSON message into JSON * * See header file for more information * @endinternal */ nlohmann::json malformedJSON() { return getLog(redfish::registries::base::Index::malformedJSON, {}); } void malformedJSON(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, malformedJSON()); } /** * @internal * @brief Formats ResourceMissingAtURI message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceMissingAtURI(const boost::urls::url_view_base& arg1) { std::array args{arg1.buffer()}; return getLog(redfish::registries::base::Index::resourceMissingAtURI, args); } void resourceMissingAtURI(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, resourceMissingAtURI(arg1)); } /** * @internal * @brief Formats ActionParameterValueFormatError message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterValueFormatError(const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::actionParameterValueFormatError, std::to_array({arg1Str, arg2, arg3})); } void actionParameterValueFormatError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterValueFormatError(arg1, arg2, arg3)); } /** * @internal * @brief Formats ActionParameterValueNotInList message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterValueNotInList(std::string_view arg1, std::string_view arg2, std::string_view arg3) { return getLog( redfish::registries::base::Index::actionParameterValueNotInList, std::to_array({arg1, arg2, arg3})); } void actionParameterValueNotInList(crow::Response& res, std::string_view arg1, std::string_view arg2, std::string_view arg3) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterValueNotInList(arg1, arg2, arg3)); } /** * @internal * @brief Formats InternalError message into JSON * * See header file for more information * @endinternal */ nlohmann::json internalError() { return getLog(redfish::registries::base::Index::internalError, {}); } void internalError(crow::Response& res, const std::source_location location) { BMCWEB_LOG_CRITICAL("Internal Error {}({}:{}) `{}`: ", location.file_name(), location.line(), location.column(), location.function_name()); res.result(boost::beast::http::status::internal_server_error); addMessageToErrorJson(res.jsonValue, internalError()); } /** * @internal * @brief Formats UnrecognizedRequestBody message into JSON * * See header file for more information * @endinternal */ nlohmann::json unrecognizedRequestBody() { return getLog(redfish::registries::base::Index::unrecognizedRequestBody, {}); } void unrecognizedRequestBody(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, unrecognizedRequestBody()); } /** * @internal * @brief Formats ResourceAtUriUnauthorized message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceAtUriUnauthorized(const boost::urls::url_view_base& arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::resourceAtUriUnauthorized, std::to_array({arg1.buffer(), arg2})); } void resourceAtUriUnauthorized(crow::Response& res, const boost::urls::url_view_base& arg1, std::string_view arg2) { res.result(boost::beast::http::status::unauthorized); addMessageToErrorJson(res.jsonValue, resourceAtUriUnauthorized(arg1, arg2)); } /** * @internal * @brief Formats ActionParameterUnknown message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterUnknown(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::actionParameterUnknown, std::to_array({arg1, arg2})); } void actionParameterUnknown(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterUnknown(arg1, arg2)); } /** * @internal * @brief Formats ResourceCannotBeDeleted message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceCannotBeDeleted() { return getLog(redfish::registries::base::Index::resourceCannotBeDeleted, {}); } void resourceCannotBeDeleted(crow::Response& res) { res.result(boost::beast::http::status::method_not_allowed); addMessageToErrorJson(res.jsonValue, resourceCannotBeDeleted()); } /** * @internal * @brief Formats PropertyDuplicate message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyDuplicate(std::string_view arg1) { return getLog(redfish::registries::base::Index::propertyDuplicate, std::to_array({arg1})); } void propertyDuplicate(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, propertyDuplicate(arg1), arg1); } /** * @internal * @brief Formats ServiceTemporarilyUnavailable message into JSON * * See header file for more information * @endinternal */ nlohmann::json serviceTemporarilyUnavailable(std::string_view arg1) { return getLog( redfish::registries::base::Index::serviceTemporarilyUnavailable, std::to_array({arg1})); } void serviceTemporarilyUnavailable(crow::Response& res, std::string_view arg1) { res.addHeader(boost::beast::http::field::retry_after, arg1); res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, serviceTemporarilyUnavailable(arg1)); } /** * @internal * @brief Formats ResourceAlreadyExists message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceAlreadyExists(std::string_view arg1, std::string_view arg2, std::string_view arg3) { return getLog(redfish::registries::base::Index::resourceAlreadyExists, std::to_array({arg1, arg2, arg3})); } void resourceAlreadyExists(crow::Response& res, std::string_view arg1, std::string_view arg2, std::string_view arg3) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, resourceAlreadyExists(arg1, arg2, arg3), arg2); } /** * @internal * @brief Formats AccountForSessionNoLongerExists message into JSON * * See header file for more information * @endinternal */ nlohmann::json accountForSessionNoLongerExists() { return getLog( redfish::registries::base::Index::accountForSessionNoLongerExists, {}); } void accountForSessionNoLongerExists(crow::Response& res) { res.result(boost::beast::http::status::forbidden); addMessageToErrorJson(res.jsonValue, accountForSessionNoLongerExists()); } /** * @internal * @brief Formats CreateFailedMissingReqProperties message into JSON * * See header file for more information * @endinternal */ nlohmann::json createFailedMissingReqProperties(std::string_view arg1) { return getLog( redfish::registries::base::Index::createFailedMissingReqProperties, std::to_array({arg1})); } void createFailedMissingReqProperties(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, createFailedMissingReqProperties(arg1), arg1); } /** * @internal * @brief Formats PropertyValueFormatError message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyValueFormatError(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueFormatError, std::to_array({arg1Str, arg2})); } void propertyValueFormatError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, propertyValueFormatError(arg1, arg2), arg2); } /** * @internal * @brief Formats PropertyValueNotInList message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyValueNotInList(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueNotInList, std::to_array({arg1Str, arg2})); } void propertyValueNotInList(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, propertyValueNotInList(arg1, arg2), arg2); } /** * @internal * @brief Formats PropertyValueOutOfRange message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueOutOfRange(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueOutOfRange, std::to_array({arg1Str, arg2})); } void propertyValueOutOfRange(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, propertyValueOutOfRange(arg1, arg2)); } /** * @internal * @brief Formats ResourceAtUriInUnknownFormat message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceAtUriInUnknownFormat(const boost::urls::url_view_base& arg1) { return getLog( redfish::registries::base::Index::resourceAtUriInUnknownFormat, std::to_array({arg1.buffer()})); } void resourceAtUriInUnknownFormat(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, resourceAtUriInUnknownFormat(arg1)); } /** * @internal * @brief Formats ServiceDisabled message into JSON * * See header file for more information * @endinternal */ nlohmann::json serviceDisabled(std::string_view arg1) { return getLog(redfish::registries::base::Index::serviceDisabled, std::to_array({arg1})); } void serviceDisabled(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, serviceDisabled(arg1)); } /** * @internal * @brief Formats ServiceInUnknownState message into JSON * * See header file for more information * @endinternal */ nlohmann::json serviceInUnknownState() { return getLog(redfish::registries::base::Index::serviceInUnknownState, {}); } void serviceInUnknownState(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, serviceInUnknownState()); } /** * @internal * @brief Formats EventSubscriptionLimitExceeded message into JSON * * See header file for more information * @endinternal */ nlohmann::json eventSubscriptionLimitExceeded() { return getLog( redfish::registries::base::Index::eventSubscriptionLimitExceeded, {}); } void eventSubscriptionLimitExceeded(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, eventSubscriptionLimitExceeded()); } /** * @internal * @brief Formats ActionParameterMissing message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterMissing(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::actionParameterMissing, std::to_array({arg1, arg2})); } void actionParameterMissing(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterMissing(arg1, arg2)); } /** * @internal * @brief Formats StringValueTooLong message into JSON * * See header file for more information * @endinternal */ nlohmann::json stringValueTooLong(std::string_view arg1, int arg2) { std::string arg2String = std::to_string(arg2); return getLog(redfish::registries::base::Index::stringValueTooLong, std::to_array({arg1, std::string_view(arg2String)})); } void stringValueTooLong(crow::Response& res, std::string_view arg1, int arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, stringValueTooLong(arg1, arg2)); } /** * @internal * @brief Formats SessionTerminated message into JSON * * See header file for more information * @endinternal */ nlohmann::json sessionTerminated() { return getLog(redfish::registries::base::Index::sessionTerminated, {}); } void sessionTerminated(crow::Response& res) { res.result(boost::beast::http::status::ok); addMessageToJsonRoot(res.jsonValue, sessionTerminated()); } /** * @internal * @brief Formats SubscriptionTerminated message into JSON * * See header file for more information * @endinternal */ nlohmann::json subscriptionTerminated() { return getLog(redfish::registries::base::Index::subscriptionTerminated, {}); } void subscriptionTerminated(crow::Response& res) { res.result(boost::beast::http::status::ok); addMessageToJsonRoot(res.jsonValue, subscriptionTerminated()); } /** * @internal * @brief Formats ResourceTypeIncompatible message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceTypeIncompatible(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::resourceTypeIncompatible, std::to_array({arg1, arg2})); } void resourceTypeIncompatible(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, resourceTypeIncompatible(arg1, arg2)); } /** * @internal * @brief Formats ResetRequired message into JSON * * See header file for more information * @endinternal */ nlohmann::json resetRequired(const boost::urls::url_view_base& arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::resetRequired, std::to_array({arg1.buffer(), arg2})); } void resetRequired(crow::Response& res, const boost::urls::url_view_base& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, resetRequired(arg1, arg2)); } /** * @internal * @brief Formats ChassisPowerStateOnRequired message into JSON * * See header file for more information * @endinternal */ nlohmann::json chassisPowerStateOnRequired(std::string_view arg1) { return getLog(redfish::registries::base::Index::resetRequired, std::to_array({arg1})); } void chassisPowerStateOnRequired(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, chassisPowerStateOnRequired(arg1)); } /** * @internal * @brief Formats ChassisPowerStateOffRequired message into JSON * * See header file for more information * @endinternal */ nlohmann::json chassisPowerStateOffRequired(std::string_view arg1) { return getLog( redfish::registries::base::Index::chassisPowerStateOffRequired, std::to_array({arg1})); } void chassisPowerStateOffRequired(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, chassisPowerStateOffRequired(arg1)); } /** * @internal * @brief Formats PropertyValueConflict message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueConflict(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::propertyValueConflict, std::to_array({arg1, arg2})); } void propertyValueConflict(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, propertyValueConflict(arg1, arg2)); } /** * @internal * @brief Formats PropertyValueResourceConflict message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueResourceConflict(std::string_view arg1, const nlohmann::json& arg2, const boost::urls::url_view_base& arg3) { std::string arg2Str = arg2.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::propertyValueResourceConflict, std::to_array({arg1, arg2Str, arg3.buffer()})); } void propertyValueResourceConflict(crow::Response& res, std::string_view arg1, const nlohmann::json& arg2, const boost::urls::url_view_base& arg3) { res.result(boost::beast::http::status::conflict); addMessageToErrorJson(res.jsonValue, propertyValueResourceConflict(arg1, arg2, arg3)); } /** * @internal * @brief Formats PropertyValueExternalConflict message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueExternalConflict(std::string_view arg1, const nlohmann::json& arg2) { std::string arg2Str = arg2.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::propertyValueExternalConflict, std::to_array({arg1, arg2Str})); } void propertyValueExternalConflict(crow::Response& res, std::string_view arg1, const nlohmann::json& arg2) { res.result(boost::beast::http::status::conflict); addMessageToErrorJson(res.jsonValue, propertyValueExternalConflict(arg1, arg2)); } /** * @internal * @brief Formats PropertyValueIncorrect message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueIncorrect(std::string_view arg1, const nlohmann::json& arg2) { std::string arg2Str = arg2.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueIncorrect, std::to_array({arg1, arg2Str})); } void propertyValueIncorrect(crow::Response& res, std::string_view arg1, const nlohmann::json& arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, propertyValueIncorrect(arg1, arg2)); } /** * @internal * @brief Formats ResourceCreationConflict message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceCreationConflict(const boost::urls::url_view_base& arg1) { return getLog(redfish::registries::base::Index::resourceCreationConflict, std::to_array({arg1.buffer()})); } void resourceCreationConflict(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, resourceCreationConflict(arg1)); } /** * @internal * @brief Formats MaximumErrorsExceeded message into JSON * * See header file for more information * @endinternal */ nlohmann::json maximumErrorsExceeded() { return getLog(redfish::registries::base::Index::maximumErrorsExceeded, {}); } void maximumErrorsExceeded(crow::Response& res) { res.result(boost::beast::http::status::internal_server_error); addMessageToErrorJson(res.jsonValue, maximumErrorsExceeded()); } /** * @internal * @brief Formats PreconditionFailed message into JSON * * See header file for more information * @endinternal */ nlohmann::json preconditionFailed() { return getLog(redfish::registries::base::Index::preconditionFailed, {}); } void preconditionFailed(crow::Response& res) { res.result(boost::beast::http::status::precondition_failed); addMessageToErrorJson(res.jsonValue, preconditionFailed()); } /** * @internal * @brief Formats PreconditionRequired message into JSON * * See header file for more information * @endinternal */ nlohmann::json preconditionRequired() { return getLog(redfish::registries::base::Index::preconditionRequired, {}); } void preconditionRequired(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, preconditionRequired()); } /** * @internal * @brief Formats OperationFailed message into JSON * * See header file for more information * @endinternal */ nlohmann::json operationFailed() { return getLog(redfish::registries::base::Index::operationFailed, {}); } void operationFailed(crow::Response& res) { res.result(boost::beast::http::status::bad_gateway); addMessageToErrorJson(res.jsonValue, operationFailed()); } /** * @internal * @brief Formats OperationTimeout message into JSON * * See header file for more information * @endinternal */ nlohmann::json operationTimeout() { return getLog(redfish::registries::base::Index::operationTimeout, {}); } void operationTimeout(crow::Response& res) { res.result(boost::beast::http::status::internal_server_error); addMessageToErrorJson(res.jsonValue, operationTimeout()); } /** * @internal * @brief Formats PropertyValueTypeError message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyValueTypeError(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueTypeError, std::to_array({arg1Str, arg2})); } void propertyValueTypeError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, propertyValueTypeError(arg1, arg2), arg2); } /** * @internal * @brief Formats ResourceNotFound message into JSONd * * See header file for more information * @endinternal */ nlohmann::json resourceNotFound(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::resourceNotFound, std::to_array({arg1, arg2})); } void resourceNotFound(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::not_found); addMessageToErrorJson(res.jsonValue, resourceNotFound(arg1, arg2)); } /** * @internal * @brief Formats CouldNotEstablishConnection message into JSON * * See header file for more information * @endinternal */ nlohmann::json couldNotEstablishConnection(const boost::urls::url_view_base& arg1) { return getLog(redfish::registries::base::Index::couldNotEstablishConnection, std::to_array({arg1.buffer()})); } void couldNotEstablishConnection(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::not_found); addMessageToErrorJson(res.jsonValue, couldNotEstablishConnection(arg1)); } /** * @internal * @brief Formats PropertyNotWritable message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyNotWritable(std::string_view arg1) { return getLog(redfish::registries::base::Index::propertyNotWritable, std::to_array({arg1})); } void propertyNotWritable(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::forbidden); addMessageToJson(res.jsonValue, propertyNotWritable(arg1), arg1); } /** * @internal * @brief Formats QueryParameterValueTypeError message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryParameterValueTypeError(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::queryParameterValueTypeError, std::to_array({arg1Str, arg2})); } void queryParameterValueTypeError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryParameterValueTypeError(arg1, arg2)); } /** * @internal * @brief Formats ServiceShuttingDown message into JSON * * See header file for more information * @endinternal */ nlohmann::json serviceShuttingDown() { return getLog(redfish::registries::base::Index::serviceShuttingDown, {}); } void serviceShuttingDown(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, serviceShuttingDown()); } /** * @internal * @brief Formats ActionParameterDuplicate message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterDuplicate(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::actionParameterDuplicate, std::to_array({arg1, arg2})); } void actionParameterDuplicate(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterDuplicate(arg1, arg2)); } /** * @internal * @brief Formats ActionParameterNotSupported message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterNotSupported(std::string_view arg1, std::string_view arg2) { return getLog(redfish::registries::base::Index::actionParameterNotSupported, std::to_array({arg1, arg2})); } void actionParameterNotSupported(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterNotSupported(arg1, arg2)); } /** * @internal * @brief Formats SourceDoesNotSupportProtocol message into JSON * * See header file for more information * @endinternal */ nlohmann::json sourceDoesNotSupportProtocol(const boost::urls::url_view_base& arg1, std::string_view arg2) { return getLog( redfish::registries::base::Index::sourceDoesNotSupportProtocol, std::to_array({arg1.buffer(), arg2})); } void sourceDoesNotSupportProtocol(crow::Response& res, const boost::urls::url_view_base& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, sourceDoesNotSupportProtocol(arg1, arg2)); } /** * @internal * @brief Formats StrictAccountTypes message into JSON * * See header file for more information * @endinternal */ nlohmann::json strictAccountTypes(std::string_view arg1) { return getLog(redfish::registries::base::Index::strictAccountTypes, std::to_array({arg1})); } void strictAccountTypes(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, strictAccountTypes(arg1)); } /** * @internal * @brief Formats AccountRemoved message into JSON * * See header file for more information * @endinternal */ nlohmann::json accountRemoved() { return getLog(redfish::registries::base::Index::accountRemoved, {}); } void accountRemoved(crow::Response& res) { res.result(boost::beast::http::status::ok); addMessageToJsonRoot(res.jsonValue, accountRemoved()); } /** * @internal * @brief Formats AccessDenied message into JSON * * See header file for more information * @endinternal */ nlohmann::json accessDenied(const boost::urls::url_view_base& arg1) { return getLog(redfish::registries::base::Index::accessDenied, std::to_array({arg1.buffer()})); } void accessDenied(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::forbidden); addMessageToErrorJson(res.jsonValue, accessDenied(arg1)); } /** * @internal * @brief Formats QueryNotSupported message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryNotSupported() { return getLog(redfish::registries::base::Index::queryNotSupported, {}); } void queryNotSupported(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryNotSupported()); } /** * @internal * @brief Formats CreateLimitReachedForResource message into JSON * * See header file for more information * @endinternal */ nlohmann::json createLimitReachedForResource() { return getLog( redfish::registries::base::Index::createLimitReachedForResource, {}); } void createLimitReachedForResource(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, createLimitReachedForResource()); } /** * @internal * @brief Formats GeneralError message into JSON * * See header file for more information * @endinternal */ nlohmann::json generalError() { return getLog(redfish::registries::base::Index::generalError, {}); } void generalError(crow::Response& res) { res.result(boost::beast::http::status::internal_server_error); addMessageToErrorJson(res.jsonValue, generalError()); } /** * @internal * @brief Formats Success message into JSON * * See header file for more information * @endinternal */ nlohmann::json success() { return getLog(redfish::registries::base::Index::success, {}); } void success(crow::Response& res) { // don't set res.result here because success is the default and any // error should overwrite the default addMessageToJsonRoot(res.jsonValue, success()); } /** * @internal * @brief Formats Created message into JSON * * See header file for more information * @endinternal */ nlohmann::json created() { return getLog(redfish::registries::base::Index::created, {}); } void created(crow::Response& res) { res.result(boost::beast::http::status::created); addMessageToJsonRoot(res.jsonValue, created()); } /** * @internal * @brief Formats NoOperation message into JSON * * See header file for more information * @endinternal */ nlohmann::json noOperation() { return getLog(redfish::registries::base::Index::noOperation, {}); } void noOperation(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, noOperation()); } /** * @internal * @brief Formats PropertyUnknown message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyUnknown(std::string_view arg1) { return getLog(redfish::registries::base::Index::propertyUnknown, std::to_array({arg1})); } void propertyUnknown(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, propertyUnknown(arg1)); } /** * @internal * @brief Formats NoValidSession message into JSON * * See header file for more information * @endinternal */ nlohmann::json noValidSession() { return getLog(redfish::registries::base::Index::noValidSession, {}); } void noValidSession(crow::Response& res) { res.result(boost::beast::http::status::forbidden); addMessageToErrorJson(res.jsonValue, noValidSession()); } /** * @internal * @brief Formats InvalidObject message into JSON * * See header file for more information * @endinternal */ nlohmann::json invalidObject(const boost::urls::url_view_base& arg1) { return getLog(redfish::registries::base::Index::invalidObject, std::to_array({arg1.buffer()})); } void invalidObject(crow::Response& res, const boost::urls::url_view_base& arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, invalidObject(arg1)); } /** * @internal * @brief Formats ResourceInStandby message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceInStandby() { return getLog(redfish::registries::base::Index::resourceInStandby, {}); } void resourceInStandby(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, resourceInStandby()); } /** * @internal * @brief Formats ActionParameterValueTypeError message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterValueTypeError(const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::actionParameterValueTypeError, std::to_array({arg1Str, arg2, arg3})); } void actionParameterValueTypeError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2, std::string_view arg3) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterValueTypeError(arg1, arg2, arg3)); } /** * @internal * @brief Formats actionParameterValueError message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionParameterValueError(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::actionParameterValueError, std::to_array({arg1Str, arg2})); } void actionParameterValueError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionParameterValueError(arg1, arg2)); } /** * @internal * @brief Formats SessionLimitExceeded message into JSON * * See header file for more information * @endinternal */ nlohmann::json sessionLimitExceeded() { return getLog(redfish::registries::base::Index::sessionLimitExceeded, {}); } void sessionLimitExceeded(crow::Response& res) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, sessionLimitExceeded()); } /** * @internal * @brief Formats ActionNotSupported message into JSON * * See header file for more information * @endinternal */ nlohmann::json actionNotSupported(std::string_view arg1) { return getLog(redfish::registries::base::Index::actionNotSupported, std::to_array({arg1})); } void actionNotSupported(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, actionNotSupported(arg1)); } /** * @internal * @brief Formats InvalidIndex message into JSON * * See header file for more information * @endinternal */ nlohmann::json invalidIndex(int64_t arg1) { std::string arg1Str = std::to_string(arg1); return getLog(redfish::registries::base::Index::invalidIndex, std::to_array({arg1Str})); } void invalidIndex(crow::Response& res, int64_t arg1) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, invalidIndex(arg1)); } /** * @internal * @brief Formats EmptyJSON message into JSON * * See header file for more information * @endinternal */ nlohmann::json emptyJSON() { return getLog(redfish::registries::base::Index::emptyJSON, {}); } void emptyJSON(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, emptyJSON()); } /** * @internal * @brief Formats QueryNotSupportedOnResource message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryNotSupportedOnResource() { return getLog(redfish::registries::base::Index::queryNotSupportedOnResource, {}); } void queryNotSupportedOnResource(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryNotSupportedOnResource()); } /** * @internal * @brief Formats QueryNotSupportedOnOperation message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryNotSupportedOnOperation() { return getLog( redfish::registries::base::Index::queryNotSupportedOnOperation, {}); } void queryNotSupportedOnOperation(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryNotSupportedOnOperation()); } /** * @internal * @brief Formats QueryCombinationInvalid message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryCombinationInvalid() { return getLog(redfish::registries::base::Index::queryCombinationInvalid, {}); } void queryCombinationInvalid(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryCombinationInvalid()); } /** * @internal * @brief Formats InsufficientPrivilege message into JSON * * See header file for more information * @endinternal */ nlohmann::json insufficientPrivilege() { return getLog(redfish::registries::base::Index::insufficientPrivilege, {}); } void insufficientPrivilege(crow::Response& res) { res.result(boost::beast::http::status::forbidden); addMessageToErrorJson(res.jsonValue, insufficientPrivilege()); } /** * @internal * @brief Formats PropertyValueModified message into JSON * * See header file for more information * @endinternal */ nlohmann::json propertyValueModified(std::string_view arg1, const nlohmann::json& arg2) { std::string arg2Str = arg2.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog(redfish::registries::base::Index::propertyValueModified, std::to_array({arg1, arg2Str})); } void propertyValueModified(crow::Response& res, std::string_view arg1, const nlohmann::json& arg2) { res.result(boost::beast::http::status::ok); addMessageToJson(res.jsonValue, propertyValueModified(arg1, arg2), arg1); } /** * @internal * @brief Formats AccountNotModified message into JSON * * See header file for more information * @endinternal */ nlohmann::json accountNotModified() { return getLog(redfish::registries::base::Index::accountNotModified, {}); } void accountNotModified(crow::Response& res) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, accountNotModified()); } /** * @internal * @brief Formats QueryParameterValueFormatError message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryParameterValueFormatError(const nlohmann::json& arg1, std::string_view arg2) { std::string arg1Str = arg1.dump(2, ' ', true, nlohmann::json::error_handler_t::replace); return getLog( redfish::registries::base::Index::queryParameterValueFormatError, std::to_array({arg1Str, arg2})); } void queryParameterValueFormatError(crow::Response& res, const nlohmann::json& arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryParameterValueFormatError(arg1, arg2)); } /** * @internal * @brief Formats PropertyMissing message into JSON for the specified * property * * See header file for more information * @endinternal */ nlohmann::json propertyMissing(std::string_view arg1) { return getLog(redfish::registries::base::Index::propertyMissing, std::to_array({arg1})); } void propertyMissing(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::bad_request); addMessageToJson(res.jsonValue, propertyMissing(arg1), arg1); } /** * @internal * @brief Formats ResourceExhaustion message into JSON * * See header file for more information * @endinternal */ nlohmann::json resourceExhaustion(std::string_view arg1) { return getLog(redfish::registries::base::Index::resourceExhaustion, std::to_array({arg1})); } void resourceExhaustion(crow::Response& res, std::string_view arg1) { res.result(boost::beast::http::status::service_unavailable); addMessageToErrorJson(res.jsonValue, resourceExhaustion(arg1)); } /** * @internal * @brief Formats AccountModified message into JSON * * See header file for more information * @endinternal */ nlohmann::json accountModified() { return getLog(redfish::registries::base::Index::accountModified, {}); } void accountModified(crow::Response& res) { res.result(boost::beast::http::status::ok); addMessageToErrorJson(res.jsonValue, accountModified()); } /** * @internal * @brief Formats QueryParameterOutOfRange message into JSON * * See header file for more information * @endinternal */ nlohmann::json queryParameterOutOfRange(std::string_view arg1, std::string_view arg2, std::string_view arg3) { return getLog(redfish::registries::base::Index::queryParameterOutOfRange, std::to_array({arg1, arg2, arg3})); } void queryParameterOutOfRange(crow::Response& res, std::string_view arg1, std::string_view arg2, std::string_view arg3) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, queryParameterOutOfRange(arg1, arg2, arg3)); } nlohmann::json passwordChangeRequired(const boost::urls::url_view_base& arg1) { return getLog(redfish::registries::base::Index::passwordChangeRequired, std::to_array({arg1.buffer()})); } /** * @internal * @brief Formats PasswordChangeRequired message into JSON * * See header file for more information * @endinternal */ void passwordChangeRequired(crow::Response& res, const boost::urls::url_view_base& arg1) { messages::addMessageToJsonRoot(res.jsonValue, passwordChangeRequired(arg1)); } /** * @internal * @brief Formats InsufficientStorage message into JSON * * See header file for more information * @endinternal */ nlohmann::json insufficientStorage() { return getLog(redfish::registries::base::Index::insufficientStorage, {}); } void insufficientStorage(crow::Response& res) { res.result(boost::beast::http::status::insufficient_storage); addMessageToErrorJson(res.jsonValue, insufficientStorage()); } /** * @internal * @brief Formats OperationNotAllowed message into JSON * * See header file for more information * @endinternal */ nlohmann::json operationNotAllowed() { return getLog(redfish::registries::base::Index::operationNotAllowed, {}); } void operationNotAllowed(crow::Response& res) { res.result(boost::beast::http::status::method_not_allowed); addMessageToErrorJson(res.jsonValue, operationNotAllowed()); } /** * @internal * @brief Formats ArraySizeTooLong message into JSON * * See header file for more information * @endinternal */ nlohmann::json arraySizeTooLong(std::string_view property, uint64_t length) { std::string valStr = std::to_string(length); return getLog(redfish::registries::base::Index::arraySizeTooLong, std::to_array({property, valStr})); } void arraySizeTooLong(crow::Response& res, std::string_view property, uint64_t length) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, arraySizeTooLong(property, length)); } void invalidUpload(crow::Response& res, std::string_view arg1, std::string_view arg2) { res.result(boost::beast::http::status::bad_request); addMessageToErrorJson(res.jsonValue, invalidUpload(arg1, arg2)); } /** * @internal * @brief Formats Invalid File message into JSON * * See header file for more information * @endinternal */ nlohmann::json invalidUpload(std::string_view arg1, std::string_view arg2) { std::string msg = "Invalid file uploaded to "; msg += arg1; msg += ": "; msg += arg2; msg += "."; nlohmann::json::object_t ret; ret["@odata.type"] = "/redfish/v1/$metadata#Message.v1_1_1.Message"; ret["MessageId"] = "OpenBMC.0.2.InvalidUpload"; ret["Message"] = std::move(msg); nlohmann::json::array_t args; args.emplace_back(arg1); args.emplace_back(arg2); ret["MessageArgs"] = std::move(args); ret["MessageSeverity"] = "Warning"; ret["Resolution"] = "None."; return ret; } } // namespace messages } // namespace redfish