From 1abe55ef9844afcddcab9d862ae06118f3a2390c Mon Sep 17 00:00:00 2001 From: Ed Tanous Date: Wed, 5 Sep 2018 08:30:59 -0700 Subject: Move to clang-format-6.0 This commit moves the codebase to the lastest clang-format file from upstream, as well as clang-format-6.0. Change-Id: Ice8313468097c0c42317fbb9e10ddf036e8cff4c Signed-off-by: Ed Tanous --- redfish-core/include/error_messages.hpp | 10 +- redfish-core/include/node.hpp | 277 +++++++++++++++++------------- redfish-core/include/privileges.hpp | 261 +++++++++++++++------------- redfish-core/include/redfish.hpp | 79 +++++---- redfish-core/include/utils/json_utils.hpp | 30 ++-- 5 files changed, 364 insertions(+), 293 deletions(-) (limited to 'redfish-core/include') diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp index 4865516b7a..085b76f6bd 100644 --- a/redfish-core/include/error_messages.hpp +++ b/redfish-core/include/error_messages.hpp @@ -24,9 +24,11 @@ #pragma once #include -namespace redfish { +namespace redfish +{ -namespace messages { +namespace messages +{ constexpr const char* messageVersionPrefix = "Base.1.2.0."; constexpr const char* messageAnnotation = "@Message.ExtendedInfo"; @@ -636,6 +638,6 @@ nlohmann::json queryParameterOutOfRange(const std::string& arg1, * AUTOGENERATED FUNCTIONS END * *********************************/ -} // namespace messages +} // namespace messages -} // namespace redfish +} // namespace redfish diff --git a/redfish-core/include/node.hpp b/redfish-core/include/node.hpp index 20d295197e..8dbb0c2d70 100644 --- a/redfish-core/include/node.hpp +++ b/redfish-core/include/node.hpp @@ -18,161 +18,190 @@ #include "privileges.hpp" #include "token_authorization_middleware.hpp" #include "webserver_common.hpp" + #include "crow.h" -namespace redfish { +namespace redfish +{ /** * AsyncResp * Gathers data needed for response processing after async calls are done */ -class AsyncResp { - public: - AsyncResp(crow::Response& response) : res(response) {} +class AsyncResp +{ + public: + AsyncResp(crow::Response& response) : res(response) + { + } - ~AsyncResp() { res.end(); } + ~AsyncResp() + { + res.end(); + } - crow::Response& res; + crow::Response& res; }; /** * @brief Abstract class used for implementing Redfish nodes. * */ -class Node { - public: - template - Node(CrowApp& app, std::string&& entityUrl, Params... params) { - app.routeDynamic(entityUrl.c_str()) - .methods("GET"_method, "PATCH"_method, "POST"_method, - "DELETE"_method)([&](const crow::Request& req, - crow::Response& res, Params... params) { - std::vector paramVec = {params...}; - dispatchRequest(app, req, res, paramVec); - }); - } - - virtual ~Node() = default; - - const std::string* getUrl() const { - auto odataId = json.find("@odata.id"); - if (odataId == json.end()) { - return nullptr; +class Node +{ + public: + template + Node(CrowApp& app, std::string&& entityUrl, Params... params) + { + app.routeDynamic(entityUrl.c_str()) + .methods("GET"_method, "PATCH"_method, "POST"_method, + "DELETE"_method)([&](const crow::Request& req, + crow::Response& res, + Params... params) { + std::vector paramVec = {params...}; + dispatchRequest(app, req, res, paramVec); + }); } - return odataId->get_ptr(); - } - - /** - * @brief Inserts subroute fields into for the node's json in the form: - * "subroute_name" : { "odata.id": "node_url/subroute_name/" } - * Excludes metadata urls starting with "$" and child urls having - * more than one level. - * - * @return None - */ - void getSubRoutes(const std::vector>& allNodes) { - const std::string* url = getUrl(); - if (url == nullptr) { - // BMCWEB_LOG_CRITICAL << "Unable to get url for route"; - return; - } + virtual ~Node() = default; - for (const auto& node : allNodes) { - const std::string* route = node->getUrl(); - if (route == nullptr) { - // BMCWEB_LOG_CRITICAL << "Unable to get url for route"; - continue; - } - if (boost::starts_with(*route, *url)) { - std::string subRoute = route->substr(url->size()); - if (subRoute.empty()) { - continue; + const std::string* getUrl() const + { + auto odataId = json.find("@odata.id"); + if (odataId == json.end()) + { + return nullptr; } - if (boost::starts_with(subRoute, "/")) { - subRoute.erase(0, 1); - } + return odataId->get_ptr(); + } - if (boost::ends_with(subRoute, "/")) { - subRoute.pop_back(); + /** + * @brief Inserts subroute fields into for the node's json in the form: + * "subroute_name" : { "odata.id": "node_url/subroute_name/" } + * Excludes metadata urls starting with "$" and child urls having + * more than one level. + * + * @return None + */ + void getSubRoutes(const std::vector>& allNodes) + { + const std::string* url = getUrl(); + if (url == nullptr) + { + // BMCWEB_LOG_CRITICAL << "Unable to get url for route"; + return; } - if (!boost::starts_with(subRoute, "$") && - subRoute.find('/') == std::string::npos) { - json[subRoute] = nlohmann::json{{"@odata.id", *route}}; + for (const auto& node : allNodes) + { + const std::string* route = node->getUrl(); + if (route == nullptr) + { + // BMCWEB_LOG_CRITICAL << "Unable to get url for route"; + continue; + } + if (boost::starts_with(*route, *url)) + { + std::string subRoute = route->substr(url->size()); + if (subRoute.empty()) + { + continue; + } + + if (boost::starts_with(subRoute, "/")) + { + subRoute.erase(0, 1); + } + + if (boost::ends_with(subRoute, "/")) + { + subRoute.pop_back(); + } + + if (!boost::starts_with(subRoute, "$") && + subRoute.find('/') == std::string::npos) + { + json[subRoute] = nlohmann::json{{"@odata.id", *route}}; + } + } } - } - } - } - - OperationMap entityPrivileges; - - protected: - // Node is designed to be an abstract class, so doGet is pure virtual - virtual void doGet(crow::Response& res, const crow::Request& req, - const std::vector& params) { - res.result(boost::beast::http::status::method_not_allowed); - res.end(); - } - - virtual void doPatch(crow::Response& res, const crow::Request& req, - const std::vector& params) { - res.result(boost::beast::http::status::method_not_allowed); - res.end(); - } - - virtual void doPost(crow::Response& res, const crow::Request& req, - const std::vector& params) { - res.result(boost::beast::http::status::method_not_allowed); - res.end(); - } - - virtual void doDelete(crow::Response& res, const crow::Request& req, - const std::vector& params) { - res.result(boost::beast::http::status::method_not_allowed); - res.end(); - } - - nlohmann::json json; - - private: - void dispatchRequest(CrowApp& app, const crow::Request& req, - crow::Response& res, - const std::vector& params) { - auto ctx = - app.template getContext(req); - - if (!isMethodAllowedForUser(req.method(), entityPrivileges, - ctx.session->username)) { - res.result(boost::beast::http::status::method_not_allowed); - res.end(); - return; } - switch (req.method()) { - case "GET"_method: - doGet(res, req, params); - break; + OperationMap entityPrivileges; - case "PATCH"_method: - doPatch(res, req, params); - break; + protected: + // Node is designed to be an abstract class, so doGet is pure virtual + virtual void doGet(crow::Response& res, const crow::Request& req, + const std::vector& params) + { + res.result(boost::beast::http::status::method_not_allowed); + res.end(); + } - case "POST"_method: - doPost(res, req, params); - break; + virtual void doPatch(crow::Response& res, const crow::Request& req, + const std::vector& params) + { + res.result(boost::beast::http::status::method_not_allowed); + res.end(); + } - case "DELETE"_method: - doDelete(res, req, params); - break; + virtual void doPost(crow::Response& res, const crow::Request& req, + const std::vector& params) + { + res.result(boost::beast::http::status::method_not_allowed); + res.end(); + } - default: - res.result(boost::beast::http::status::not_found); + virtual void doDelete(crow::Response& res, const crow::Request& req, + const std::vector& params) + { + res.result(boost::beast::http::status::method_not_allowed); res.end(); } - return; - } + + nlohmann::json json; + + private: + void dispatchRequest(CrowApp& app, const crow::Request& req, + crow::Response& res, + const std::vector& params) + { + auto ctx = + app.template getContext(req); + + if (!isMethodAllowedForUser(req.method(), entityPrivileges, + ctx.session->username)) + { + res.result(boost::beast::http::status::method_not_allowed); + res.end(); + return; + } + + switch (req.method()) + { + case "GET"_method: + doGet(res, req, params); + break; + + case "PATCH"_method: + doPatch(res, req, params); + break; + + case "POST"_method: + doPost(res, req, params); + break; + + case "DELETE"_method: + doDelete(res, req, params); + break; + + default: + res.result(boost::beast::http::status::not_found); + res.end(); + } + return; + } }; -} // namespace redfish +} // namespace redfish diff --git a/redfish-core/include/privileges.hpp b/redfish-core/include/privileges.hpp index 437bb15e04..0f6b903793 100644 --- a/redfish-core/include/privileges.hpp +++ b/redfish-core/include/privileges.hpp @@ -16,15 +16,21 @@ #pragma once #include +#include +#include #include #include + #include "crow.h" -#include -#include -namespace redfish { +namespace redfish +{ -enum class PrivilegeType { BASE, OEM }; +enum class PrivilegeType +{ + BASE, + OEM +}; /** @brief A fixed array of compile time privileges */ constexpr std::array basePrivileges{ @@ -56,105 +62,118 @@ static const std::vector privilegeNames{basePrivileges.begin(), * (user domain) and false otherwise. * */ -class Privileges { - public: - /** - * @brief Constructs object without any privileges active - * - */ - Privileges() = default; - - /** - * @brief Constructs object with given privileges active - * - * @param[in] privilegeList List of privileges to be activated - * - */ - Privileges(std::initializer_list privilegeList) { - for (const char* privilege : privilegeList) { - if (!setSinglePrivilege(privilege)) { - BMCWEB_LOG_CRITICAL << "Unable to set privilege " << privilege - << "in constructor"; - } +class Privileges +{ + public: + /** + * @brief Constructs object without any privileges active + * + */ + Privileges() = default; + + /** + * @brief Constructs object with given privileges active + * + * @param[in] privilegeList List of privileges to be activated + * + */ + Privileges(std::initializer_list privilegeList) + { + for (const char* privilege : privilegeList) + { + if (!setSinglePrivilege(privilege)) + { + BMCWEB_LOG_CRITICAL << "Unable to set privilege " << privilege + << "in constructor"; + } + } } - } - - /** - * @brief Sets given privilege in the bitset - * - * @param[in] privilege Privilege to be set - * - * @return None - * - */ - bool setSinglePrivilege(const char* privilege) { - for (int searchIndex = 0; searchIndex < privilegeNames.size(); - searchIndex++) { - if (privilege == privilegeNames[searchIndex]) { - privilegeBitset.set(searchIndex); - return true; - } + + /** + * @brief Sets given privilege in the bitset + * + * @param[in] privilege Privilege to be set + * + * @return None + * + */ + bool setSinglePrivilege(const char* privilege) + { + for (int searchIndex = 0; searchIndex < privilegeNames.size(); + searchIndex++) + { + if (privilege == privilegeNames[searchIndex]) + { + privilegeBitset.set(searchIndex); + return true; + } + } + + return false; } - return false; - } - - /** - * @brief Sets given privilege in the bitset - * - * @param[in] privilege Privilege to be set - * - * @return None - * - */ - bool setSinglePrivilege(const std::string& privilege) { - return setSinglePrivilege(privilege.c_str()); - } - - /** - * @brief Retrieves names of all active privileges for a given type - * - * @param[in] type Base or OEM - * - * @return Vector of active privileges. Pointers are valid until - * the setSinglePrivilege is called, or the Privilege structure is destroyed - * - */ - std::vector getActivePrivilegeNames( - const PrivilegeType type) const { - std::vector activePrivileges; - - int searchIndex = 0; - int endIndex = basePrivilegeCount; - if (type == PrivilegeType::OEM) { - searchIndex = basePrivilegeCount - 1; - endIndex = privilegeNames.size(); + /** + * @brief Sets given privilege in the bitset + * + * @param[in] privilege Privilege to be set + * + * @return None + * + */ + bool setSinglePrivilege(const std::string& privilege) + { + return setSinglePrivilege(privilege.c_str()); } - for (; searchIndex < endIndex; searchIndex++) { - if (privilegeBitset.test(searchIndex)) { - activePrivileges.emplace_back(&privilegeNames[searchIndex]); - } + /** + * @brief Retrieves names of all active privileges for a given type + * + * @param[in] type Base or OEM + * + * @return Vector of active privileges. Pointers are valid until + * the setSinglePrivilege is called, or the Privilege structure is destroyed + * + */ + std::vector + getActivePrivilegeNames(const PrivilegeType type) const + { + std::vector activePrivileges; + + int searchIndex = 0; + int endIndex = basePrivilegeCount; + if (type == PrivilegeType::OEM) + { + searchIndex = basePrivilegeCount - 1; + endIndex = privilegeNames.size(); + } + + for (; searchIndex < endIndex; searchIndex++) + { + if (privilegeBitset.test(searchIndex)) + { + activePrivileges.emplace_back(&privilegeNames[searchIndex]); + } + } + + return activePrivileges; } - return activePrivileges; - } - - /** - * @brief Determines if this Privilege set is a superset of the given - * privilege set - * - * @param[in] privilege Privilege to be checked - * - * @return None - * - */ - bool isSupersetOf(const Privileges& p) const { - return (privilegeBitset & p.privilegeBitset) == p.privilegeBitset; - } - - private: - std::bitset privilegeBitset = 0; + /** + * @brief Determines if this Privilege set is a superset of the given + * privilege set + * + * @param[in] privilege Privilege to be checked + * + * @return None + * + */ + bool isSupersetOf(const Privileges& p) const + { + return (privilegeBitset & p.privilegeBitset) == p.privilegeBitset; + } + + private: + std::bitset privilegeBitset = 0; }; using OperationMap = boost::container::flat_mapsecond.empty()) { - return true; - } + // If there are no privileges assigned, assume no privileges required + if (it->second.empty()) + { + return true; + } - for (auto& requiredPrivileges : it->second) { - if (userPrivileges.isSupersetOf(requiredPrivileges)) { - return true; + for (auto& requiredPrivileges : it->second) + { + if (userPrivileges.isSupersetOf(requiredPrivileges)) + { + return true; + } } - } - return false; + return false; } /** @@ -201,13 +225,14 @@ inline bool isMethodAllowedWithPrivileges(const boost::beast::http::verb method, */ inline bool isMethodAllowedForUser(const boost::beast::http::verb method, const OperationMap& operationMap, - const std::string& user) { - // TODO: load user privileges from configuration as soon as its available - // now we are granting all privileges to everyone. - Privileges userPrivileges{"Login", "ConfigureManager", "ConfigureSelf", - "ConfigureUsers", "ConfigureComponents"}; - - return isMethodAllowedWithPrivileges(method, operationMap, userPrivileges); + const std::string& user) +{ + // TODO: load user privileges from configuration as soon as its available + // now we are granting all privileges to everyone. + Privileges userPrivileges{"Login", "ConfigureManager", "ConfigureSelf", + "ConfigureUsers", "ConfigureComponents"}; + + return isMethodAllowedWithPrivileges(method, operationMap, userPrivileges); } -} // namespace redfish +} // namespace redfish diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp index ab60abb90f..7f41b6339f 100644 --- a/redfish-core/include/redfish.hpp +++ b/redfish-core/include/redfish.hpp @@ -28,48 +28,53 @@ #include "../lib/update_service.hpp" #include "webserver_common.hpp" -namespace redfish { +namespace redfish +{ /* * @brief Top level class installing and providing Redfish services */ -class RedfishService { - public: - /* - * @brief Redfish service constructor - * - * Loads Redfish configuration and installs schema resources - * - * @param[in] app Crow app on which Redfish will initialize - */ - RedfishService(CrowApp& app) { - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); - nodes.emplace_back(std::make_unique(app)); +class RedfishService +{ + public: + /* + * @brief Redfish service constructor + * + * Loads Redfish configuration and installs schema resources + * + * @param[in] app Crow app on which Redfish will initialize + */ + RedfishService(CrowApp& app) + { + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back( + std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); + nodes.emplace_back(std::make_unique(app)); - for (auto& node : nodes) { - node->getSubRoutes(nodes); + for (auto& node : nodes) + { + node->getSubRoutes(nodes); + } } - } - private: - std::vector> nodes; + private: + std::vector> nodes; }; -} // namespace redfish +} // namespace redfish diff --git a/redfish-core/include/utils/json_utils.hpp b/redfish-core/include/utils/json_utils.hpp index 25ac95417d..bde81ce72d 100644 --- a/redfish-core/include/utils/json_utils.hpp +++ b/redfish-core/include/utils/json_utils.hpp @@ -14,26 +14,36 @@ // limitations under the License. */ #pragma once -#include #include #include -namespace redfish { +#include + +namespace redfish +{ -namespace json_util { +namespace json_util +{ /** * @brief Defines JSON utils operation status */ -enum class Result { SUCCESS, NOT_EXIST, WRONG_TYPE, NULL_POINTER }; +enum class Result +{ + SUCCESS, + NOT_EXIST, + WRONG_TYPE, + NULL_POINTER +}; /** * @brief Describes JSON utils messages requirement */ -enum class MessageSetting { - NONE = 0x0, ///< No messages will be added - MISSING = 0x1, ///< PropertyMissing message will be added - TYPE_ERROR = 0x2 ///< PropertyValueTypeError message will be added +enum class MessageSetting +{ + NONE = 0x0, ///< No messages will be added + MISSING = 0x1, ///< PropertyMissing message will be added + TYPE_ERROR = 0x2 ///< PropertyValueTypeError message will be added }; /** @@ -287,6 +297,6 @@ Result getDouble(const char* fieldName, const nlohmann::json& json, bool processJsonFromRequest(crow::Response& res, const crow::Request& req, nlohmann::json& reqJson); -} // namespace json_util +} // namespace json_util -} // namespace redfish +} // namespace redfish -- cgit v1.2.3