blob: ef7b5f48a822d5075b30fa43d4eae581b28f845e [file] [log] [blame]
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +01001/*
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
John Edward Broadbent7e860f12021-04-08 15:57:16 -070018#include <app.hpp>
Ed Tanous168e20c2021-12-13 14:39:53 -080019#include <dbus_utility.hpp>
Ed Tanous45ca1b82022-03-25 13:07:27 -070020#include <query.hpp>
Ed Tanoused398212021-06-09 17:05:54 -070021#include <registries/privilege_registry.hpp>
Jonathan Doman1e1e5982021-06-11 09:36:17 -070022#include <sdbusplus/asio/property.hpp>
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010023
Ed Tanousabf2add2019-01-22 16:40:12 -080024#include <variant>
Ed Tanous1abe55e2018-09-05 08:30:59 -070025namespace redfish
26{
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010027
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053028inline std::string getRoleFromPrivileges(std::string_view priv)
29{
30 if (priv == "priv-admin")
31 {
32 return "Administrator";
33 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070034 if (priv == "priv-user")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053035 {
AppaRao Pulic80fee52019-10-16 14:49:36 +053036 return "ReadOnly";
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053037 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070038 if (priv == "priv-operator")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053039 {
40 return "Operator";
41 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070042 if (priv == "priv-noaccess")
jayaprakash Mutyalae9e6d242019-07-29 11:59:08 +000043 {
44 return "NoAccess";
45 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053046 return "";
47}
48
49inline bool getAssignedPrivFromRole(std::string_view role,
50 nlohmann::json& privArray)
51{
52 if (role == "Administrator")
53 {
54 privArray = {"Login", "ConfigureManager", "ConfigureUsers",
55 "ConfigureSelf", "ConfigureComponents"};
56 }
57 else if (role == "Operator")
58 {
59 privArray = {"Login", "ConfigureSelf", "ConfigureComponents"};
60 }
AppaRao Pulic80fee52019-10-16 14:49:36 +053061 else if (role == "ReadOnly")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053062 {
63 privArray = {"Login", "ConfigureSelf"};
64 }
jayaprakash Mutyalae9e6d242019-07-29 11:59:08 +000065 else if (role == "NoAccess")
66 {
67 privArray = nlohmann::json::array();
68 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053069 else
70 {
71 return false;
72 }
73 return true;
74}
75
John Edward Broadbent7e860f12021-04-08 15:57:16 -070076inline void requestRoutesRoles(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -070077{
John Edward Broadbent7e860f12021-04-08 15:57:16 -070078 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -070079 .privileges(redfish::privileges::getRole)
John Edward Broadbent7e860f12021-04-08 15:57:16 -070080 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -070081 [&app](const crow::Request& req,
82 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
83 const std::string& roleId) {
Carson Labrado3ba00072022-06-06 19:40:56 +000084 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -070085 {
86 return;
87 }
88 nlohmann::json privArray = nlohmann::json::array();
89 if (!getAssignedPrivFromRole(roleId, privArray))
90 {
91 messages::resourceNotFound(asyncResp->res, "Role", roleId);
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010092
Ed Tanous002d39b2022-05-31 08:59:27 -070093 return;
94 }
zhanghch058d1b46d2021-04-01 11:18:24 +080095
Ed Tanous002d39b2022-05-31 08:59:27 -070096 asyncResp->res.jsonValue["@odata.type"] = "#Role.v1_2_2.Role";
97 asyncResp->res.jsonValue["Name"] = "User Role";
98 asyncResp->res.jsonValue["Description"] = roleId + " User Role";
99 asyncResp->res.jsonValue["OemPrivileges"] = nlohmann::json::array();
100 asyncResp->res.jsonValue["IsPredefined"] = true;
101 asyncResp->res.jsonValue["Id"] = roleId;
102 asyncResp->res.jsonValue["RoleId"] = roleId;
103 asyncResp->res.jsonValue["@odata.id"] =
104 "/redfish/v1/AccountService/Roles/" + roleId;
105 asyncResp->res.jsonValue["AssignedPrivileges"] = std::move(privArray);
106 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700107}
zhanghch058d1b46d2021-04-01 11:18:24 +0800108
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700109inline void requestRoutesRoleCollection(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -0700110{
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700111 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/")
Ed Tanoused398212021-06-09 17:05:54 -0700112 .privileges(redfish::privileges::getRoleCollection)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700113 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700114 [&app](const crow::Request& req,
115 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000116 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700117 {
118 return;
119 }
120
121 asyncResp->res.jsonValue["@odata.id"] =
122 "/redfish/v1/AccountService/Roles";
123 asyncResp->res.jsonValue["@odata.type"] =
124 "#RoleCollection.RoleCollection";
125 asyncResp->res.jsonValue["Name"] = "Roles Collection";
126 asyncResp->res.jsonValue["Description"] = "BMC User Roles";
127
128 sdbusplus::asio::getProperty<std::vector<std::string>>(
129 *crow::connections::systemBus, "xyz.openbmc_project.User.Manager",
130 "/xyz/openbmc_project/user", "xyz.openbmc_project.User.Manager",
131 "AllPrivileges",
132 [asyncResp](const boost::system::error_code ec,
133 const std::vector<std::string>& privList) {
134 if (ec)
135 {
136 messages::internalError(asyncResp->res);
137 return;
138 }
139 nlohmann::json& memberArray = asyncResp->res.jsonValue["Members"];
140 memberArray = nlohmann::json::array();
141 for (const std::string& priv : privList)
142 {
143 std::string role = getRoleFromPrivileges(priv);
144 if (!role.empty())
Ed Tanous45ca1b82022-03-25 13:07:27 -0700145 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700146 nlohmann::json::object_t member;
147 member["@odata.id"] =
148 "/redfish/v1/AccountService/Roles/" + role;
149 memberArray.push_back(std::move(member));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700150 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700151 }
152 asyncResp->res.jsonValue["Members@odata.count"] =
153 memberArray.size();
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700154 });
Ed Tanous002d39b2022-05-31 08:59:27 -0700155 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700156}
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100157
Ed Tanous1abe55e2018-09-05 08:30:59 -0700158} // namespace redfish