blob: 3d9e6ddb71c56b39f92419d910213debbd8d4ba8 [file] [log] [blame]
/*
// Copyright (c) 2018 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#pragma once
#include "app.hpp"
#include "dbus_utility.hpp"
#include "error_messages.hpp"
#include "managed_store_types.hpp"
#include "query.hpp"
#include "registries/privilege_registry.hpp"
#include <sdbusplus/asio/property.hpp>
#include <variant>
namespace redfish
{
inline std::string getRoleFromPrivileges(std::string_view priv)
{
if (priv == "priv-admin")
{
return "Administrator";
}
if (priv == "priv-user")
{
return "ReadOnly";
}
if (priv == "priv-operator")
{
return "Operator";
}
return "";
}
inline bool getAssignedPrivFromRole(std::string_view role,
nlohmann::json& privArray)
{
if (role == "Administrator")
{
privArray = {"Login", "ConfigureManager", "ConfigureUsers",
"ConfigureSelf", "ConfigureComponents"};
}
else if (role == "Operator")
{
privArray = {"Login", "ConfigureSelf", "ConfigureComponents"};
}
else if (role == "ReadOnly")
{
privArray = {"Login", "ConfigureSelf"};
}
else
{
return false;
}
return true;
}
inline void handleRolesGet(App& app, const crow::Request& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& roleId)
{
if (!redfish::setUpRedfishRoute(app, req, asyncResp))
{
return;
}
nlohmann::json privArray = nlohmann::json::array();
if (!getAssignedPrivFromRole(roleId, privArray))
{
messages::resourceNotFound(asyncResp->res, "Role", roleId);
return;
}
asyncResp->res.jsonValue["@odata.type"] = "#Role.v1_2_2.Role";
asyncResp->res.jsonValue["Name"] = "User Role";
asyncResp->res.jsonValue["Description"] = roleId + " User Role";
asyncResp->res.jsonValue["OemPrivileges"] = nlohmann::json::array();
asyncResp->res.jsonValue["IsPredefined"] = true;
asyncResp->res.jsonValue["Id"] = roleId;
asyncResp->res.jsonValue["RoleId"] = roleId;
asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
"redfish", "v1", "AccountService", "Roles", roleId);
asyncResp->res.jsonValue["AssignedPrivileges"] = std::move(privArray);
}
inline void requestRoutesRoles(App& app)
{
BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/<str>/")
.privileges(redfish::privileges::getRole)
.methods(boost::beast::http::verb::get)(
std::bind_front(handleRolesGet, std::ref(app)));
}
inline void
handleRoleCollectionGet(App& app, const crow::Request& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
{
if (!redfish::setUpRedfishRoute(app, req, asyncResp))
{
return;
}
asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1/AccountService/Roles";
asyncResp->res.jsonValue["@odata.type"] = "#RoleCollection.RoleCollection";
asyncResp->res.jsonValue["Name"] = "Roles Collection";
asyncResp->res.jsonValue["Description"] = "BMC User Roles";
managedStore::ManagedObjectStoreContext requestContext(asyncResp);
dbus_utils::getProperty<std::vector<std::string>>(
"xyz.openbmc_project.User.Manager", "/xyz/openbmc_project/user",
"xyz.openbmc_project.User.Manager", "AllPrivileges", requestContext,
[asyncResp](const boost::system::error_code& ec,
const std::vector<std::string>& privList) {
if (ec)
{
messages::internalError(asyncResp->res);
return;
}
nlohmann::json& memberArray = asyncResp->res.jsonValue["Members"];
memberArray = nlohmann::json::array();
for (const std::string& priv : privList)
{
std::string role = getRoleFromPrivileges(priv);
if (!role.empty())
{
nlohmann::json::object_t member;
member["@odata.id"] = crow::utility::urlFromPieces(
"redfish", "v1", "AccountService", "Roles", role);
memberArray.push_back(std::move(member));
}
}
asyncResp->res.jsonValue["Members@odata.count"] = memberArray.size();
});
}
inline void requestRoutesRoleCollection(App& app)
{
BMCWEB_ROUTE(app, "/redfish/v1/AccountService/Roles/")
.privileges(redfish::privileges::getRoleCollection)
.methods(boost::beast::http::verb::get)(
std::bind_front(handleRoleCollectionGet, std::ref(app)));
}
} // namespace redfish