blob: 7819be8190e6467fbd140bd1daaae19819e2a47c [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
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010018#include "node.hpp"
19
Ed Tanousabf2add2019-01-22 16:40:12 -080020#include <variant>
21
Ed Tanous1abe55e2018-09-05 08:30:59 -070022namespace redfish
23{
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010024
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053025inline std::string getRoleFromPrivileges(std::string_view priv)
26{
27 if (priv == "priv-admin")
28 {
29 return "Administrator";
30 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053031 else if (priv == "priv-user")
32 {
AppaRao Pulic80fee52019-10-16 14:49:36 +053033 return "ReadOnly";
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053034 }
35 else if (priv == "priv-operator")
36 {
37 return "Operator";
38 }
jayaprakash Mutyalae9e6d242019-07-29 11:59:08 +000039 else if (priv == "priv-noaccess")
40 {
41 return "NoAccess";
42 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053043 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 }
jayaprakash Mutyalae9e6d242019-07-29 11:59:08 +000062 else if (role == "NoAccess")
63 {
64 privArray = nlohmann::json::array();
65 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053066 else
67 {
68 return false;
69 }
70 return true;
71}
72
Ed Tanous1abe55e2018-09-05 08:30:59 -070073class Roles : public Node
74{
75 public:
76 Roles(CrowApp& app) :
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053077 Node(app, "/redfish/v1/AccountService/Roles/<str>/", std::string())
Ed Tanous1abe55e2018-09-05 08:30:59 -070078 {
Ed Tanous1abe55e2018-09-05 08:30:59 -070079 entityPrivileges = {
80 {boost::beast::http::verb::get, {{"Login"}}},
81 {boost::beast::http::verb::head, {{"Login"}}},
82 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
83 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
84 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
85 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
86 }
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +010087
Ed Tanous1abe55e2018-09-05 08:30:59 -070088 private:
89 void doGet(crow::Response& res, const crow::Request& req,
90 const std::vector<std::string>& params) override
91 {
AppaRao Puli8fcb65b2018-12-27 14:11:55 +053092 if (params.size() != 1)
93 {
94 messages::internalError(res);
95 res.end();
96 return;
97 }
98 const std::string& roleId = params[0];
99 nlohmann::json privArray = nlohmann::json::array();
100 if (false == getAssignedPrivFromRole(roleId, privArray))
101 {
102 messages::resourceNotFound(res, "Role", roleId);
103 res.end();
104 return;
105 }
106
107 res.jsonValue = {
Zbigniew Kurzynskiec8abe62019-05-31 16:59:52 +0200108 {"@odata.type", "#Role.v1_2_2.Role"},
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530109 {"Name", "User Role"},
Ed Tanous0f261532019-02-08 11:13:29 -0800110 {"Description", roleId + " User Role"},
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530111 {"OemPrivileges", nlohmann::json::array()},
112 {"IsPredefined", true},
113 {"Id", roleId},
Zbigniew Kurzynskiec8abe62019-05-31 16:59:52 +0200114 {"RoleId", roleId},
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530115 {"@odata.id", "/redfish/v1/AccountService/Roles/" + roleId},
116 {"AssignedPrivileges", std::move(privArray)}};
Ed Tanous1abe55e2018-09-05 08:30:59 -0700117 res.end();
118 }
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100119};
120
Ed Tanous1abe55e2018-09-05 08:30:59 -0700121class RoleCollection : public Node
122{
123 public:
124 RoleCollection(CrowApp& app) :
125 Node(app, "/redfish/v1/AccountService/Roles/")
126 {
Ed Tanous1abe55e2018-09-05 08:30:59 -0700127 entityPrivileges = {
128 {boost::beast::http::verb::get, {{"Login"}}},
129 {boost::beast::http::verb::head, {{"Login"}}},
130 {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
131 {boost::beast::http::verb::put, {{"ConfigureManager"}}},
132 {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
133 {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
134 }
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100135
Ed Tanous1abe55e2018-09-05 08:30:59 -0700136 private:
137 void doGet(crow::Response& res, const crow::Request& req,
138 const std::vector<std::string>& params) override
139 {
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530140 auto asyncResp = std::make_shared<AsyncResp>(res);
Gunnar Mills2475db82020-02-19 16:20:14 -0600141 res.jsonValue = {{"@odata.id", "/redfish/v1/AccountService/Roles"},
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530142 {"@odata.type", "#RoleCollection.RoleCollection"},
143 {"Name", "Roles Collection"},
144 {"Description", "BMC User Roles"}};
145
146 crow::connections::systemBus->async_method_call(
Ed Tanousabf2add2019-01-22 16:40:12 -0800147 [asyncResp](const boost::system::error_code ec,
148 const std::variant<std::vector<std::string>>& resp) {
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530149 if (ec)
150 {
151 messages::internalError(asyncResp->res);
152 return;
153 }
154 nlohmann::json& memberArray =
155 asyncResp->res.jsonValue["Members"];
156 memberArray = nlohmann::json::array();
157 const std::vector<std::string>* privList =
Ed Tanousabf2add2019-01-22 16:40:12 -0800158 std::get_if<std::vector<std::string>>(&resp);
Ed Tanous66664f22019-10-11 13:05:49 -0700159 if (privList == nullptr)
160 {
161 messages::internalError(asyncResp->res);
162 return;
163 }
AppaRao Puli8fcb65b2018-12-27 14:11:55 +0530164 for (const std::string& priv : *privList)
165 {
166 std::string role = getRoleFromPrivileges(priv);
167 if (!role.empty())
168 {
169 memberArray.push_back(
170 {{"@odata.id",
171 "/redfish/v1/AccountService/Roles/" + role}});
172 }
173 }
174 asyncResp->res.jsonValue["Members@odata.count"] =
175 memberArray.size();
176 },
177 "xyz.openbmc_project.User.Manager", "/xyz/openbmc_project/user",
178 "org.freedesktop.DBus.Properties", "Get",
179 "xyz.openbmc_project.User.Manager", "AllPrivileges");
Ed Tanous1abe55e2018-09-05 08:30:59 -0700180 }
Lewanczyk, Dawid4e49bd42018-01-25 11:30:19 +0100181};
182
Ed Tanous1abe55e2018-09-05 08:30:59 -0700183} // namespace redfish