blob: a0f4f347546aa9a27c5b3c5217c99d6dad23a9e2 [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
Ed Tanousef4c65b2023-04-24 15:28:50 -070023#include <boost/url/format.hpp>
Ed Tanous20fa6a22024-05-20 18:02:58 -070024#include <nlohmann/json.hpp>
Jonathan Doman1e1e5982021-06-11 09:36:17 -070025#include <sdbusplus/asio/property.hpp>
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010026
Ed Tanous20fa6a22024-05-20 18:02:58 -070027#include <optional>
28#include <string_view>
Ed Tanousabf2add2019-01-22 16:40:12 -080029#include <variant>
Ed Tanous1abe55e2018-09-05 08:30:59 -070030namespace redfish
31{
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010032
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053033inline std::string getRoleFromPrivileges(std::string_view priv)
34{
35 if (priv == "priv-admin")
36 {
37 return "Administrator";
38 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070039 if (priv == "priv-user")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053040 {
AppaRao Pulic80fee52019-10-16 14:49:36 +053041 return "ReadOnly";
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053042 }
Ed Tanous3174e4d2020-10-07 11:41:22 -070043 if (priv == "priv-operator")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053044 {
45 return "Operator";
46 }
47 return "";
48}
49
Ed Tanous20fa6a22024-05-20 18:02:58 -070050inline std::optional<nlohmann::json::array_t>
51 getAssignedPrivFromRole(std::string_view role)
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053052{
Ed Tanous20fa6a22024-05-20 18:02:58 -070053 nlohmann::json::array_t privArray;
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053054 if (role == "Administrator")
55 {
Ed Tanous20fa6a22024-05-20 18:02:58 -070056 privArray.emplace_back("Login");
57 privArray.emplace_back("ConfigureManager");
58 privArray.emplace_back("ConfigureUsers");
59 privArray.emplace_back("ConfigureSelf");
60 privArray.emplace_back("ConfigureComponents");
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053061 }
62 else if (role == "Operator")
63 {
Ed Tanous20fa6a22024-05-20 18:02:58 -070064 privArray.emplace_back("Login");
65 privArray.emplace_back("ConfigureSelf");
66 privArray.emplace_back("ConfigureComponents");
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053067 }
AppaRao Pulic80fee52019-10-16 14:49:36 +053068 else if (role == "ReadOnly")
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053069 {
Ed Tanous20fa6a22024-05-20 18:02:58 -070070 privArray.emplace_back("Login");
71 privArray.emplace_back("ConfigureSelf");
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053072 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053073 else
74 {
Ed Tanous20fa6a22024-05-20 18:02:58 -070075 return std::nullopt;
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053076 }
Ed Tanous20fa6a22024-05-20 18:02:58 -070077 return privArray;
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053078}
79
John Edward Broadbent7e860f12021-04-08 15:57:16 -070080inline void requestRoutesRoles(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -070081{
John Edward Broadbent7e860f12021-04-08 15:57:16 -070082 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/")
Ed Tanoused398212021-06-09 17:05:54 -070083 .privileges(redfish::privileges::getRole)
John Edward Broadbent7e860f12021-04-08 15:57:16 -070084 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -070085 [&app](const crow::Request& req,
86 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
87 const std::string& roleId) {
Carson Labrado3ba00072022-06-06 19:40:56 +000088 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -070089 {
90 return;
91 }
Ed Tanous20fa6a22024-05-20 18:02:58 -070092
93 std::optional<nlohmann::json::array_t> privArray =
94 getAssignedPrivFromRole(roleId);
95 if (!privArray)
Ed Tanous002d39b2022-05-31 08:59:27 -070096 {
97 messages::resourceNotFound(asyncResp->res, "Role", roleId);
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010098
Ed Tanous002d39b2022-05-31 08:59:27 -070099 return;
100 }
zhanghch058d1b46d2021-04-01 11:18:24 +0800101
Ed Tanous002d39b2022-05-31 08:59:27 -0700102 asyncResp->res.jsonValue["@odata.type"] = "#Role.v1_2_2.Role";
103 asyncResp->res.jsonValue["Name"] = "User Role";
104 asyncResp->res.jsonValue["Description"] = roleId + " User Role";
105 asyncResp->res.jsonValue["OemPrivileges"] = nlohmann::json::array();
106 asyncResp->res.jsonValue["IsPredefined"] = true;
107 asyncResp->res.jsonValue["Id"] = roleId;
108 asyncResp->res.jsonValue["RoleId"] = roleId;
Ed Tanousef4c65b2023-04-24 15:28:50 -0700109 asyncResp->res.jsonValue["@odata.id"] =
110 boost::urls::format("/redfish/v1/AccountService/Roles/{}", roleId);
Ed Tanous20fa6a22024-05-20 18:02:58 -0700111 asyncResp->res.jsonValue["AssignedPrivileges"] = std::move(*privArray);
Patrick Williams5a39f772023-10-20 11:20:21 -0500112 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700113}
zhanghch058d1b46d2021-04-01 11:18:24 +0800114
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700115inline void requestRoutesRoleCollection(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -0700116{
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700117 BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/")
Ed Tanoused398212021-06-09 17:05:54 -0700118 .privileges(redfish::privileges::getRoleCollection)
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700119 .methods(boost::beast::http::verb::get)(
Ed Tanous45ca1b82022-03-25 13:07:27 -0700120 [&app](const crow::Request& req,
121 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Carson Labrado3ba00072022-06-06 19:40:56 +0000122 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
Ed Tanous002d39b2022-05-31 08:59:27 -0700123 {
124 return;
125 }
126
127 asyncResp->res.jsonValue["@odata.id"] =
128 "/redfish/v1/AccountService/Roles";
129 asyncResp->res.jsonValue["@odata.type"] =
130 "#RoleCollection.RoleCollection";
131 asyncResp->res.jsonValue["Name"] = "Roles Collection";
132 asyncResp->res.jsonValue["Description"] = "BMC User Roles";
133
134 sdbusplus::asio::getProperty<std::vector<std::string>>(
135 *crow::connections::systemBus, "xyz.openbmc_project.User.Manager",
136 "/xyz/openbmc_project/user", "xyz.openbmc_project.User.Manager",
137 "AllPrivileges",
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800138 [asyncResp](const boost::system::error_code& ec,
Ed Tanous002d39b2022-05-31 08:59:27 -0700139 const std::vector<std::string>& privList) {
140 if (ec)
141 {
142 messages::internalError(asyncResp->res);
143 return;
144 }
145 nlohmann::json& memberArray = asyncResp->res.jsonValue["Members"];
146 memberArray = nlohmann::json::array();
147 for (const std::string& priv : privList)
148 {
149 std::string role = getRoleFromPrivileges(priv);
150 if (!role.empty())
Ed Tanous45ca1b82022-03-25 13:07:27 -0700151 {
Ed Tanous002d39b2022-05-31 08:59:27 -0700152 nlohmann::json::object_t member;
Ed Tanousef4c65b2023-04-24 15:28:50 -0700153 member["@odata.id"] = boost::urls::format(
154 "/redfish/v1/AccountService/Roles/{}", role);
Patrick Williamsb2ba3072023-05-12 10:27:39 -0500155 memberArray.emplace_back(std::move(member));
Ed Tanous45ca1b82022-03-25 13:07:27 -0700156 }
Ed Tanous002d39b2022-05-31 08:59:27 -0700157 }
158 asyncResp->res.jsonValue["Members@odata.count"] =
159 memberArray.size();
Ed Tanous002d39b2022-05-31 08:59:27 -0700160 });
Patrick Williams5a39f772023-10-20 11:20:21 -0500161 });
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700162}
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100163
Ed Tanous1abe55e2018-09-05 08:30:59 -0700164} // namespace redfish