xref: /openbmc/bmcweb/redfish-core/lib/roles.hpp (revision 4cee35e7)
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 #include <sdbusplus/asio/property.hpp>
23 
24 #include <variant>
25 namespace redfish
26 {
27 
28 inline std::string getRoleFromPrivileges(std::string_view priv)
29 {
30     if (priv == "priv-admin")
31     {
32         return "Administrator";
33     }
34     if (priv == "priv-user")
35     {
36         return "ReadOnly";
37     }
38     if (priv == "priv-operator")
39     {
40         return "Operator";
41     }
42     if (priv == "priv-noaccess")
43     {
44         return "NoAccess";
45     }
46     return "";
47 }
48 
49 inline 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     }
61     else if (role == "ReadOnly")
62     {
63         privArray = {"Login", "ConfigureSelf"};
64     }
65     else if (role == "NoAccess")
66     {
67         privArray = nlohmann::json::array();
68     }
69     else
70     {
71         return false;
72     }
73     return true;
74 }
75 
76 inline void requestRoutesRoles(App& app)
77 {
78     BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/")
79         .privileges(redfish::privileges::getRole)
80         .methods(boost::beast::http::verb::get)(
81             [&app](const crow::Request& req,
82                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
83                    const std::string& roleId) {
84                 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
85                 {
86                     return;
87                 }
88                 nlohmann::json privArray = nlohmann::json::array();
89                 if (!getAssignedPrivFromRole(roleId, privArray))
90                 {
91                     messages::resourceNotFound(asyncResp->res, "Role", roleId);
92 
93                     return;
94                 }
95 
96                 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"] =
100                     nlohmann::json::array();
101                 asyncResp->res.jsonValue["IsPredefined"] = true;
102                 asyncResp->res.jsonValue["Id"] = roleId;
103                 asyncResp->res.jsonValue["RoleId"] = roleId;
104                 asyncResp->res.jsonValue["@odata.id"] =
105                     "/redfish/v1/AccountService/Roles/" + roleId;
106                 asyncResp->res.jsonValue["AssignedPrivileges"] =
107                     std::move(privArray);
108             });
109 }
110 
111 inline void requestRoutesRoleCollection(App& app)
112 {
113     BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/")
114         .privileges(redfish::privileges::getRoleCollection)
115         .methods(boost::beast::http::verb::get)(
116             [&app](const crow::Request& req,
117                    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
118                 if (!redfish::setUpRedfishRoute(app, req, asyncResp->res))
119                 {
120                     return;
121                 }
122 
123                 asyncResp->res.jsonValue["@odata.id"] =
124                     "/redfish/v1/AccountService/Roles";
125                 asyncResp->res.jsonValue["@odata.type"] =
126                     "#RoleCollection.RoleCollection";
127                 asyncResp->res.jsonValue["Name"] = "Roles Collection";
128                 asyncResp->res.jsonValue["Description"] = "BMC User Roles";
129 
130                 sdbusplus::asio::getProperty<std::vector<std::string>>(
131                     *crow::connections::systemBus,
132                     "xyz.openbmc_project.User.Manager",
133                     "/xyz/openbmc_project/user",
134                     "xyz.openbmc_project.User.Manager", "AllPrivileges",
135                     [asyncResp](const boost::system::error_code ec,
136                                 const std::vector<std::string>& privList) {
137                         if (ec)
138                         {
139                             messages::internalError(asyncResp->res);
140                             return;
141                         }
142                         nlohmann::json& memberArray =
143                             asyncResp->res.jsonValue["Members"];
144                         memberArray = nlohmann::json::array();
145                         for (const std::string& priv : privList)
146                         {
147                             std::string role = getRoleFromPrivileges(priv);
148                             if (!role.empty())
149                             {
150                                 nlohmann::json::object_t member;
151                                 member["@odata.id"] =
152                                     "/redfish/v1/AccountService/Roles/" + role;
153                                 memberArray.push_back(std::move(member));
154                             }
155                         }
156                         asyncResp->res.jsonValue["Members@odata.count"] =
157                             memberArray.size();
158                     });
159             });
160 }
161 
162 } // namespace redfish
163