1 /* 2 // Copyright (c) 2018 Intel Corporation 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 */ 16 #pragma once 17 18 #include "app.hpp" 19 #include "dbus_utility.hpp" 20 #include "query.hpp" 21 #include "registries/privilege_registry.hpp" 22 23 #include <sdbusplus/asio/property.hpp> 24 25 #include <variant> 26 namespace redfish 27 { 28 29 inline std::string getRoleFromPrivileges(std::string_view priv) 30 { 31 if (priv == "priv-admin") 32 { 33 return "Administrator"; 34 } 35 if (priv == "priv-user") 36 { 37 return "ReadOnly"; 38 } 39 if (priv == "priv-operator") 40 { 41 return "Operator"; 42 } 43 return ""; 44 } 45 46 inline bool getAssignedPrivFromRole(std::string_view role, 47 nlohmann::json& privArray) 48 { 49 if (role == "Administrator") 50 { 51 privArray = {"Login", "ConfigureManager", "ConfigureUsers", 52 "ConfigureSelf", "ConfigureComponents"}; 53 } 54 else if (role == "Operator") 55 { 56 privArray = {"Login", "ConfigureSelf", "ConfigureComponents"}; 57 } 58 else if (role == "ReadOnly") 59 { 60 privArray = {"Login", "ConfigureSelf"}; 61 } 62 else 63 { 64 return false; 65 } 66 return true; 67 } 68 69 inline void requestRoutesRoles(App& app) 70 { 71 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/") 72 .privileges(redfish::privileges::getRole) 73 .methods(boost::beast::http::verb::get)( 74 [&app](const crow::Request& req, 75 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 76 const std::string& roleId) { 77 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 78 { 79 return; 80 } 81 nlohmann::json privArray = nlohmann::json::array(); 82 if (!getAssignedPrivFromRole(roleId, privArray)) 83 { 84 messages::resourceNotFound(asyncResp->res, "Role", roleId); 85 86 return; 87 } 88 89 asyncResp->res.jsonValue["@odata.type"] = "#Role.v1_2_2.Role"; 90 asyncResp->res.jsonValue["Name"] = "User Role"; 91 asyncResp->res.jsonValue["Description"] = roleId + " User Role"; 92 asyncResp->res.jsonValue["OemPrivileges"] = nlohmann::json::array(); 93 asyncResp->res.jsonValue["IsPredefined"] = true; 94 asyncResp->res.jsonValue["Id"] = roleId; 95 asyncResp->res.jsonValue["RoleId"] = roleId; 96 asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces( 97 "redfish", "v1", "AccountService", "Roles", roleId); 98 asyncResp->res.jsonValue["AssignedPrivileges"] = std::move(privArray); 99 }); 100 } 101 102 inline void requestRoutesRoleCollection(App& app) 103 { 104 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/") 105 .privileges(redfish::privileges::getRoleCollection) 106 .methods(boost::beast::http::verb::get)( 107 [&app](const crow::Request& req, 108 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { 109 if (!redfish::setUpRedfishRoute(app, req, asyncResp)) 110 { 111 return; 112 } 113 114 asyncResp->res.jsonValue["@odata.id"] = 115 "/redfish/v1/AccountService/Roles"; 116 asyncResp->res.jsonValue["@odata.type"] = 117 "#RoleCollection.RoleCollection"; 118 asyncResp->res.jsonValue["Name"] = "Roles Collection"; 119 asyncResp->res.jsonValue["Description"] = "BMC User Roles"; 120 121 sdbusplus::asio::getProperty<std::vector<std::string>>( 122 *crow::connections::systemBus, "xyz.openbmc_project.User.Manager", 123 "/xyz/openbmc_project/user", "xyz.openbmc_project.User.Manager", 124 "AllPrivileges", 125 [asyncResp](const boost::system::error_code ec, 126 const std::vector<std::string>& privList) { 127 if (ec) 128 { 129 messages::internalError(asyncResp->res); 130 return; 131 } 132 nlohmann::json& memberArray = asyncResp->res.jsonValue["Members"]; 133 memberArray = nlohmann::json::array(); 134 for (const std::string& priv : privList) 135 { 136 std::string role = getRoleFromPrivileges(priv); 137 if (!role.empty()) 138 { 139 nlohmann::json::object_t member; 140 member["@odata.id"] = crow::utility::urlFromPieces( 141 "redfish", "v1", "AccountService", "Roles", role); 142 memberArray.push_back(std::move(member)); 143 } 144 } 145 asyncResp->res.jsonValue["Members@odata.count"] = 146 memberArray.size(); 147 }); 148 }); 149 } 150 151 } // namespace redfish 152