Remove middlewares
Middlewares, while kinda cool from an academic standpoint, make our
build times even worse than they already are. Given that we only really
use 1 real middleware today (token auth) and it needs to move into the
parser mode anyway (for security limiting buffer sizes), we might as well
use this as an opportunity to delete some code.
Some other things that happen:
1. Persistent data now moves out of the crow namespace
2. App is no longer a template
3. All request_routes implementations no longer become templates. This
should be a decent (unmeasured) win on compile times.
This commit was part of a commit previously called "various cleanups".
This separates ONLY the middleware deletion part of that.
Note, this also deletes about 400 lines of hard to understand code.
Change-Id: I4c19e25491a153a2aa2e4ef46fc797bcb5b3581a
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/http/app.h b/http/app.h
index ca871dc..dfd5304 100644
--- a/http/app.h
+++ b/http/app.h
@@ -3,7 +3,6 @@
#include "http_request.h"
#include "http_server.h"
#include "logging.h"
-#include "middleware_context.h"
#include "routing.h"
#include "utility.h"
@@ -25,25 +24,24 @@
#ifdef BMCWEB_ENABLE_SSL
using ssl_context_t = boost::asio::ssl::context;
#endif
-template <typename... Middlewares>
-class Crow
+class App
{
public:
- using self_t = Crow;
+ using self_t = App;
#ifdef BMCWEB_ENABLE_SSL
using ssl_socket_t = boost::beast::ssl_stream<boost::asio::ip::tcp::socket>;
- using ssl_server_t = Server<Crow, ssl_socket_t, Middlewares...>;
+ using ssl_server_t = Server<App, ssl_socket_t>;
#else
using socket_t = boost::asio::ip::tcp::socket;
- using server_t = Server<Crow, socket_t, Middlewares...>;
+ using server_t = Server<App, socket_t>;
#endif
- explicit Crow(std::shared_ptr<boost::asio::io_context> ioIn =
- std::make_shared<boost::asio::io_context>()) :
+ explicit App(std::shared_ptr<boost::asio::io_context> ioIn =
+ std::make_shared<boost::asio::io_context>()) :
io(std::move(ioIn))
{}
- ~Crow()
+ ~App()
{
this->stop();
}
@@ -100,12 +98,12 @@
if (-1 == socketFd)
{
sslServer = std::move(std::make_unique<ssl_server_t>(
- this, bindaddrStr, portUint, sslContext, &middlewares, io));
+ this, bindaddrStr, portUint, sslContext, io));
}
else
{
- sslServer = std::move(std::make_unique<ssl_server_t>(
- this, socketFd, sslContext, &middlewares, io));
+ sslServer = std::move(
+ std::make_unique<ssl_server_t>(this, socketFd, sslContext, io));
}
sslServer->setTickFunction(tickInterval, tickFunction);
sslServer->run();
@@ -115,12 +113,12 @@
if (-1 == socketFd)
{
server = std::move(std::make_unique<server_t>(
- this, bindaddrStr, portUint, nullptr, &middlewares, io));
+ this, bindaddrStr, portUint, nullptr, io));
}
else
{
- server = std::move(std::make_unique<server_t>(
- this, socketFd, nullptr, &middlewares, io));
+ server = std::move(
+ std::make_unique<server_t>(this, socketFd, nullptr, io));
}
server->setTickFunction(tickInterval, tickFunction);
server->run();
@@ -216,23 +214,6 @@
}
#endif
- // middleware
- using context_t = detail::Context<Middlewares...>;
- template <typename T>
- typename T::Context& getContext(const Request& req)
- {
- static_assert(black_magic::Contains<T, Middlewares...>::value,
- "App doesn't have the specified middleware type.");
- auto& ctx = *reinterpret_cast<context_t*>(req.middlewareContext);
- return ctx.template get<T>();
- }
-
- template <typename T>
- T& getMiddleware()
- {
- return utility::getElementByType<T, Middlewares...>(middlewares);
- }
-
template <typename Duration, typename Func>
self_t& tick(Duration d, Func f)
{
@@ -255,15 +236,11 @@
std::chrono::milliseconds tickInterval{};
std::function<void()> tickFunction;
- std::tuple<Middlewares...> middlewares;
-
#ifdef BMCWEB_ENABLE_SSL
std::unique_ptr<ssl_server_t> sslServer;
#else
std::unique_ptr<server_t> server;
#endif
};
-template <typename... Middlewares>
-using App = Crow<Middlewares...>;
-using SimpleApp = Crow<>;
} // namespace crow
+using App = crow::App;
diff --git a/http/http_connection.h b/http/http_connection.h
index 8dba3d6..609d4a1 100644
--- a/http/http_connection.h
+++ b/http/http_connection.h
@@ -3,7 +3,6 @@
#include "http_response.h"
#include "logging.h"
-#include "middleware_context.h"
#include "timer_queue.h"
#include "utility.h"
@@ -19,6 +18,7 @@
#include <boost/beast/http.hpp>
#include <boost/beast/ssl/ssl_stream.hpp>
#include <boost/beast/websocket.hpp>
+#include <security_headers.hpp>
#include <ssl_key_handler.hpp>
#include <atomic>
@@ -61,186 +61,6 @@
using namespace boost;
using tcp = asio::ip::tcp;
-namespace detail
-{
-template <typename MW>
-struct CheckBeforeHandleArity3Const
-{
- template <typename T,
- void (T::*)(Request&, Response&, typename MW::Context&) const =
- &T::beforeHandle>
- struct Get
- {};
-};
-
-template <typename MW>
-struct CheckBeforeHandleArity3
-{
- template <typename T, void (T::*)(Request&, Response&,
- typename MW::Context&) = &T::beforeHandle>
- struct Get
- {};
-};
-
-template <typename MW>
-struct CheckAfterHandleArity3Const
-{
- template <typename T,
- void (T::*)(Request&, Response&, typename MW::Context&) const =
- &T::afterHandle>
- struct Get
- {};
-};
-
-template <typename MW>
-struct CheckAfterHandleArity3
-{
- template <typename T, void (T::*)(Request&, Response&,
- typename MW::Context&) = &T::afterHandle>
- struct Get
- {};
-};
-
-template <typename T>
-struct IsBeforeHandleArity3Impl
-{
- template <typename C>
- static std::true_type
- f(typename CheckBeforeHandleArity3Const<T>::template Get<C>*);
-
- template <typename C>
- static std::true_type
- f(typename CheckBeforeHandleArity3<T>::template Get<C>*);
-
- template <typename C>
- static std::false_type f(...);
-
- public:
- static constexpr bool value = decltype(f<T>(nullptr))::value;
-};
-
-template <typename T>
-struct IsAfterHandleArity3Impl
-{
- template <typename C>
- static std::true_type
- f(typename CheckAfterHandleArity3Const<T>::template Get<C>*);
-
- template <typename C>
- static std::true_type
- f(typename CheckAfterHandleArity3<T>::template Get<C>*);
-
- template <typename C>
- static std::false_type f(...);
-
- public:
- static constexpr bool value = decltype(f<T>(nullptr))::value;
-};
-
-template <typename MW, typename Context, typename ParentContext>
-typename std::enable_if<!IsBeforeHandleArity3Impl<MW>::value>::type
- beforeHandlerCall(MW& mw, Request& req, Response& res, Context& ctx,
- ParentContext& /*parent_ctx*/)
-{
- mw.beforeHandle(req, res, ctx.template get<MW>(), ctx);
-}
-
-template <typename MW, typename Context, typename ParentContext>
-typename std::enable_if<IsBeforeHandleArity3Impl<MW>::value>::type
- beforeHandlerCall(MW& mw, Request& req, Response& res, Context& ctx,
- ParentContext& /*parent_ctx*/)
-{
- mw.beforeHandle(req, res, ctx.template get<MW>());
-}
-
-template <typename MW, typename Context, typename ParentContext>
-typename std::enable_if<!IsAfterHandleArity3Impl<MW>::value>::type
- afterHandlerCall(MW& mw, Request& req, Response& res, Context& ctx,
- ParentContext& /*parent_ctx*/)
-{
- mw.afterHandle(req, res, ctx.template get<MW>(), ctx);
-}
-
-template <typename MW, typename Context, typename ParentContext>
-typename std::enable_if<IsAfterHandleArity3Impl<MW>::value>::type
- afterHandlerCall(MW& mw, Request& req, Response& res, Context& ctx,
- ParentContext& /*parent_ctx*/)
-{
- mw.afterHandle(req, res, ctx.template get<MW>());
-}
-
-template <size_t N, typename Context, typename Container, typename CurrentMW,
- typename... Middlewares>
-bool middlewareCallHelper(Container& middlewares, Request& req, Response& res,
- Context& ctx)
-{
- using parent_context_t = typename Context::template partial<N - 1>;
- beforeHandlerCall<CurrentMW, Context, parent_context_t>(
- std::get<N>(middlewares), req, res, ctx,
- static_cast<parent_context_t&>(ctx));
-
- if (res.isCompleted())
- {
- afterHandlerCall<CurrentMW, Context, parent_context_t>(
- std::get<N>(middlewares), req, res, ctx,
- static_cast<parent_context_t&>(ctx));
- return true;
- }
-
- if (middlewareCallHelper<N + 1, Context, Container, Middlewares...>(
- middlewares, req, res, ctx))
- {
- afterHandlerCall<CurrentMW, Context, parent_context_t>(
- std::get<N>(middlewares), req, res, ctx,
- static_cast<parent_context_t&>(ctx));
- return true;
- }
-
- return false;
-}
-
-template <size_t N, typename Context, typename Container>
-bool middlewareCallHelper(Container& /*middlewares*/, Request& /*req*/,
- Response& /*res*/, Context& /*ctx*/)
-{
- return false;
-}
-
-template <size_t N, typename Context, typename Container>
-typename std::enable_if<(N < 0)>::type
- afterHandlersCallHelper(Container& /*middlewares*/, Context& /*Context*/,
- Request& /*req*/, Response& /*res*/)
-{}
-
-template <size_t N, typename Context, typename Container>
-typename std::enable_if<(N == 0)>::type
- afterHandlersCallHelper(Container& middlewares, Context& ctx, Request& req,
- Response& res)
-{
- using parent_context_t = typename Context::template partial<N - 1>;
- using CurrentMW = typename std::tuple_element<
- N, typename std::remove_reference<Container>::type>::type;
- afterHandlerCall<CurrentMW, Context, parent_context_t>(
- std::get<N>(middlewares), req, res, ctx,
- static_cast<parent_context_t&>(ctx));
-}
-
-template <size_t N, typename Context, typename Container>
-typename std::enable_if<(N > 0)>::type
- afterHandlersCallHelper(Container& middlewares, Context& ctx, Request& req,
- Response& res)
-{
- using parent_context_t = typename Context::template partial<N - 1>;
- using CurrentMW = typename std::tuple_element<
- N, typename std::remove_reference<Container>::type>::type;
- afterHandlerCall<CurrentMW, Context, parent_context_t>(
- std::get<N>(middlewares), req, res, ctx,
- static_cast<parent_context_t&>(ctx));
- afterHandlersCallHelper<N - 1, Context, Container>(middlewares, ctx, req,
- res);
-}
-} // namespace detail
-
#ifdef BMCWEB_ENABLE_DEBUG
static std::atomic<int> connectionCount;
#endif
@@ -261,21 +81,18 @@
static constexpr const size_t loggedOutAttempts =
(15 / timerQueueTimeoutSeconds);
-template <typename Adaptor, typename Handler, typename... Middlewares>
+template <typename Adaptor, typename Handler>
class Connection :
- public std::enable_shared_from_this<
- Connection<Adaptor, Handler, Middlewares...>>
+ public std::enable_shared_from_this<Connection<Adaptor, Handler>>
{
public:
Connection(boost::asio::io_context& ioService, Handler* handlerIn,
const std::string& ServerNameIn,
- std::tuple<Middlewares...>* middlewaresIn,
std::function<std::string()>& get_cached_date_str_f,
detail::TimerQueue& timerQueueIn, Adaptor adaptorIn) :
adaptor(std::move(adaptorIn)),
handler(handlerIn), serverName(ServerNameIn),
- middlewares(middlewaresIn), getCachedDateStr(get_cached_date_str_f),
- timerQueue(timerQueueIn)
+ getCachedDateStr(get_cached_date_str_f), timerQueue(timerQueueIn)
{
parser.emplace(std::piecewise_construct, std::make_tuple());
parser->body_limit(httpReqBodyLimit);
@@ -285,7 +102,7 @@
#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
auto ca_available = !std::filesystem::is_empty(
std::filesystem::path(ensuressl::trustStorePath));
- if (ca_available && crow::persistent_data::SessionStore::getInstance()
+ if (ca_available && persistent_data::SessionStore::getInstance()
.getAuthMethodsConfig()
.tls)
{
@@ -301,7 +118,7 @@
bool preverified,
boost::asio::ssl::verify_context& ctx) {
// do nothing if TLS is disabled
- if (!crow::persistent_data::SessionStore::getInstance()
+ if (!persistent_data::SessionStore::getInstance()
.getAuthMethodsConfig()
.tls)
{
@@ -444,10 +261,10 @@
}
sslUser.resize(lastChar);
- session = persistent_data::SessionStore::getInstance()
- .generateUserSession(
- sslUser,
- crow::persistent_data::PersistenceType::TIMEOUT);
+ session =
+ persistent_data::SessionStore::getInstance()
+ .generateUserSession(
+ sslUser, persistent_data::PersistenceType::TIMEOUT);
if (auto sp = session.lock())
{
BMCWEB_LOG_DEBUG << this
@@ -538,15 +355,9 @@
res.completeRequestHandler = [] {};
res.isAliveHelper = [this]() -> bool { return isAlive(); };
- ctx = detail::Context<Middlewares...>();
- req->middlewareContext = static_cast<void*>(&ctx);
req->ioService = static_cast<decltype(req->ioService)>(
&adaptor.get_executor().context());
- detail::middlewareCallHelper<
- 0U, decltype(ctx), decltype(*middlewares), Middlewares...>(
- *middlewares, *req, res, ctx);
-
if (!res.completed)
{
needToCallAfterHandlers = true;
@@ -618,16 +429,10 @@
BMCWEB_LOG_INFO << "Response: " << this << ' ' << req->url << ' '
<< res.resultInt() << " keepalive=" << req->keepAlive();
+ addSecurityHeaders(res);
+
if (needToCallAfterHandlers)
{
- needToCallAfterHandlers = false;
-
- // call all afterHandler of middlewares
- detail::afterHandlersCallHelper<sizeof...(Middlewares) - 1,
- decltype(ctx),
- decltype(*middlewares)>(
- *middlewares, ctx, *req, res);
-
crow::authorization::cleanupTempSession(*req);
}
@@ -949,7 +754,8 @@
std::optional<crow::Request> req;
crow::Response res;
- std::weak_ptr<crow::persistent_data::UserSession> session;
+
+ std::weak_ptr<persistent_data::UserSession> session;
const std::string& serverName;
@@ -958,13 +764,10 @@
bool needToCallAfterHandlers{};
bool needToStartReadAfterComplete{};
- std::tuple<Middlewares...>* middlewares;
- detail::Context<Middlewares...> ctx;
-
std::function<std::string()>& getCachedDateStr;
detail::TimerQueue& timerQueue;
using std::enable_shared_from_this<
- Connection<Adaptor, Handler, Middlewares...>>::shared_from_this;
+ Connection<Adaptor, Handler>>::shared_from_this;
};
} // namespace crow
diff --git a/http/http_request.h b/http/http_request.h
index 95f88c7..fa60f60 100644
--- a/http/http_request.h
+++ b/http/http_request.h
@@ -30,10 +30,9 @@
const std::string& body;
- void* middlewareContext{};
boost::asio::io_context* ioService{};
- std::shared_ptr<crow::persistent_data::UserSession> session;
+ std::shared_ptr<persistent_data::UserSession> session;
std::string userRole{};
std::function<Adaptor&()> socket;
diff --git a/http/http_response.h b/http/http_response.h
index d5d1e4b..7be6b09 100644
--- a/http/http_response.h
+++ b/http/http_response.h
@@ -11,12 +11,12 @@
namespace crow
{
-template <typename Adaptor, typename Handler, typename... Middlewares>
+template <typename Adaptor, typename Handler>
class Connection;
struct Response
{
- template <typename Adaptor, typename Handler, typename... Middlewares>
+ template <typename Adaptor, typename Handler>
friend class crow::Connection;
using response_type =
boost::beast::http::response<boost::beast::http::string_body>;
diff --git a/http/http_server.h b/http/http_server.h
index 0e8a702..c87ddd4 100644
--- a/http/http_server.h
+++ b/http/http_server.h
@@ -27,44 +27,39 @@
using namespace boost;
using tcp = asio::ip::tcp;
-template <typename Handler, typename Adaptor = boost::asio::ip::tcp::socket,
- typename... Middlewares>
+template <typename Handler, typename Adaptor = boost::asio::ip::tcp::socket>
class Server
{
public:
Server(Handler* handler, std::unique_ptr<tcp::acceptor>&& acceptor,
std::shared_ptr<boost::asio::ssl::context> adaptor_ctx,
- std::tuple<Middlewares...>* middlewares = nullptr,
std::shared_ptr<boost::asio::io_context> io =
std::make_shared<boost::asio::io_context>()) :
ioService(std::move(io)),
acceptor(std::move(acceptor)),
signals(*ioService, SIGINT, SIGTERM, SIGHUP), tickTimer(*ioService),
- timer(*ioService), handler(handler), middlewares(middlewares),
- adaptorCtx(adaptor_ctx)
+ timer(*ioService), handler(handler), adaptorCtx(adaptor_ctx)
{}
Server(Handler* handler, const std::string& bindaddr, uint16_t port,
std::shared_ptr<boost::asio::ssl::context> adaptor_ctx,
- std::tuple<Middlewares...>* middlewares = nullptr,
std::shared_ptr<boost::asio::io_context> io =
std::make_shared<boost::asio::io_context>()) :
Server(handler,
std::make_unique<tcp::acceptor>(
*io, tcp::endpoint(boost::asio::ip::make_address(bindaddr),
port)),
- adaptor_ctx, middlewares, io)
+ adaptor_ctx, io)
{}
Server(Handler* handler, int existing_socket,
std::shared_ptr<boost::asio::ssl::context> adaptor_ctx,
- std::tuple<Middlewares...>* middlewares = nullptr,
std::shared_ptr<boost::asio::io_context> io =
std::make_shared<boost::asio::io_context>()) :
Server(handler,
std::make_unique<tcp::acceptor>(*io, boost::asio::ip::tcp::v6(),
existing_socket),
- adaptor_ctx, middlewares, io)
+ adaptor_ctx, io)
{}
void setTickFunction(std::chrono::milliseconds d, std::function<void()> f)
@@ -223,11 +218,9 @@
boost::asio::ip::tcp::socket>>::value)
{
adaptorTemp = Adaptor(*ioService, *adaptorCtx);
- auto p =
- std::make_shared<Connection<Adaptor, Handler, Middlewares...>>(
- *ioService, handler, serverName, middlewares,
- getCachedDateStr, timerQueue,
- std::move(adaptorTemp.value()));
+ auto p = std::make_shared<Connection<Adaptor, Handler>>(
+ *ioService, handler, serverName, getCachedDateStr, timerQueue,
+ std::move(adaptorTemp.value()));
acceptor->async_accept(p->socket().next_layer(),
[this, p](boost::system::error_code ec) {
@@ -243,11 +236,9 @@
else
{
adaptorTemp = Adaptor(*ioService);
- auto p =
- std::make_shared<Connection<Adaptor, Handler, Middlewares...>>(
- *ioService, handler, serverName, middlewares,
- getCachedDateStr, timerQueue,
- std::move(adaptorTemp.value()));
+ auto p = std::make_shared<Connection<Adaptor, Handler>>(
+ *ioService, handler, serverName, getCachedDateStr, timerQueue,
+ std::move(adaptorTemp.value()));
acceptor->async_accept(
p->socket(), [this, p](boost::system::error_code ec) {
@@ -279,8 +270,6 @@
std::function<void()> tickFunction;
std::function<void(const boost::system::error_code& ec)> timerHandler;
- std::tuple<Middlewares...>* middlewares;
-
#ifdef BMCWEB_ENABLE_SSL
bool useSsl{false};
#endif
diff --git a/http/middleware_context.h b/http/middleware_context.h
deleted file mode 100644
index fa399d6..0000000
--- a/http/middleware_context.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#pragma once
-
-#include "http_request.h"
-#include "http_response.h"
-#include "utility.h"
-
-namespace crow
-{
-namespace detail
-{
-template <typename... Middlewares>
-struct PartialContext :
- public black_magic::PopBack<Middlewares...>::template rebind<
- PartialContext>,
- public black_magic::LastElementType<Middlewares...>::type::Context
-{
- using parent_context = typename black_magic::PopBack<
- Middlewares...>::template rebind<::crow::detail::PartialContext>;
- template <size_t N>
- using partial = typename std::conditional<
- N == sizeof...(Middlewares) - 1, PartialContext,
- typename parent_context::template partial<N>>::type;
-
- template <typename T>
- typename T::Context& get()
- {
- return static_cast<typename T::Context&>(*this);
- }
-};
-
-template <>
-struct PartialContext<>
-{
- template <size_t>
- using partial = PartialContext;
-};
-
-template <size_t N, typename Context, typename Container, typename CurrentMW,
- typename... Middlewares>
-bool middlewareCallHelper(Container& middlewares, Request& req, Response& res,
- Context& ctx);
-
-template <typename... Middlewares>
-struct Context : private PartialContext<Middlewares...>
-// struct Context : private Middlewares::context... // simple but less type-safe
-{
- template <size_t N, typename Context, typename Container>
- friend typename std::enable_if<(N == 0)>::type
- afterHandlersCallHelper(Container& middlewares, Context& ctx,
- Request& req, Response& res);
- template <size_t N, typename Context, typename Container>
- friend typename std::enable_if<(N > 0)>::type
- afterHandlersCallHelper(Container& middlewares, Context& ctx,
- Request& req, Response& res);
-
- template <size_t N, typename Context, typename Container,
- typename CurrentMW, typename... Middlewares2>
- friend bool middlewareCallHelper(Container& middlewares, Request& req,
- Response& res, Context& ctx);
-
- template <typename T>
- typename T::Context& get()
- {
- return static_cast<typename T::Context&>(*this);
- }
-
- template <size_t N>
- using partial =
- typename PartialContext<Middlewares...>::template partial<N>;
-};
-} // namespace detail
-} // namespace crow
diff --git a/http/websocket.h b/http/websocket.h
index 91b537b..7670196 100644
--- a/http/websocket.h
+++ b/http/websocket.h
@@ -276,7 +276,7 @@
std::function<void(Connection&, const std::string&, bool)> messageHandler;
std::function<void(Connection&, const std::string&)> closeHandler;
std::function<void(Connection&)> errorHandler;
- std::shared_ptr<crow::persistent_data::UserSession> session;
+ std::shared_ptr<persistent_data::UserSession> session;
};
} // namespace websocket
} // namespace crow
diff --git a/include/authorization.hpp b/include/authorization.hpp
index c00090b..1fd1b12 100644
--- a/include/authorization.hpp
+++ b/include/authorization.hpp
@@ -11,7 +11,6 @@
#include <boost/container/flat_set.hpp>
#include <http_utility.hpp>
#include <pam_authenticate.hpp>
-#include <persistent_data_middleware.hpp>
#include <random>
@@ -29,13 +28,13 @@
// user session?
if (req.session != nullptr &&
req.session->persistence ==
- crow::persistent_data::PersistenceType::SINGLE_REQUEST)
+ persistent_data::PersistenceType::SINGLE_REQUEST)
{
persistent_data::SessionStore::getInstance().removeSession(req.session);
}
}
-static const std::shared_ptr<crow::persistent_data::UserSession>
+static const std::shared_ptr<persistent_data::UserSession>
performBasicAuth(std::string_view auth_header)
{
BMCWEB_LOG_DEBUG << "[AuthMiddleware] Basic authentication";
@@ -76,11 +75,11 @@
// This whole flow needs to be revisited anyway, as we can't be
// calling directly into pam for every request
return persistent_data::SessionStore::getInstance().generateUserSession(
- user, crow::persistent_data::PersistenceType::SINGLE_REQUEST,
+ user, persistent_data::PersistenceType::SINGLE_REQUEST,
isConfigureSelfOnly);
}
-static const std::shared_ptr<crow::persistent_data::UserSession>
+static const std::shared_ptr<persistent_data::UserSession>
performTokenAuth(std::string_view auth_header)
{
BMCWEB_LOG_DEBUG << "[AuthMiddleware] Token authentication";
@@ -91,7 +90,7 @@
return session;
}
-static const std::shared_ptr<crow::persistent_data::UserSession>
+static const std::shared_ptr<persistent_data::UserSession>
performXtokenAuth(const crow::Request& req)
{
BMCWEB_LOG_DEBUG << "[AuthMiddleware] X-Auth-Token authentication";
@@ -106,7 +105,7 @@
return session;
}
-static const std::shared_ptr<crow::persistent_data::UserSession>
+static const std::shared_ptr<persistent_data::UserSession>
performCookieAuth(const crow::Request& req)
{
BMCWEB_LOG_DEBUG << "[AuthMiddleware] Cookie authentication";
@@ -131,7 +130,7 @@
std::string_view authKey =
cookieValue.substr(startIndex, endIndex - startIndex);
- const std::shared_ptr<crow::persistent_data::UserSession> session =
+ const std::shared_ptr<persistent_data::UserSession> session =
persistent_data::SessionStore::getInstance().loginSessionByToken(
authKey);
if (session == nullptr)
@@ -149,7 +148,7 @@
return nullptr;
}
- if (csrf.size() != crow::persistent_data::sessionTokenSize)
+ if (csrf.size() != persistent_data::sessionTokenSize)
{
return nullptr;
}
@@ -163,9 +162,9 @@
return session;
}
-static const std::shared_ptr<crow::persistent_data::UserSession>
+static const std::shared_ptr<persistent_data::UserSession>
performTLSAuth(const crow::Request& req, Response& res,
- std::weak_ptr<crow::persistent_data::UserSession> session)
+ std::weak_ptr<persistent_data::UserSession> session)
{
#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
if (auto sp = session.lock())
@@ -235,18 +234,16 @@
return false;
}
-static void
- authenticate(crow::Request& req, Response& res,
- std::weak_ptr<crow::persistent_data::UserSession> session)
+static void authenticate(crow::Request& req, Response& res,
+ std::weak_ptr<persistent_data::UserSession> session)
{
if (isOnWhitelist(req))
{
return;
}
- const crow::persistent_data::AuthConfigMethods& authMethodsConfig =
- crow::persistent_data::SessionStore::getInstance()
- .getAuthMethodsConfig();
+ const persistent_data::AuthConfigMethods& authMethodsConfig =
+ persistent_data::SessionStore::getInstance().getAuthMethodsConfig();
if (req.session == nullptr && authMethodsConfig.tls)
{
diff --git a/include/cors_preflight.hpp b/include/cors_preflight.hpp
new file mode 100644
index 0000000..6fa9c0a
--- /dev/null
+++ b/include/cors_preflight.hpp
@@ -0,0 +1,19 @@
+#pragma once
+
+#include <app.h>
+#include <http_request.h>
+#include <http_response.h>
+
+namespace cors_preflight
+{
+void requestRoutes(App& app)
+{
+ BMCWEB_ROUTE(app, "<str>")
+ .methods(boost::beast::http::verb::options)(
+ [](const crow::Request& req, crow::Response& res) {
+ // An empty body handler that simply returns the headers bmcweb
+ // uses This allows browsers to do their CORS preflight checks
+ res.end();
+ });
+}
+} // namespace cors_preflight
diff --git a/include/dbus_monitor.hpp b/include/dbus_monitor.hpp
index 9e22b9c..3630ecf 100644
--- a/include/dbus_monitor.hpp
+++ b/include/dbus_monitor.hpp
@@ -114,8 +114,7 @@
return 0;
}
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/subscribe")
.requires({"Login"})
diff --git a/include/ibm/management_console_rest.hpp b/include/ibm/management_console_rest.hpp
index 74cddc6..7cb744e 100644
--- a/include/ibm/management_console_rest.hpp
+++ b/include/ibm/management_console_rest.hpp
@@ -574,8 +574,7 @@
res.end();
}
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
// allowed only for admin
diff --git a/include/image_upload.hpp b/include/image_upload.hpp
index c1ec682..af7aeac 100644
--- a/include/image_upload.hpp
+++ b/include/image_upload.hpp
@@ -109,8 +109,7 @@
timeout.async_wait(timeoutHandler);
}
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/upload/image/<str>")
.requires({"ConfigureComponents", "ConfigureManager"})
diff --git a/include/kvm_websocket.hpp b/include/kvm_websocket.hpp
index 6db06fc..4b56f23 100644
--- a/include/kvm_websocket.hpp
+++ b/include/kvm_websocket.hpp
@@ -5,7 +5,6 @@
#include <async_resp.hpp>
#include <boost/container/flat_map.hpp>
-#include <webserver_common.hpp>
namespace crow
{
@@ -155,7 +154,7 @@
std::unique_ptr<KvmSession>>
sessions;
-inline void requestRoutes(CrowApp& app)
+inline void requestRoutes(App& app)
{
sessions.reserve(maxSessions);
diff --git a/include/login_routes.hpp b/include/login_routes.hpp
index 91acda7..bd335e3 100644
--- a/include/login_routes.hpp
+++ b/include/login_routes.hpp
@@ -7,7 +7,6 @@
#include <boost/container/flat_set.hpp>
#include <pam_authenticate.hpp>
-#include <persistent_data_middleware.hpp>
#include <webassets.hpp>
#include <random>
@@ -18,15 +17,8 @@
namespace login_routes
{
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
- static_assert(
- black_magic::Contains<persistent_data::Middleware,
- Middlewares...>::value,
- "token_authorization middleware must be enabled in app to use "
- "auth routes");
-
BMCWEB_ROUTE(app, "/login")
.methods(boost::beast::http::verb::post)([](const crow::Request& req,
crow::Response& res) {
@@ -149,7 +141,7 @@
persistent_data::SessionStore::getInstance()
.generateUserSession(
username,
- crow::persistent_data::PersistenceType::TIMEOUT,
+ persistent_data::PersistenceType::TIMEOUT,
isConfigureSelfOnly);
if (looksLikePhosphorRest)
diff --git a/include/nbd_proxy.hpp b/include/nbd_proxy.hpp
index 212c1db..462e4a7 100644
--- a/include/nbd_proxy.hpp
+++ b/include/nbd_proxy.hpp
@@ -23,7 +23,6 @@
#include <boost/container/flat_map.hpp>
#include <dbus_utility.hpp>
#include <privileges.hpp>
-#include <webserver_common.hpp>
#include <variant>
@@ -248,7 +247,7 @@
std::shared_ptr<NbdProxyServer>>
sessions;
-void requestRoutes(CrowApp& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/nbd/<str>")
.websocket()
diff --git a/include/obmc_console.hpp b/include/obmc_console.hpp
index 9e5e058..af02dde 100644
--- a/include/obmc_console.hpp
+++ b/include/obmc_console.hpp
@@ -6,7 +6,6 @@
#include <async_resp.hpp>
#include <boost/container/flat_map.hpp>
#include <boost/container/flat_set.hpp>
-#include <webserver_common.hpp>
namespace crow
{
@@ -102,7 +101,7 @@
doRead();
}
-void requestRoutes(CrowApp& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/console0")
.requires({"ConfigureComponents", "ConfigureManager"})
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index c41a568..26904d9 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -2072,8 +2072,7 @@
res.end();
}
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/bus/")
.requires({"Login"})
diff --git a/include/persistent_data_middleware.hpp b/include/persistent_data.hpp
similarity index 91%
rename from include/persistent_data_middleware.hpp
rename to include/persistent_data.hpp
index 819d69d..5d4661c 100644
--- a/include/persistent_data_middleware.hpp
+++ b/include/persistent_data.hpp
@@ -16,15 +16,10 @@
#include <fstream>
#include <random>
-namespace crow
-{
-
namespace persistent_data
{
-namespace fs = std::filesystem;
-
-class Middleware
+class ConfigFile
{
uint64_t jsonRevision = 1;
@@ -32,15 +27,12 @@
// todo(ed) should read this from a fixed location somewhere, not CWD
static constexpr const char* filename = "bmcweb_persistent_data.json";
- struct Context
- {};
-
- Middleware()
+ ConfigFile()
{
readData();
}
- ~Middleware()
+ ~ConfigFile()
{
if (persistent_data::SessionStore::getInstance().needsWrite())
{
@@ -48,12 +40,6 @@
}
}
- void beforeHandle(crow::Request& req, Response& res, Context& ctx)
- {}
-
- void afterHandle(Request& req, Response& res, Context& ctx)
- {}
-
// TODO(ed) this should really use protobuf, or some other serialization
// library, but adding another dependency is somewhat outside the scope of
// this application for the moment
@@ -161,9 +147,11 @@
std::ofstream persistentFile(filename);
// set the permission of the file to 640
- fs::perms permission = fs::perms::owner_read | fs::perms::owner_write |
- fs::perms::group_read;
- fs::permissions(filename, permission);
+ std::filesystem::perms permission =
+ std::filesystem::perms::owner_read |
+ std::filesystem::perms::owner_write |
+ std::filesystem::perms::group_read;
+ std::filesystem::permissions(filename, permission);
nlohmann::json data{
{"sessions", SessionStore::getInstance().authTokens},
@@ -176,5 +164,10 @@
std::string systemUuid{""};
};
+inline ConfigFile& getConfig()
+{
+ static ConfigFile f;
+ return f;
+}
+
} // namespace persistent_data
-} // namespace crow
diff --git a/include/redfish_v1.hpp b/include/redfish_v1.hpp
index dfdb900..429fb08 100644
--- a/include/redfish_v1.hpp
+++ b/include/redfish_v1.hpp
@@ -2,19 +2,11 @@
#include <app.h>
-#include <boost/algorithm/string.hpp>
-#include <dbus_singleton.hpp>
-#include <persistent_data_middleware.hpp>
-
-#include <fstream>
-#include <streambuf>
-#include <string>
namespace crow
{
namespace redfish
{
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/redfish/")
.methods(boost::beast::http::verb::get)(
diff --git a/include/security_headers.hpp b/include/security_headers.hpp
new file mode 100644
index 0000000..cf845c1
--- /dev/null
+++ b/include/security_headers.hpp
@@ -0,0 +1,61 @@
+#pragma once
+
+#include <http_response.h>
+
+inline void addSecurityHeaders(crow::Response& res)
+{
+ /*
+ TODO(ed) these should really check content types. for example,
+ X-UA-Compatible header doesn't make sense when retrieving a JSON or
+ javascript file. It doesn't hurt anything, it's just ugly.
+ */
+ using bf = boost::beast::http::field;
+ res.addHeader(bf::strict_transport_security, "max-age=31536000; "
+ "includeSubdomains; "
+ "preload");
+ res.addHeader(bf::x_frame_options, "DENY");
+
+ res.addHeader(bf::pragma, "no-cache");
+ res.addHeader(bf::cache_control, "no-Store,no-Cache");
+
+ res.addHeader("X-XSS-Protection", "1; "
+ "mode=block");
+ res.addHeader("X-Content-Type-Options", "nosniff");
+
+#ifndef BMCWEB_INSECURE_DISABLE_XSS_PREVENTION
+ res.addHeader("Content-Security-Policy", "default-src 'none'; "
+ "img-src 'self' data:; "
+ "font-src 'self'; "
+ "style-src 'self'; "
+ "script-src 'self'; "
+ "connect-src 'self' wss:");
+ // The KVM currently needs to load images from base64 encoded
+ // strings. img-src 'self' data: is used to allow that.
+ // https://stackoverflow.com/questions/18447970/content-security-policy-data-not-working-for-base64-images-in-chrome-28
+
+#else
+ // If XSS is disabled, we need to allow loading from addresses other
+ // than self, as the BMC will be hosted elsewhere.
+ res.addHeader("Content-Security-Policy", "default-src 'none'; "
+ "img-src *; "
+ "font-src *; "
+ "style-src *; "
+ "script-src *; "
+ "connect-src *");
+
+ const std::string_view origin = req.getHeaderValue("Origin");
+ res.addHeader(bf::access_control_allow_origin, origin);
+ res.addHeader(bf::access_control_allow_methods, "GET, "
+ "POST, "
+ "PUT, "
+ "PATCH, "
+ "DELETE");
+ res.addHeader(bf::access_control_allow_credentials, "true");
+ res.addHeader(bf::access_control_allow_headers, "Origin, "
+ "Content-Type, "
+ "Accept, "
+ "Cookie, "
+ "X-XSRF-TOKEN");
+
+#endif
+}
diff --git a/include/security_headers_middleware.hpp b/include/security_headers_middleware.hpp
deleted file mode 100644
index d3c3335..0000000
--- a/include/security_headers_middleware.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#pragma once
-
-#include <http_request.h>
-#include <http_response.h>
-
-namespace crow
-{
-struct SecurityHeadersMiddleware
-{
- struct Context
- {};
-
- void beforeHandle(crow::Request& req, Response& res, Context& ctx)
- {
-#ifdef BMCWEB_INSECURE_DISABLE_XSS_PREVENTION
- if (boost::beast::http::verb::options == req.method())
- {
- res.end();
- }
-#endif
- }
-
- void afterHandle(Request& req, Response& res, Context& ctx)
- {
- /*
- TODO(ed) these should really check content types. for example,
- X-UA-Compatible header doesn't make sense when retrieving a JSON or
- javascript file. It doesn't hurt anything, it's just ugly.
- */
- using bf = boost::beast::http::field;
- res.addHeader(bf::strict_transport_security, "max-age=31536000; "
- "includeSubdomains; "
- "preload");
- res.addHeader(bf::x_frame_options, "DENY");
-
- res.addHeader(bf::pragma, "no-cache");
- res.addHeader(bf::cache_control, "no-Store,no-Cache");
-
- res.addHeader("X-XSS-Protection", "1; "
- "mode=block");
- res.addHeader("X-Content-Type-Options", "nosniff");
-
-#ifndef BMCWEB_INSECURE_DISABLE_XSS_PREVENTION
- res.addHeader("Content-Security-Policy", "default-src 'none'; "
- "img-src 'self' data:; "
- "font-src 'self'; "
- "style-src 'self'; "
- "script-src 'self'; "
- "connect-src 'self' wss:");
- // The KVM currently needs to load images from base64 encoded
- // strings. img-src 'self' data: is used to allow that.
- // https://stackoverflow.com/questions/18447970/content-security-policy-data-not-working-for-base64-images-in-chrome-28
-
-#else
- // If XSS is disabled, we need to allow loading from addresses other
- // than self, as the BMC will be hosted elsewhere.
- res.addHeader("Content-Security-Policy", "default-src 'none'; "
- "img-src *; "
- "font-src *; "
- "style-src *; "
- "script-src *; "
- "connect-src *");
-
- const std::string_view origin = req.getHeaderValue("Origin");
- res.addHeader(bf::access_control_allow_origin, origin);
- res.addHeader(bf::access_control_allow_methods, "GET, "
- "POST, "
- "PUT, "
- "PATCH, "
- "DELETE");
- res.addHeader(bf::access_control_allow_credentials, "true");
- res.addHeader(bf::access_control_allow_headers, "Origin, "
- "Content-Type, "
- "Accept, "
- "Cookie, "
- "X-XSRF-TOKEN");
-
-#endif
- }
-};
-} // namespace crow
diff --git a/include/sessions.hpp b/include/sessions.hpp
index 217ce95..3a787fc 100644
--- a/include/sessions.hpp
+++ b/include/sessions.hpp
@@ -20,9 +20,6 @@
#include <ibm/locks.hpp>
#endif
-namespace crow
-{
-
namespace persistent_data
{
@@ -364,10 +361,6 @@
return std::chrono::seconds(timeoutInMinutes).count();
};
- // Persistent data middleware needs to be able to serialize our authTokens
- // structure, which is private
- friend Middleware;
-
static SessionStore& getInstance()
{
static SessionStore sessionStore;
@@ -377,6 +370,16 @@
SessionStore(const SessionStore&) = delete;
SessionStore& operator=(const SessionStore&) = delete;
+ std::unordered_map<std::string, std::shared_ptr<UserSession>,
+ std::hash<std::string>,
+ crow::utility::ConstantTimeCompare>
+ authTokens;
+
+ std::chrono::time_point<std::chrono::steady_clock> lastTimeoutUpdate;
+ bool needWrite{false};
+ std::chrono::minutes timeoutInMinutes;
+ AuthConfigMethods authMethodsConfig;
+
private:
SessionStore() : timeoutInMinutes(60)
{}
@@ -408,32 +411,20 @@
}
}
}
-
- std::chrono::time_point<std::chrono::steady_clock> lastTimeoutUpdate;
- std::unordered_map<std::string, std::shared_ptr<UserSession>,
- std::hash<std::string>,
- crow::utility::ConstantTimeCompare>
- authTokens;
- bool needWrite{false};
- std::chrono::minutes timeoutInMinutes;
- AuthConfigMethods authMethodsConfig;
};
} // namespace persistent_data
-} // namespace crow
// to_json(...) definition for objects of UserSession type
namespace nlohmann
{
template <>
-struct adl_serializer<std::shared_ptr<crow::persistent_data::UserSession>>
+struct adl_serializer<std::shared_ptr<persistent_data::UserSession>>
{
- static void
- to_json(nlohmann::json& j,
- const std::shared_ptr<crow::persistent_data::UserSession>& p)
+ static void to_json(nlohmann::json& j,
+ const std::shared_ptr<persistent_data::UserSession>& p)
{
- if (p->persistence !=
- crow::persistent_data::PersistenceType::SINGLE_REQUEST)
+ if (p->persistence != persistent_data::PersistenceType::SINGLE_REQUEST)
{
#ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
j = nlohmann::json{
@@ -452,10 +443,10 @@
};
template <>
-struct adl_serializer<crow::persistent_data::AuthConfigMethods>
+struct adl_serializer<persistent_data::AuthConfigMethods>
{
static void to_json(nlohmann::json& j,
- const crow::persistent_data::AuthConfigMethods& c)
+ const persistent_data::AuthConfigMethods& c)
{
j = nlohmann::json{{"XToken", c.xtoken},
{"Cookie", c.cookie},
diff --git a/include/vm_websocket.hpp b/include/vm_websocket.hpp
index dc352e2..33fadd0 100644
--- a/include/vm_websocket.hpp
+++ b/include/vm_websocket.hpp
@@ -5,7 +5,6 @@
#include <boost/beast/core/flat_static_buffer.hpp>
#include <boost/process.hpp>
-#include <webserver_common.hpp>
#include <csignal>
@@ -155,8 +154,7 @@
static std::shared_ptr<Handler> handler;
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
BMCWEB_ROUTE(app, "/vm/0/0")
.requires({"ConfigureComponents", "ConfigureManager"})
diff --git a/include/webassets.hpp b/include/webassets.hpp
index bb9ab7f..54d3c98 100644
--- a/include/webassets.hpp
+++ b/include/webassets.hpp
@@ -27,8 +27,7 @@
}
};
-template <typename... Middlewares>
-void requestRoutes(Crow<Middlewares...>& app)
+void requestRoutes(App& app)
{
const static boost::container::flat_map<const char*, const char*, CmpStr>
contentTypes{
diff --git a/include/webserver_common.hpp b/include/webserver_common.hpp
deleted file mode 100644
index d8876d4..0000000
--- a/include/webserver_common.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-// 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 "persistent_data_middleware.hpp"
-#include "security_headers_middleware.hpp"
-
-using CrowApp = crow::App<crow::SecurityHeadersMiddleware,
- crow::persistent_data::Middleware>;
diff --git a/redfish-core/include/node.hpp b/redfish-core/include/node.hpp
index d13f097..be098ca 100644
--- a/redfish-core/include/node.hpp
+++ b/redfish-core/include/node.hpp
@@ -19,7 +19,6 @@
#include "http_response.h"
#include "privileges.hpp"
-#include "webserver_common.hpp"
#include <error_messages.hpp>
@@ -54,7 +53,7 @@
{
public:
template <typename... Params>
- Node(CrowApp& app, std::string&& entityUrl, Params... paramsIn)
+ Node(App& app, std::string&& entityUrl, Params... paramsIn)
{
crow::DynamicRule& get = app.routeDynamic(entityUrl.c_str());
getRule = &get;
diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index bdec359..18a0353 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -41,7 +41,6 @@
#include "../lib/virtual_media.hpp"
#endif // BMCWEB_ENABLE_VM_NBDPROXY
#include "../lib/hypervisor_ethernet.hpp"
-#include "webserver_common.hpp"
namespace redfish
{
@@ -58,7 +57,7 @@
*
* @param[in] app Crow app on which Redfish will initialize
*/
- RedfishService(CrowApp& app)
+ RedfishService(App& app)
{
nodes.emplace_back(std::make_unique<AccountService>(app));
nodes.emplace_back(std::make_unique<AccountsCollection>(app));
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 8ef1434..0522149 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -19,6 +19,7 @@
#include <dbus_utility.hpp>
#include <error_messages.hpp>
#include <openbmc_dbus_rest.hpp>
+#include <persistent_data.hpp>
#include <utils/json_utils.hpp>
#include <variant>
@@ -556,7 +557,7 @@
class AccountService : public Node
{
public:
- AccountService(CrowApp& app) :
+ AccountService(App& app) :
Node(app, "/redfish/v1/AccountService/"), app(app)
{
entityPrivileges = {
@@ -909,9 +910,8 @@
}
// Make a copy of methods configuration
- crow::persistent_data::AuthConfigMethods authMethodsConfig =
- crow::persistent_data::SessionStore::getInstance()
- .getAuthMethodsConfig();
+ persistent_data::AuthConfigMethods authMethodsConfig =
+ persistent_data::SessionStore::getInstance().getAuthMethodsConfig();
if (basicAuth)
{
@@ -948,11 +948,10 @@
return;
}
- crow::persistent_data::SessionStore::getInstance()
- .updateAuthMethodsConfig(authMethodsConfig);
+ persistent_data::SessionStore::getInstance().updateAuthMethodsConfig(
+ authMethodsConfig);
// Save configuration immediately
- app.template getMiddleware<crow::persistent_data::Middleware>()
- .writeData();
+ persistent_data::getConfig().writeData();
messages::success(asyncResp->res);
}
@@ -1126,9 +1125,8 @@
void doGet(crow::Response& res, const crow::Request& req,
const std::vector<std::string>& params) override
{
- const crow::persistent_data::AuthConfigMethods& authMethodsConfig =
- crow::persistent_data::SessionStore::getInstance()
- .getAuthMethodsConfig();
+ const persistent_data::AuthConfigMethods& authMethodsConfig =
+ persistent_data::SessionStore::getInstance().getAuthMethodsConfig();
auto asyncResp = std::make_shared<AsyncResp>(res);
res.jsonValue = {
@@ -1315,13 +1313,13 @@
}
}
- CrowApp& app;
+ App& app;
};
class AccountsCollection : public Node
{
public:
- AccountsCollection(CrowApp& app) :
+ AccountsCollection(App& app) :
Node(app, "/redfish/v1/AccountService/Accounts/")
{
entityPrivileges = {
@@ -1510,7 +1508,7 @@
class ManagerAccount : public Node
{
public:
- ManagerAccount(CrowApp& app) :
+ ManagerAccount(App& app) :
Node(app, "/redfish/v1/AccountService/Accounts/<str>/", std::string())
{
entityPrivileges = {
diff --git a/redfish-core/lib/bios.hpp b/redfish-core/lib/bios.hpp
index 0a0effa..b997ad4 100644
--- a/redfish-core/lib/bios.hpp
+++ b/redfish-core/lib/bios.hpp
@@ -11,7 +11,7 @@
class BiosService : public Node
{
public:
- BiosService(CrowApp& app) : Node(app, "/redfish/v1/Systems/system/Bios/")
+ BiosService(App& app) : Node(app, "/redfish/v1/Systems/system/Bios/")
{
entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}}};
}
@@ -43,7 +43,7 @@
class BiosReset : public Node
{
public:
- BiosReset(CrowApp& app) :
+ BiosReset(App& app) :
Node(app, "/redfish/v1/Systems/system/Bios/Actions/Bios.ResetBios/")
{
entityPrivileges = {
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index 7a94935..6ade4e5 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -52,8 +52,7 @@
class CertificateService : public Node
{
public:
- CertificateService(CrowApp& app) :
- Node(app, "/redfish/v1/CertificateService/")
+ CertificateService(App& app) : Node(app, "/redfish/v1/CertificateService/")
{
// TODO: Issue#61 No entries are available for Certificate
// service at https://www.dmtf.org/standards/redfish
@@ -249,7 +248,7 @@
class CertificateActionGenerateCSR : public Node
{
public:
- CertificateActionGenerateCSR(CrowApp& app) :
+ CertificateActionGenerateCSR(App& app) :
Node(app, "/redfish/v1/CertificateService/Actions/"
"CertificateService.GenerateCSR/")
{
@@ -687,7 +686,7 @@
class CertificateActionsReplaceCertificate : public Node
{
public:
- CertificateActionsReplaceCertificate(CrowApp& app) :
+ CertificateActionsReplaceCertificate(App& app) :
Node(app, "/redfish/v1/CertificateService/Actions/"
"CertificateService.ReplaceCertificate/")
{
@@ -812,8 +811,7 @@
class HTTPSCertificate : public Node
{
public:
- template <typename CrowApp>
- HTTPSCertificate(CrowApp& app) :
+ HTTPSCertificate(App& app) :
Node(app,
"/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/"
"<str>/",
@@ -858,8 +856,7 @@
class HTTPSCertificateCollection : public Node
{
public:
- template <typename CrowApp>
- HTTPSCertificateCollection(CrowApp& app) :
+ HTTPSCertificateCollection(App& app) :
Node(app,
"/redfish/v1/Managers/bmc/NetworkProtocol/HTTPS/Certificates/")
{
@@ -970,8 +967,7 @@
class CertificateLocations : public Node
{
public:
- template <typename CrowApp>
- CertificateLocations(CrowApp& app) :
+ CertificateLocations(App& app) :
Node(app, "/redfish/v1/CertificateService/CertificateLocations/")
{
entityPrivileges = {
@@ -1061,8 +1057,7 @@
class LDAPCertificateCollection : public Node
{
public:
- template <typename CrowApp>
- LDAPCertificateCollection(CrowApp& app) :
+ LDAPCertificateCollection(App& app) :
Node(app, "/redfish/v1/AccountService/LDAP/Certificates/")
{
entityPrivileges = {
@@ -1165,8 +1160,7 @@
class LDAPCertificate : public Node
{
public:
- template <typename CrowApp>
- LDAPCertificate(CrowApp& app) :
+ LDAPCertificate(App& app) :
Node(app, "/redfish/v1/AccountService/LDAP/Certificates/<str>/",
std::string())
{
@@ -1206,8 +1200,7 @@
class TrustStoreCertificateCollection : public Node
{
public:
- template <typename CrowApp>
- TrustStoreCertificateCollection(CrowApp& app) :
+ TrustStoreCertificateCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/Truststore/Certificates/")
{
entityPrivileges = {
@@ -1311,8 +1304,7 @@
class TrustStoreCertificate : public Node
{
public:
- template <typename CrowApp>
- TrustStoreCertificate(CrowApp& app) :
+ TrustStoreCertificate(App& app) :
Node(app, "/redfish/v1/Managers/bmc/Truststore/Certificates/<str>/",
std::string())
{
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 7a7748a..ce0a8c1 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -160,7 +160,7 @@
class ChassisCollection : public Node
{
public:
- ChassisCollection(CrowApp& app) : Node(app, "/redfish/v1/Chassis/")
+ ChassisCollection(App& app) : Node(app, "/redfish/v1/Chassis/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -227,8 +227,7 @@
class Chassis : public Node
{
public:
- Chassis(CrowApp& app) :
- Node(app, "/redfish/v1/Chassis/<str>/", std::string())
+ Chassis(App& app) : Node(app, "/redfish/v1/Chassis/<str>/", std::string())
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -556,7 +555,7 @@
class ChassisResetAction : public Node
{
public:
- ChassisResetAction(CrowApp& app) :
+ ChassisResetAction(App& app) :
Node(app, "/redfish/v1/Chassis/<str>/Actions/Chassis.Reset/",
std::string())
{
@@ -605,7 +604,7 @@
/*
* Default Constructor
*/
- ChassisResetActionInfo(CrowApp& app) :
+ ChassisResetActionInfo(App& app) :
Node(app, "/redfish/v1/Chassis/<str>/ResetActionInfo/", std::string())
{
entityPrivileges = {
diff --git a/redfish-core/lib/cpudimm.hpp b/redfish-core/lib/cpudimm.hpp
index 0ea5e87..0510f2b 100644
--- a/redfish-core/lib/cpudimm.hpp
+++ b/redfish-core/lib/cpudimm.hpp
@@ -1028,7 +1028,7 @@
/*
* Default Constructor
*/
- ProcessorCollection(CrowApp& app) :
+ ProcessorCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/Processors/")
{
entityPrivileges = {
@@ -1066,7 +1066,7 @@
/*
* Default Constructor
*/
- Processor(CrowApp& app) :
+ Processor(App& app) :
Node(app, "/redfish/v1/Systems/system/Processors/<str>/", std::string())
{
entityPrivileges = {
@@ -1114,8 +1114,7 @@
/*
* Default Constructor
*/
- MemoryCollection(CrowApp& app) :
- Node(app, "/redfish/v1/Systems/system/Memory/")
+ MemoryCollection(App& app) : Node(app, "/redfish/v1/Systems/system/Memory/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -1149,7 +1148,7 @@
/*
* Default Constructor
*/
- Memory(CrowApp& app) :
+ Memory(App& app) :
Node(app, "/redfish/v1/Systems/system/Memory/<str>/", std::string())
{
entityPrivileges = {
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 21443f4..a47d4b1 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -1003,8 +1003,7 @@
class EthernetCollection : public Node
{
public:
- template <typename CrowApp>
- EthernetCollection(CrowApp& app) :
+ EthernetCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/EthernetInterfaces/")
{
entityPrivileges = {
@@ -1076,8 +1075,7 @@
/*
* Default Constructor
*/
- template <typename CrowApp>
- EthernetInterface(CrowApp& app) :
+ EthernetInterface(App& app) :
Node(app, "/redfish/v1/Managers/bmc/EthernetInterfaces/<str>/",
std::string())
{
@@ -2066,8 +2064,7 @@
/*
* Default Constructor
*/
- template <typename CrowApp>
- VlanNetworkInterface(CrowApp& app) :
+ VlanNetworkInterface(App& app) :
Node(app,
"/redfish/v1/Managers/bmc/EthernetInterfaces/<str>/VLANs/<str>/",
std::string(), std::string())
@@ -2309,8 +2306,7 @@
class VlanNetworkInterfaceCollection : public Node
{
public:
- template <typename CrowApp>
- VlanNetworkInterfaceCollection(CrowApp& app) :
+ VlanNetworkInterfaceCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/EthernetInterfaces/<str>/VLANs/",
std::string())
{
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index b532815..26cd80a 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -39,7 +39,7 @@
class EventService : public Node
{
public:
- EventService(CrowApp& app) : Node(app, "/redfish/v1/EventService/")
+ EventService(App& app) : Node(app, "/redfish/v1/EventService/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -153,7 +153,7 @@
class SubmitTestEvent : public Node
{
public:
- SubmitTestEvent(CrowApp& app) :
+ SubmitTestEvent(App& app) :
Node(app,
"/redfish/v1/EventService/Actions/EventService.SubmitTestEvent/")
{
@@ -179,7 +179,7 @@
class EventDestinationCollection : public Node
{
public:
- EventDestinationCollection(CrowApp& app) :
+ EventDestinationCollection(App& app) :
Node(app, "/redfish/v1/EventService/Subscriptions/")
{
entityPrivileges = {
@@ -450,7 +450,7 @@
class EventServiceSSE : public Node
{
public:
- EventServiceSSE(CrowApp& app) :
+ EventServiceSSE(App& app) :
Node(app, "/redfish/v1/EventService/Subscriptions/SSE/")
{
entityPrivileges = {
@@ -555,7 +555,7 @@
class EventDestination : public Node
{
public:
- EventDestination(CrowApp& app) :
+ EventDestination(App& app) :
Node(app, "/redfish/v1/EventService/Subscriptions/<str>/",
std::string())
{
diff --git a/redfish-core/lib/hypervisor_ethernet.hpp b/redfish-core/lib/hypervisor_ethernet.hpp
index bcd5afe..f0955b2 100644
--- a/redfish-core/lib/hypervisor_ethernet.hpp
+++ b/redfish-core/lib/hypervisor_ethernet.hpp
@@ -22,8 +22,7 @@
/*
* Default Constructor
*/
- HypervisorSystem(CrowApp& app) :
- Node(app, "/redfish/v1/Systems/hypervisor/")
+ HypervisorSystem(App& app) : Node(app, "/redfish/v1/Systems/hypervisor/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -78,8 +77,7 @@
class HypervisorInterfaceCollection : public Node
{
public:
- template <typename CrowApp>
- HypervisorInterfaceCollection(CrowApp& app) :
+ HypervisorInterfaceCollection(App& app) :
Node(app, "/redfish/v1/Systems/hypervisor/EthernetInterfaces/")
{
entityPrivileges = {
@@ -473,8 +471,7 @@
/*
* Default Constructor
*/
- template <typename CrowApp>
- HypervisorInterface(CrowApp& app) :
+ HypervisorInterface(App& app) :
Node(app, "/redfish/v1/Systems/hypervisor/EthernetInterfaces/<str>/",
std::string())
{
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index aed37b0..a884290 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -930,8 +930,7 @@
class SystemLogServiceCollection : public Node
{
public:
- template <typename CrowApp>
- SystemLogServiceCollection(CrowApp& app) :
+ SystemLogServiceCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/")
{
entityPrivileges = {
@@ -1011,8 +1010,7 @@
class EventLogService : public Node
{
public:
- template <typename CrowApp>
- EventLogService(CrowApp& app) :
+ EventLogService(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/EventLog/")
{
entityPrivileges = {
@@ -1051,7 +1049,7 @@
class JournalEventLogClear : public Node
{
public:
- JournalEventLogClear(CrowApp& app) :
+ JournalEventLogClear(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/EventLog/Actions/"
"LogService.ClearLog/")
{
@@ -1199,8 +1197,7 @@
class JournalEventLogEntryCollection : public Node
{
public:
- template <typename CrowApp>
- JournalEventLogEntryCollection(CrowApp& app) :
+ JournalEventLogEntryCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/EventLog/Entries/")
{
entityPrivileges = {
@@ -1301,7 +1298,7 @@
class JournalEventLogEntry : public Node
{
public:
- JournalEventLogEntry(CrowApp& app) :
+ JournalEventLogEntry(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/EventLog/Entries/<str>/",
std::string())
@@ -1378,8 +1375,7 @@
class DBusEventLogEntryCollection : public Node
{
public:
- template <typename CrowApp>
- DBusEventLogEntryCollection(CrowApp& app) :
+ DBusEventLogEntryCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/EventLog/Entries/")
{
entityPrivileges = {
@@ -1519,7 +1515,7 @@
class DBusEventLogEntry : public Node
{
public:
- DBusEventLogEntry(CrowApp& app) :
+ DBusEventLogEntry(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/EventLog/Entries/<str>/",
std::string())
@@ -1675,8 +1671,7 @@
class BMCLogServiceCollection : public Node
{
public:
- template <typename CrowApp>
- BMCLogServiceCollection(CrowApp& app) :
+ BMCLogServiceCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/")
{
entityPrivileges = {
@@ -1723,8 +1718,7 @@
class BMCJournalLogService : public Node
{
public:
- template <typename CrowApp>
- BMCJournalLogService(CrowApp& app) :
+ BMCJournalLogService(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Journal/")
{
entityPrivileges = {
@@ -1804,8 +1798,7 @@
class BMCJournalLogEntryCollection : public Node
{
public:
- template <typename CrowApp>
- BMCJournalLogEntryCollection(CrowApp& app) :
+ BMCJournalLogEntryCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Journal/Entries/")
{
entityPrivileges = {
@@ -1908,7 +1901,7 @@
class BMCJournalLogEntry : public Node
{
public:
- BMCJournalLogEntry(CrowApp& app) :
+ BMCJournalLogEntry(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Journal/Entries/<str>/",
std::string())
{
@@ -1995,8 +1988,7 @@
class BMCDumpService : public Node
{
public:
- template <typename CrowApp>
- BMCDumpService(CrowApp& app) :
+ BMCDumpService(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/")
{
entityPrivileges = {
@@ -2039,8 +2031,7 @@
class BMCDumpEntryCollection : public Node
{
public:
- template <typename CrowApp>
- BMCDumpEntryCollection(CrowApp& app) :
+ BMCDumpEntryCollection(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/Entries/")
{
entityPrivileges = {
@@ -2076,7 +2067,7 @@
class BMCDumpEntry : public Node
{
public:
- BMCDumpEntry(CrowApp& app) :
+ BMCDumpEntry(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/Entries/<str>/",
std::string())
{
@@ -2118,7 +2109,7 @@
class BMCDumpCreate : public Node
{
public:
- BMCDumpCreate(CrowApp& app) :
+ BMCDumpCreate(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/"
"Actions/Oem/"
"OemLogService.CollectDiagnosticData/")
@@ -2143,7 +2134,7 @@
class BMCDumpEntryDownload : public Node
{
public:
- BMCDumpEntryDownload(CrowApp& app) :
+ BMCDumpEntryDownload(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/attachment/<str>/",
std::string())
{
@@ -2173,7 +2164,7 @@
class BMCDumpClear : public Node
{
public:
- BMCDumpClear(CrowApp& app) :
+ BMCDumpClear(App& app) :
Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/"
"Actions/"
"LogService.ClearLog/")
@@ -2198,8 +2189,7 @@
class SystemDumpService : public Node
{
public:
- template <typename CrowApp>
- SystemDumpService(CrowApp& app) :
+ SystemDumpService(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Dump/")
{
entityPrivileges = {
@@ -2243,8 +2233,7 @@
class SystemDumpEntryCollection : public Node
{
public:
- template <typename CrowApp>
- SystemDumpEntryCollection(CrowApp& app) :
+ SystemDumpEntryCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Dump/Entries/")
{
entityPrivileges = {
@@ -2280,7 +2269,7 @@
class SystemDumpEntry : public Node
{
public:
- SystemDumpEntry(CrowApp& app) :
+ SystemDumpEntry(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Dump/Entries/<str>/",
std::string())
{
@@ -2322,7 +2311,7 @@
class SystemDumpCreate : public Node
{
public:
- SystemDumpCreate(CrowApp& app) :
+ SystemDumpCreate(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Dump/"
"Actions/Oem/"
"OemLogService.CollectDiagnosticData/")
@@ -2347,7 +2336,7 @@
class SystemDumpEntryDownload : public Node
{
public:
- SystemDumpEntryDownload(CrowApp& app) :
+ SystemDumpEntryDownload(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Dump/attachment/<str>/",
std::string())
@@ -2378,7 +2367,7 @@
class SystemDumpClear : public Node
{
public:
- SystemDumpClear(CrowApp& app) :
+ SystemDumpClear(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Dump/"
"Actions/"
"LogService.ClearLog/")
@@ -2403,8 +2392,7 @@
class CrashdumpService : public Node
{
public:
- template <typename CrowApp>
- CrashdumpService(CrowApp& app) :
+ CrashdumpService(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Crashdump/")
{
// Note: Deviated from redfish privilege registry for GET & HEAD
@@ -2463,7 +2451,7 @@
class CrashdumpClear : public Node
{
public:
- CrashdumpClear(CrowApp& app) :
+ CrashdumpClear(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Crashdump/Actions/"
"LogService.ClearLog/")
{
@@ -2556,8 +2544,7 @@
class CrashdumpEntryCollection : public Node
{
public:
- template <typename CrowApp>
- CrashdumpEntryCollection(CrowApp& app) :
+ CrashdumpEntryCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/Crashdump/Entries/")
{
// Note: Deviated from redfish privilege registry for GET & HEAD
@@ -2642,7 +2629,7 @@
class CrashdumpEntry : public Node
{
public:
- CrashdumpEntry(CrowApp& app) :
+ CrashdumpEntry(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Crashdump/Entries/<str>/",
std::string())
@@ -2676,7 +2663,7 @@
class CrashdumpFile : public Node
{
public:
- CrashdumpFile(CrowApp& app) :
+ CrashdumpFile(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Crashdump/Entries/<str>/"
"<str>/",
@@ -2779,7 +2766,7 @@
class OnDemandCrashdump : public Node
{
public:
- OnDemandCrashdump(CrowApp& app) :
+ OnDemandCrashdump(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Crashdump/Actions/Oem/"
"Crashdump.OnDemand/")
@@ -2851,7 +2838,7 @@
class TelemetryCrashdump : public Node
{
public:
- TelemetryCrashdump(CrowApp& app) :
+ TelemetryCrashdump(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Crashdump/Actions/Oem/"
"Crashdump.Telemetry/")
@@ -2923,7 +2910,7 @@
class SendRawPECI : public Node
{
public:
- SendRawPECI(CrowApp& app) :
+ SendRawPECI(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/Crashdump/Actions/Oem/"
"Crashdump.SendRawPeci/")
@@ -3020,7 +3007,7 @@
class DBusLogServiceActionsClear : public Node
{
public:
- DBusLogServiceActionsClear(CrowApp& app) :
+ DBusLogServiceActionsClear(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/EventLog/Actions/"
"LogService.ClearLog/")
{
@@ -3075,7 +3062,7 @@
class PostCodesLogService : public Node
{
public:
- PostCodesLogService(CrowApp& app) :
+ PostCodesLogService(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/PostCodes/")
{
entityPrivileges = {
@@ -3113,7 +3100,7 @@
class PostCodesClear : public Node
{
public:
- PostCodesClear(CrowApp& app) :
+ PostCodesClear(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/PostCodes/Actions/"
"LogService.ClearLog/")
{
@@ -3392,8 +3379,7 @@
class PostCodesEntryCollection : public Node
{
public:
- template <typename CrowApp>
- PostCodesEntryCollection(CrowApp& app) :
+ PostCodesEntryCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/LogServices/PostCodes/Entries/")
{
entityPrivileges = {
@@ -3441,7 +3427,7 @@
class PostCodesEntry : public Node
{
public:
- PostCodesEntry(CrowApp& app) :
+ PostCodesEntry(App& app) :
Node(app,
"/redfish/v1/Systems/system/LogServices/PostCodes/Entries/<str>/",
std::string())
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index b65f89d..552c264 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -73,7 +73,7 @@
class ManagerResetAction : public Node
{
public:
- ManagerResetAction(CrowApp& app) :
+ ManagerResetAction(App& app) :
Node(app, "/redfish/v1/Managers/bmc/Actions/Manager.Reset/")
{
entityPrivileges = {
@@ -119,7 +119,7 @@
class ManagerResetToDefaultsAction : public Node
{
public:
- ManagerResetToDefaultsAction(CrowApp& app) :
+ ManagerResetToDefaultsAction(App& app) :
Node(app, "/redfish/v1/Managers/bmc/Actions/Manager.ResetToDefaults/")
{
entityPrivileges = {
@@ -194,7 +194,7 @@
/*
* Default Constructor
*/
- ManagerResetActionInfo(CrowApp& app) :
+ ManagerResetActionInfo(App& app) :
Node(app, "/redfish/v1/Managers/bmc/ResetActionInfo/")
{
entityPrivileges = {
@@ -1659,10 +1659,10 @@
class Manager : public Node
{
public:
- Manager(CrowApp& app) : Node(app, "/redfish/v1/Managers/bmc/")
+ Manager(App& app) : Node(app, "/redfish/v1/Managers/bmc/")
{
- uuid = app.template getMiddleware<crow::persistent_data::Middleware>()
- .systemUuid;
+
+ uuid = persistent_data::getConfig().systemUuid;
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
{boost::beast::http::verb::head, {{"Login"}}},
@@ -2076,7 +2076,7 @@
class ManagerCollection : public Node
{
public:
- ManagerCollection(CrowApp& app) : Node(app, "/redfish/v1/Managers/")
+ ManagerCollection(App& app) : Node(app, "/redfish/v1/Managers/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index 57e0ad2..63aa5f3 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -28,8 +28,7 @@
class MessageRegistryFileCollection : public Node
{
public:
- template <typename CrowApp>
- MessageRegistryFileCollection(CrowApp& app) :
+ MessageRegistryFileCollection(App& app) :
Node(app, "/redfish/v1/Registries/")
{
entityPrivileges = {
@@ -71,8 +70,7 @@
class MessageRegistryFile : public Node
{
public:
- template <typename CrowApp>
- MessageRegistryFile(CrowApp& app) :
+ MessageRegistryFile(App& app) :
Node(app, "/redfish/v1/Registries/<str>/", std::string())
{
entityPrivileges = {
@@ -157,8 +155,7 @@
class MessageRegistry : public Node
{
public:
- template <typename CrowApp>
- MessageRegistry(CrowApp& app) :
+ MessageRegistry(App& app) :
Node(app, "/redfish/v1/Registries/<str>/<str>/", std::string(),
std::string())
{
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index b32fde1..3e48efb 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -130,7 +130,7 @@
class NetworkProtocol : public Node
{
public:
- NetworkProtocol(CrowApp& app) :
+ NetworkProtocol(App& app) :
Node(app, "/redfish/v1/Managers/bmc/NetworkProtocol/")
{
entityPrivileges = {
diff --git a/redfish-core/lib/pcie.hpp b/redfish-core/lib/pcie.hpp
index ac2a2f9..e2f3591 100644
--- a/redfish-core/lib/pcie.hpp
+++ b/redfish-core/lib/pcie.hpp
@@ -72,8 +72,7 @@
class SystemPCIeDeviceCollection : public Node
{
public:
- template <typename CrowApp>
- SystemPCIeDeviceCollection(CrowApp& app) :
+ SystemPCIeDeviceCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/PCIeDevices/")
{
entityPrivileges = {
@@ -107,7 +106,7 @@
class SystemPCIeDevice : public Node
{
public:
- SystemPCIeDevice(CrowApp& app) :
+ SystemPCIeDevice(App& app) :
Node(app, "/redfish/v1/Systems/system/PCIeDevices/<str>/",
std::string())
{
@@ -192,8 +191,7 @@
class SystemPCIeFunctionCollection : public Node
{
public:
- template <typename CrowApp>
- SystemPCIeFunctionCollection(CrowApp& app) :
+ SystemPCIeFunctionCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/",
std::string())
{
@@ -287,7 +285,7 @@
class SystemPCIeFunction : public Node
{
public:
- SystemPCIeFunction(CrowApp& app) :
+ SystemPCIeFunction(App& app) :
Node(
app,
"/redfish/v1/Systems/system/PCIeDevices/<str>/PCIeFunctions/<str>/",
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index 59492c3..544c42b 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -25,7 +25,7 @@
class Power : public Node
{
public:
- Power(CrowApp& app) :
+ Power(App& app) :
Node((app), "/redfish/v1/Chassis/<str>/Power/", std::string())
{
entityPrivileges = {
diff --git a/redfish-core/lib/redfish_sessions.hpp b/redfish-core/lib/redfish_sessions.hpp
index 8080e6f..e54492d 100644
--- a/redfish-core/lib/redfish_sessions.hpp
+++ b/redfish-core/lib/redfish_sessions.hpp
@@ -17,7 +17,7 @@
#include "error_messages.hpp"
#include "node.hpp"
-#include "persistent_data_middleware.hpp"
+#include "persistent_data.hpp"
namespace redfish
{
@@ -27,7 +27,7 @@
class Sessions : public Node
{
public:
- Sessions(CrowApp& app) :
+ Sessions(App& app) :
Node(app, "/redfish/v1/SessionService/Sessions/<str>/", std::string())
{
entityPrivileges = {
@@ -46,7 +46,7 @@
{
// Note that control also reaches here via doPost and doDelete.
auto session =
- crow::persistent_data::SessionStore::getInstance().getSessionByUid(
+ persistent_data::SessionStore::getInstance().getSessionByUid(
params[0]);
if (session == nullptr)
@@ -88,7 +88,7 @@
}
auto session =
- crow::persistent_data::SessionStore::getInstance().getSessionByUid(
+ persistent_data::SessionStore::getInstance().getSessionByUid(
params[0]);
if (session == nullptr)
@@ -117,8 +117,7 @@
// DELETE should return representation of object that will be removed
doGet(res, req, params);
- crow::persistent_data::SessionStore::getInstance().removeSession(
- session);
+ persistent_data::SessionStore::getInstance().removeSession(session);
}
/**
@@ -133,7 +132,7 @@
class SessionCollection : public Node
{
public:
- SessionCollection(CrowApp& app) :
+ SessionCollection(App& app) :
Node(app, "/redfish/v1/SessionService/Sessions/"), memberSession(app)
{
entityPrivileges = {
@@ -150,8 +149,8 @@
const std::vector<std::string>& params) override
{
std::vector<const std::string*> sessionIds =
- crow::persistent_data::SessionStore::getInstance().getUniqueIds(
- false, crow::persistent_data::PersistenceType::TIMEOUT);
+ persistent_data::SessionStore::getInstance().getUniqueIds(
+ false, persistent_data::PersistenceType::TIMEOUT);
res.jsonValue["Members@odata.count"] = sessionIds.size();
res.jsonValue["Members"] = nlohmann::json::array();
@@ -236,11 +235,10 @@
#endif
// User is authenticated - create session
- std::shared_ptr<crow::persistent_data::UserSession> session =
- crow::persistent_data::SessionStore::getInstance()
- .generateUserSession(
- username, crow::persistent_data::PersistenceType::TIMEOUT,
- isConfigureSelfOnly, clientId, clientIp);
+ std::shared_ptr<persistent_data::UserSession> session =
+ persistent_data::SessionStore::getInstance().generateUserSession(
+ username, persistent_data::PersistenceType::TIMEOUT,
+ isConfigureSelfOnly, clientId, clientIp);
res.addHeader("X-Auth-Token", session->sessionToken);
res.addHeader("Location", "/redfish/v1/SessionService/Sessions/" +
session->uniqueId);
@@ -264,7 +262,7 @@
class SessionService : public Node
{
public:
- SessionService(CrowApp& app) : Node(app, "/redfish/v1/SessionService/")
+ SessionService(App& app) : Node(app, "/redfish/v1/SessionService/")
{
entityPrivileges = {
@@ -286,8 +284,7 @@
res.jsonValue["Id"] = "SessionService";
res.jsonValue["Description"] = "Session Service";
res.jsonValue["SessionTimeout"] =
- crow::persistent_data::SessionStore::getInstance()
- .getTimeoutInSeconds();
+ persistent_data::SessionStore::getInstance().getTimeoutInSeconds();
res.jsonValue["ServiceEnabled"] = true;
res.jsonValue["Sessions"] = {
diff --git a/redfish-core/lib/roles.hpp b/redfish-core/lib/roles.hpp
index 7819be8..9c86d4b 100644
--- a/redfish-core/lib/roles.hpp
+++ b/redfish-core/lib/roles.hpp
@@ -73,7 +73,7 @@
class Roles : public Node
{
public:
- Roles(CrowApp& app) :
+ Roles(App& app) :
Node(app, "/redfish/v1/AccountService/Roles/<str>/", std::string())
{
entityPrivileges = {
@@ -121,8 +121,7 @@
class RoleCollection : public Node
{
public:
- RoleCollection(CrowApp& app) :
- Node(app, "/redfish/v1/AccountService/Roles/")
+ RoleCollection(App& app) : Node(app, "/redfish/v1/AccountService/Roles/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index f12bbe0..99a03c9 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -2998,7 +2998,7 @@
class SensorCollection : public Node
{
public:
- SensorCollection(CrowApp& app) :
+ SensorCollection(App& app) :
Node(app, "/redfish/v1/Chassis/<str>/Sensors/", std::string())
{
entityPrivileges = {
@@ -3069,7 +3069,7 @@
class Sensor : public Node
{
public:
- Sensor(CrowApp& app) :
+ Sensor(App& app) :
Node(app, "/redfish/v1/Chassis/<str>/Sensors/<str>/", std::string(),
std::string())
{
diff --git a/redfish-core/lib/service_root.hpp b/redfish-core/lib/service_root.hpp
index b6bd6e0..52e899e 100644
--- a/redfish-core/lib/service_root.hpp
+++ b/redfish-core/lib/service_root.hpp
@@ -25,10 +25,9 @@
class ServiceRoot : public Node
{
public:
- ServiceRoot(CrowApp& app) : Node(app, "/redfish/v1/")
+ ServiceRoot(App& app) : Node(app, "/redfish/v1/")
{
- uuid = app.template getMiddleware<crow::persistent_data::Middleware>()
- .systemUuid;
+ uuid = persistent_data::getConfig().systemUuid;
entityPrivileges = {
{boost::beast::http::verb::get, {}},
{boost::beast::http::verb::head, {}},
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index 922d323..0114c4e 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -25,7 +25,7 @@
class StorageCollection : public Node
{
public:
- StorageCollection(CrowApp& app) :
+ StorageCollection(App& app) :
Node(app, "/redfish/v1/Systems/system/Storage/")
{
entityPrivileges = {
@@ -54,7 +54,7 @@
class Storage : public Node
{
public:
- Storage(CrowApp& app) : Node(app, "/redfish/v1/Systems/system/Storage/1/")
+ Storage(App& app) : Node(app, "/redfish/v1/Systems/system/Storage/1/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -275,7 +275,7 @@
class Drive : public Node
{
public:
- Drive(CrowApp& app) :
+ Drive(App& app) :
Node(app, "/redfish/v1/Systems/system/Storage/1/Drives/<str>/",
std::string())
{
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 2baeaa7..9ca95d5 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -1647,7 +1647,7 @@
class SystemsCollection : public Node
{
public:
- SystemsCollection(CrowApp& app) : Node(app, "/redfish/v1/Systems/")
+ SystemsCollection(App& app) : Node(app, "/redfish/v1/Systems/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -1704,7 +1704,7 @@
class SystemActionsReset : public Node
{
public:
- SystemActionsReset(CrowApp& app) :
+ SystemActionsReset(App& app) :
Node(app, "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/")
{
entityPrivileges = {
@@ -1867,7 +1867,7 @@
/*
* Default Constructor
*/
- Systems(CrowApp& app) : Node(app, "/redfish/v1/Systems/system/")
+ Systems(App& app) : Node(app, "/redfish/v1/Systems/system/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -2048,7 +2048,7 @@
/*
* Default Constructor
*/
- SystemResetActionInfo(CrowApp& app) :
+ SystemResetActionInfo(App& app) :
Node(app, "/redfish/v1/Systems/system/ResetActionInfo/")
{
entityPrivileges = {
diff --git a/redfish-core/lib/task.hpp b/redfish-core/lib/task.hpp
index fb2d0be..1b9077d 100644
--- a/redfish-core/lib/task.hpp
+++ b/redfish-core/lib/task.hpp
@@ -244,7 +244,7 @@
class TaskMonitor : public Node
{
public:
- TaskMonitor(CrowApp& app) :
+ TaskMonitor(App& app) :
Node((app), "/redfish/v1/TaskService/Tasks/<str>/Monitor/",
std::string())
{
@@ -301,7 +301,7 @@
class Task : public Node
{
public:
- Task(CrowApp& app) :
+ Task(App& app) :
Node((app), "/redfish/v1/TaskService/Tasks/<str>/", std::string())
{
entityPrivileges = {
@@ -376,7 +376,7 @@
class TaskCollection : public Node
{
public:
- TaskCollection(CrowApp& app) : Node(app, "/redfish/v1/TaskService/Tasks/")
+ TaskCollection(App& app) : Node(app, "/redfish/v1/TaskService/Tasks/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -416,7 +416,7 @@
class TaskService : public Node
{
public:
- TaskService(CrowApp& app) : Node(app, "/redfish/v1/TaskService/")
+ TaskService(App& app) : Node(app, "/redfish/v1/TaskService/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
diff --git a/redfish-core/lib/thermal.hpp b/redfish-core/lib/thermal.hpp
index 90ad3bb..84cef2b 100644
--- a/redfish-core/lib/thermal.hpp
+++ b/redfish-core/lib/thermal.hpp
@@ -24,7 +24,7 @@
class Thermal : public Node
{
public:
- Thermal(CrowApp& app) :
+ Thermal(App& app) :
Node((app), "/redfish/v1/Chassis/<str>/Thermal/", std::string())
{
entityPrivileges = {
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index 0b151d9..c695a9b 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -376,7 +376,7 @@
class UpdateServiceActionsSimpleUpdate : public Node
{
public:
- UpdateServiceActionsSimpleUpdate(CrowApp& app) :
+ UpdateServiceActionsSimpleUpdate(App& app) :
Node(app,
"/redfish/v1/UpdateService/Actions/UpdateService.SimpleUpdate/")
{
@@ -506,7 +506,7 @@
class UpdateService : public Node
{
public:
- UpdateService(CrowApp& app) : Node(app, "/redfish/v1/UpdateService/")
+ UpdateService(App& app) : Node(app, "/redfish/v1/UpdateService/")
{
entityPrivileges = {
{boost::beast::http::verb::get, {{"Login"}}},
@@ -685,8 +685,7 @@
class SoftwareInventoryCollection : public Node
{
public:
- template <typename CrowApp>
- SoftwareInventoryCollection(CrowApp& app) :
+ SoftwareInventoryCollection(App& app) :
Node(app, "/redfish/v1/UpdateService/FirmwareInventory/")
{
entityPrivileges = {
@@ -761,8 +760,7 @@
class SoftwareInventory : public Node
{
public:
- template <typename CrowApp>
- SoftwareInventory(CrowApp& app) :
+ SoftwareInventory(App& app) :
Node(app, "/redfish/v1/UpdateService/FirmwareInventory/<str>/",
std::string())
{
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index cd81857..dbe29b1 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -248,7 +248,7 @@
class VirtualMediaActionInsertMedia : public Node
{
public:
- VirtualMediaActionInsertMedia(CrowApp& app) :
+ VirtualMediaActionInsertMedia(App& app) :
Node(app,
"/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/"
"VirtualMedia.InsertMedia",
@@ -831,7 +831,7 @@
class VirtualMediaActionEjectMedia : public Node
{
public:
- VirtualMediaActionEjectMedia(CrowApp& app) :
+ VirtualMediaActionEjectMedia(App& app) :
Node(app,
"/redfish/v1/Managers/<str>/VirtualMedia/<str>/Actions/"
"VirtualMedia.EjectMedia",
@@ -996,7 +996,7 @@
/*
* Default Constructor
*/
- VirtualMediaCollection(CrowApp& app) :
+ VirtualMediaCollection(App& app) :
Node(app, "/redfish/v1/Managers/<str>/VirtualMedia/", std::string())
{
entityPrivileges = {
@@ -1070,7 +1070,7 @@
/*
* Default Constructor
*/
- VirtualMedia(CrowApp& app) :
+ VirtualMedia(App& app) :
Node(app, "/redfish/v1/Managers/<str>/VirtualMedia/<str>/",
std::string(), std::string())
{
diff --git a/src/token_authorization_middleware_test.cpp b/src/token_authorization_middleware_test.cpp
index 3ac7947..fcb5b65 100644
--- a/src/token_authorization_middleware_test.cpp
+++ b/src/token_authorization_middleware_test.cpp
@@ -1,5 +1,4 @@
#include "token_authorization_middleware.hpp"
-#include "webserver_common.hpp"
#include <condition_variable>
#include <future>
@@ -27,7 +26,7 @@
TEST_F(TokenAuth, SpecialResourcesAreAcceptedWithoutAuth)
{
- CrowApp app(io);
+ App app(io);
crow::token_authorization::requestRoutes(app);
BMCWEB_ROUTE(app, "/redfish/v1")
([]() { return boost::beast::http::status::ok; });
@@ -72,9 +71,7 @@
// Tests that Base64 basic strings work
TEST(TokenAuthentication, TestRejectedResource)
{
- App<crow::persistent_data::Middleware,
- crow::token_authorization::Middleware>
- app;
+ App app;
app.bindaddr("127.0.0.1").port(45451);
BMCWEB_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
auto _ = async(std::launch::async, [&] { app.run(); });
@@ -108,9 +105,7 @@
// Tests that Base64 basic strings work
TEST(TokenAuthentication, TestGetLoginUrl)
{
- App<crow::persistent_data::Middleware,
- crow::token_authorization::Middleware>
- app;
+ App app;
app.bindaddr("127.0.0.1").port(45451);
BMCWEB_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
auto _ = async(std::launch::async, [&] { app.run(); });
@@ -144,9 +139,7 @@
// Tests boundary conditions on login
TEST(TokenAuthentication, TestPostBadLoginUrl)
{
- App<crow::persistent_data::Middleware,
- crow::token_authorization::Middleware>
- app;
+ App app;
app.bindaddr("127.0.0.1").port(45451);
BMCWEB_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
auto _ = async(std::launch::async, [&] { app.run(); });
@@ -236,9 +229,7 @@
TEST(TokenAuthentication, TestSuccessfulLogin)
{
- App<crow::persistent_data::Middleware,
- crow::token_authorization::Middleware>
- app;
+ App app;
app.bindaddr("127.0.0.1").port(45451);
BMCWEB_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
auto _ = async(std::launch::async, [&] { app.run(); });
@@ -318,4 +309,4 @@
}
app.stop();
-}
\ No newline at end of file
+}
diff --git a/src/webserver_main.cpp b/src/webserver_main.cpp
index 036db54..2e043d7 100644
--- a/src/webserver_main.cpp
+++ b/src/webserver_main.cpp
@@ -14,17 +14,15 @@
#ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
#include <ibm/management_console_rest.hpp>
#endif
-#include <persistent_data_middleware.hpp>
#include <redfish.hpp>
#include <redfish_v1.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>
-#include <security_headers_middleware.hpp>
+#include <security_headers.hpp>
#include <ssl_key_handler.hpp>
#include <vm_websocket.hpp>
#include <webassets.hpp>
-#include <webserver_common.hpp>
#include <string>
@@ -34,8 +32,7 @@
constexpr int defaultPort = 18080;
-template <typename... Middlewares>
-void setupSocket(crow::Crow<Middlewares...>& app)
+void setupSocket(crow::App& app)
{
int listenFd = sd_listen_fds(0);
if (1 == listenFd)
@@ -68,7 +65,7 @@
crow::logger::setLogLevel(crow::LogLevel::Debug);
auto io = std::make_shared<boost::asio::io_context>();
- CrowApp app(io);
+ App app(io);
// Static assets need to be initialized before Authorization, because auth
// needs to build the whitelist from the static routes
@@ -104,6 +101,10 @@
crow::ibm_mc_lock::Lock::getInstance();
#endif
+#ifdef BMCWEB_INSECURE_DISABLE_XSS_PREVENTION
+ cors_preflight::requestRoutes(app);
+#endif
+
crow::login_routes::requestRoutes(app);
BMCWEB_LOG_INFO << "bmcweb (" << __DATE__ << ": " << __TIME__ << ')';