Move nbdproxy to non lambda methods
In a similar way we've transformed code in bmcweb, move these callbacks
to use non-lambdas, to simplify their use.
Tested: No good test harness here. Inspection only, mechanical
transform.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: Ic5c2c86fef0abfaadb07022123ad93914d5ddf69
diff --git a/include/nbd_proxy.hpp b/include/nbd_proxy.hpp
index 7ffa9aa..fbbf3cc 100644
--- a/include/nbd_proxy.hpp
+++ b/include/nbd_proxy.hpp
@@ -253,181 +253,185 @@
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
static SessionMap sessions;
+inline void onOpen(crow::websocket::Connection& conn)
+{
+ BMCWEB_LOG_DEBUG << "nbd-proxy.onopen(" << &conn << ")";
+
+ auto getUserInfoHandler =
+ [&conn](const boost::system::error_code& ec,
+ const dbus::utility::DBusPropertiesMap& userInfo) {
+ if (ec)
+ {
+ BMCWEB_LOG_ERROR << "GetUserInfo failed...";
+ conn.close("Failed to get user information");
+ return;
+ }
+
+ const std::string* userRolePtr = nullptr;
+ auto userInfoIter =
+ std::find_if(userInfo.begin(), userInfo.end(), [](const auto& p) {
+ return p.first == "UserPrivilege";
+ });
+ if (userInfoIter != userInfo.end())
+ {
+ userRolePtr = std::get_if<std::string>(&userInfoIter->second);
+ }
+
+ std::string userRole{};
+ if (userRolePtr != nullptr)
+ {
+ userRole = *userRolePtr;
+ BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
+ << " userRole = " << *userRolePtr;
+ }
+
+ // Get the user privileges from the role
+ ::redfish::Privileges userPrivileges =
+ ::redfish::getUserPrivileges(userRole);
+
+ const ::redfish::Privileges requiredPrivileges{requiredPrivilegeString};
+
+ if (!userPrivileges.isSupersetOf(requiredPrivileges))
+ {
+ BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
+ << " not authorized for nbd connection";
+ conn.close("Unathourized access");
+ return;
+ }
+
+ auto openHandler =
+ [&conn](const boost::system::error_code& ec2,
+ const dbus::utility::ManagedObjectType& objects) {
+ const std::string* socketValue = nullptr;
+ const std::string* endpointValue = nullptr;
+ const std::string* endpointObjectPath = nullptr;
+
+ if (ec2)
+ {
+ BMCWEB_LOG_ERROR << "DBus error: " << ec2.message();
+ conn.close("Failed to create mount point");
+ return;
+ }
+
+ for (const auto& [objectPath, interfaces] : objects)
+ {
+ for (const auto& [interface, properties] : interfaces)
+ {
+ if (interface !=
+ "xyz.openbmc_project.VirtualMedia.MountPoint")
+ {
+ continue;
+ }
+
+ for (const auto& [name, value] : properties)
+ {
+ if (name == "EndpointId")
+ {
+ endpointValue = std::get_if<std::string>(&value);
+
+ if (endpointValue == nullptr)
+ {
+ BMCWEB_LOG_ERROR
+ << "EndpointId property value is null";
+ }
+ }
+ if (name == "Socket")
+ {
+ socketValue = std::get_if<std::string>(&value);
+ if (socketValue == nullptr)
+ {
+ BMCWEB_LOG_ERROR
+ << "Socket property value is null";
+ }
+ }
+ }
+ }
+
+ if ((endpointValue != nullptr) && (socketValue != nullptr) &&
+ *endpointValue == conn.req.target())
+ {
+ endpointObjectPath = &objectPath.str;
+ break;
+ }
+ }
+
+ if (objects.empty() || endpointObjectPath == nullptr)
+ {
+ BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
+ conn.close("Failed to match EndpointId");
+ return;
+ }
+
+ for (const auto& session : sessions)
+ {
+ if (session.second->getEndpointId() == conn.req.target())
+ {
+ BMCWEB_LOG_ERROR
+ << "Cannot open new connection - socket is in use";
+ conn.close("Slot is in use");
+ return;
+ }
+ }
+
+ // If the socket file exists (i.e. after bmcweb crash),
+ // we cannot reuse it.
+ std::remove((*socketValue).c_str());
+
+ sessions[&conn] = std::make_shared<NbdProxyServer>(
+ conn, *socketValue, *endpointValue, *endpointObjectPath);
+
+ sessions[&conn]->run();
+ };
+ crow::connections::systemBus->async_method_call(
+ std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
+ "/xyz/openbmc_project/VirtualMedia",
+ "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+ };
+
+ crow::connections::systemBus->async_method_call(
+ std::move(getUserInfoHandler), "xyz.openbmc_project.User.Manager",
+ "/xyz/openbmc_project/user", "xyz.openbmc_project.User.Manager",
+ "GetUserInfo", conn.getUserName());
+}
+
+inline void onClose(crow::websocket::Connection& conn,
+ const std::string& reason)
+{
+ BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason << "')";
+ auto session = sessions.find(&conn);
+ if (session == sessions.end())
+ {
+ BMCWEB_LOG_DEBUG << "No session to close";
+ return;
+ }
+ session->second->close();
+ // Remove reference to session in global map
+ sessions.erase(session);
+}
+
+inline void onMessage(crow::websocket::Connection& conn,
+ const std::string& data, bool /*isBinary*/)
+{
+ BMCWEB_LOG_DEBUG << "nbd-proxy.onmessage(len = " << data.length() << ")";
+ // Acquire proxy from sessions
+ auto session = sessions.find(&conn);
+ if (session != sessions.end())
+ {
+ if (session->second)
+ {
+ session->second->send(data);
+ return;
+ }
+ }
+}
+
inline void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/nbd/<str>")
.websocket()
- .onopen([](crow::websocket::Connection& conn) {
- BMCWEB_LOG_DEBUG << "nbd-proxy.onopen(" << &conn << ")";
-
- auto getUserInfoHandler =
- [&conn](const boost::system::error_code& ec,
- const dbus::utility::DBusPropertiesMap& userInfo) {
- if (ec)
- {
- BMCWEB_LOG_ERROR << "GetUserInfo failed...";
- conn.close("Failed to get user information");
- return;
- }
-
- const std::string* userRolePtr = nullptr;
- auto userInfoIter = std::find_if(userInfo.begin(), userInfo.end(),
- [](const auto& p) {
- return p.first == "UserPrivilege";
- });
- if (userInfoIter != userInfo.end())
- {
- userRolePtr = std::get_if<std::string>(&userInfoIter->second);
- }
-
- std::string userRole{};
- if (userRolePtr != nullptr)
- {
- userRole = *userRolePtr;
- BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
- << " userRole = " << *userRolePtr;
- }
-
- // Get the user privileges from the role
- ::redfish::Privileges userPrivileges =
- ::redfish::getUserPrivileges(userRole);
-
- const ::redfish::Privileges requiredPrivileges{
- requiredPrivilegeString};
-
- if (!userPrivileges.isSupersetOf(requiredPrivileges))
- {
- BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
- << " not authorized for nbd connection";
- conn.close("Unathourized access");
- return;
- }
-
- auto openHandler =
- [&conn](const boost::system::error_code& ec2,
- const dbus::utility::ManagedObjectType& objects) {
- const std::string* socketValue = nullptr;
- const std::string* endpointValue = nullptr;
- const std::string* endpointObjectPath = nullptr;
-
- if (ec2)
- {
- BMCWEB_LOG_ERROR << "DBus error: " << ec2.message();
- conn.close("Failed to create mount point");
- return;
- }
-
- for (const auto& [objectPath, interfaces] : objects)
- {
- for (const auto& [interface, properties] : interfaces)
- {
- if (interface !=
- "xyz.openbmc_project.VirtualMedia.MountPoint")
- {
- continue;
- }
-
- for (const auto& [name, value] : properties)
- {
- if (name == "EndpointId")
- {
- endpointValue =
- std::get_if<std::string>(&value);
-
- if (endpointValue == nullptr)
- {
- BMCWEB_LOG_ERROR
- << "EndpointId property value is null";
- }
- }
- if (name == "Socket")
- {
- socketValue = std::get_if<std::string>(&value);
- if (socketValue == nullptr)
- {
- BMCWEB_LOG_ERROR
- << "Socket property value is null";
- }
- }
- }
- }
-
- if ((endpointValue != nullptr) &&
- (socketValue != nullptr) &&
- *endpointValue == conn.req.target())
- {
- endpointObjectPath = &objectPath.str;
- break;
- }
- }
-
- if (objects.empty() || endpointObjectPath == nullptr)
- {
- BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
- conn.close("Failed to match EndpointId");
- return;
- }
-
- for (const auto& session : sessions)
- {
- if (session.second->getEndpointId() == conn.req.target())
- {
- BMCWEB_LOG_ERROR
- << "Cannot open new connection - socket is in use";
- conn.close("Slot is in use");
- return;
- }
- }
-
- // If the socket file exists (i.e. after bmcweb crash),
- // we cannot reuse it.
- std::remove((*socketValue).c_str());
-
- sessions[&conn] = std::make_shared<NbdProxyServer>(
- conn, *socketValue, *endpointValue, *endpointObjectPath);
-
- sessions[&conn]->run();
- };
- crow::connections::systemBus->async_method_call(
- std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
- "/xyz/openbmc_project/VirtualMedia",
- "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
- };
-
- crow::connections::systemBus->async_method_call(
- std::move(getUserInfoHandler),
- "xyz.openbmc_project.User.Manager", "/xyz/openbmc_project/user",
- "xyz.openbmc_project.User.Manager", "GetUserInfo",
- conn.getUserName());
- })
- .onclose(
- [](crow::websocket::Connection& conn, const std::string& reason) {
- BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason << "')";
- auto session = sessions.find(&conn);
- if (session == sessions.end())
- {
- BMCWEB_LOG_DEBUG << "No session to close";
- return;
- }
- session->second->close();
- // Remove reference to session in global map
- sessions.erase(session);
- })
- .onmessage([](crow::websocket::Connection& conn,
- const std::string& data, bool) {
- BMCWEB_LOG_DEBUG << "nbd-proxy.onmessage(len = " << data.length()
- << ")";
- // Acquire proxy from sessions
- auto session = sessions.find(&conn);
- if (session != sessions.end())
- {
- if (session->second)
- {
- session->second->send(data);
- return;
- }
- }
- });
+ .onopen(onOpen)
+ .onclose(onClose)
+ .onmessage(onMessage);
}
} // namespace nbd_proxy
} // namespace crow