blob: 356d34579d84db6411130986a4673ca9dd03638c [file] [log] [blame]
Ed Tanous40e9b922024-09-10 13:50:16 -07001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright OpenBMC Authors
Ed Tanous08bbe112023-04-06 13:10:02 -07003#pragma once
4
5#include "async_resp.hpp"
6#include "http_request.hpp"
7#include "privileges.hpp"
8#include "verb.hpp"
9
Ed Tanous003301a2024-04-16 09:59:19 -070010#include <boost/asio/ip/tcp.hpp>
11#include <boost/asio/ssl/stream.hpp>
Ed Tanousd7857202025-01-28 15:32:26 -080012#include <boost/beast/http/status.hpp>
Ed Tanous08bbe112023-04-06 13:10:02 -070013
Ed Tanousd7857202025-01-28 15:32:26 -080014#include <cstddef>
15#include <limits>
Ed Tanous08bbe112023-04-06 13:10:02 -070016#include <memory>
17#include <string>
Ed Tanousd7857202025-01-28 15:32:26 -080018#include <utility>
19#include <vector>
Ed Tanous08bbe112023-04-06 13:10:02 -070020
21namespace crow
22{
23class BaseRule
24{
25 public:
26 explicit BaseRule(const std::string& thisRule) : rule(thisRule) {}
27
28 virtual ~BaseRule() = default;
29
30 BaseRule(const BaseRule&) = delete;
31 BaseRule(BaseRule&&) = delete;
32 BaseRule& operator=(const BaseRule&) = delete;
33 BaseRule& operator=(const BaseRule&&) = delete;
34
35 virtual void validate() = 0;
36 std::unique_ptr<BaseRule> upgrade()
37 {
38 if (ruleToUpgrade)
39 {
40 return std::move(ruleToUpgrade);
41 }
42 return {};
43 }
44
45 virtual void handle(const Request& /*req*/,
46 const std::shared_ptr<bmcweb::AsyncResp>&,
47 const std::vector<std::string>&) = 0;
Patrick Williams504af5a2025-02-03 14:29:03 -050048 virtual void handleUpgrade(
49 const Request& /*req*/,
50 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
51 boost::asio::ip::tcp::socket&& /*adaptor*/)
Ed Tanous08bbe112023-04-06 13:10:02 -070052 {
53 asyncResp->res.result(boost::beast::http::status::not_found);
54 }
Ed Tanous8db83742024-04-13 09:11:15 -070055
Ed Tanous08bbe112023-04-06 13:10:02 -070056 virtual void handleUpgrade(
57 const Request& /*req*/,
58 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous003301a2024-04-16 09:59:19 -070059 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&& /*adaptor*/)
Ed Tanous08bbe112023-04-06 13:10:02 -070060 {
61 asyncResp->res.result(boost::beast::http::status::not_found);
62 }
Ed Tanous08bbe112023-04-06 13:10:02 -070063
64 size_t getMethods() const
65 {
66 return methodsBitfield;
67 }
68
69 bool checkPrivileges(const redfish::Privileges& userPrivileges)
70 {
71 // If there are no privileges assigned, assume no privileges
72 // required
73 if (privilegesSet.empty())
74 {
75 return true;
76 }
77
78 for (const redfish::Privileges& requiredPrivileges : privilegesSet)
79 {
80 if (userPrivileges.isSupersetOf(requiredPrivileges))
81 {
82 return true;
83 }
84 }
85 return false;
86 }
87
88 size_t methodsBitfield{1 << static_cast<size_t>(HttpVerb::Get)};
89 static_assert(std::numeric_limits<decltype(methodsBitfield)>::digits >
Ed Tanousa3b9eb92024-06-03 08:39:37 -070090 static_cast<int>(HttpVerb::Max),
Ed Tanous08bbe112023-04-06 13:10:02 -070091 "Not enough bits to store bitfield");
92
Ed Tanousa3b9eb92024-06-03 08:39:37 -070093 bool isNotFound = false;
94 bool isMethodNotAllowed = false;
95 bool isUpgrade = false;
96
Ed Tanous08bbe112023-04-06 13:10:02 -070097 std::vector<redfish::Privileges> privilegesSet;
98
99 std::string rule;
100
101 std::unique_ptr<BaseRule> ruleToUpgrade;
102
103 friend class Router;
104 template <typename T>
105 friend struct RuleParameterTraits;
106};
107
108} // namespace crow