blob: a3382e8af71a849968f3924e0252b8c8d7ff29ca [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
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080018#include "app.hpp"
19#include "dbus_utility.hpp"
20#include "query.hpp"
21#include "registries/privilege_registry.hpp"
22
Jonathan Doman1e1e5982021-06-11 09:36:17 -070023#include <sdbusplus/asio/property.hpp>
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010024
Ed Tanousabf2add2019-01-22 16:40:12 -080025#include <variant>
Ed Tanous1abe55e2018-09-05 08:30:59 -070026namespace redfish
27{
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010028
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053029inline std::string getRoleFromPrivileges(std::string_view priv)
30{
31 if (priv == "priv-admin")
32 {
33 return "Administrator";
34 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070035 if (priv == "priv-user")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053036 {
AppaRao Pulic80fee52019-10-16 14:49:36 +053037 return "ReadOnly";
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053038 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070039 if (priv == "priv-operator")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053040 {
41 return "Operator";
42 }
43 return "";
44}
45
46inline 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 }
AppaRao Pulic80fee52019-10-16 14:49:36 +053058 else if (role == "ReadOnly")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053059 {
60 privArray = {"Login", "ConfigureSelf"};
61 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053062 else
63 {
64 return false;
65 }
66 return true;
67}
68
John Edward Broadbent7e860f12021-04-08 15:57:16 -070069inline void requestRoutesRoles(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -070070{
John Edward Broadbent7e860f12021-04-08 15:57:16 -070071 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -070072 .privileges(redfish::privileges::getRole)
John Edward Broadbent7e860f12021-04-08 15:57:16 -070073 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -070074 [&app](const crow::Request& req,
75 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
76 const std::string& roleId) {
Carson Labrado3ba00072022-06-06 19:40:56 +000077 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -070078 {
79 return;
80 }
81 nlohmann::json privArray = nlohmann::json::array();
82 if (!getAssignedPrivFromRole(roleId, privArray))
83 {
84 messages::resourceNotFound(asyncResp->res, "Role", roleId);
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010085
Ed Tanous002d39b2022-05-31 08:59:27 -070086 return;
87 }
zhanghch058d1b46d2021-04-01 11:18:24 +080088
Ed Tanous002d39b2022-05-31 08:59:27 -070089 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;
Willy Tueddfc432022-09-26 16:46:38 +000096 asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
97 "redfish", "v1", "AccountService", "Roles", roleId);
Ed Tanous002d39b2022-05-31 08:59:27 -070098 asyncResp->res.jsonValue["AssignedPrivileges"] = std::move(privArray);
99 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700100}
zhanghch058d1b46d2021-04-01 11:18:24 +0800101
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700102inline void requestRoutesRoleCollection(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -0700103{
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700104 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/")
Ed Tanoused398212021-06-09 17:05:54 -0700105 .privileges(redfish::privileges::getRoleCollection)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700106 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700107 [&app](const crow::Request& req,
108 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000109 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700110 {
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",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800125 [asyncResp](const boost::system::error_code& ec,
Ed Tanous002d39b2022-05-31 08:59:27 -0700126 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())
Ed Tanous45ca1b82022-03-25 13:07:27 -0700138 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700139 nlohmann::json::object_t member;
Willy Tueddfc432022-09-26 16:46:38 +0000140 member["@odata.id"] = crow::utility::urlFromPieces(
141 "redfish", "v1", "AccountService", "Roles", role);
Patrick Williamsb2ba3072023-05-12 10:27:39 -0500142 memberArray.emplace_back(std::move(member));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700143 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700144 }
145 asyncResp->res.jsonValue["Members@odata.count"] =
146 memberArray.size();
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700147 });
Ed Tanous002d39b2022-05-31 08:59:27 -0700148 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700149}
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100150
Ed Tanous1abe55e2018-09-05 08:30:59 -0700151} // namespace redfish