blob: a96abcb6bb7964b0de2fff47911fa2cf3db92818 [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>
rohitpaic1a75eb2025-01-03 19:13:36 +053018#include <string_view>
Ed Tanousd7857202025-01-28 15:32:26 -080019#include <utility>
20#include <vector>
Ed Tanous08bbe112023-04-06 13:10:02 -070021
22namespace crow
23{
24class BaseRule
25{
26 public:
rohitpaic1a75eb2025-01-03 19:13:36 +053027 explicit BaseRule(std::string_view thisRule) : rule(thisRule) {}
Ed Tanous08bbe112023-04-06 13:10:02 -070028
29 virtual ~BaseRule() = default;
30
31 BaseRule(const BaseRule&) = delete;
32 BaseRule(BaseRule&&) = delete;
33 BaseRule& operator=(const BaseRule&) = delete;
34 BaseRule& operator=(const BaseRule&&) = delete;
35
36 virtual void validate() = 0;
37 std::unique_ptr<BaseRule> upgrade()
38 {
39 if (ruleToUpgrade)
40 {
41 return std::move(ruleToUpgrade);
42 }
43 return {};
44 }
45
46 virtual void handle(const Request& /*req*/,
47 const std::shared_ptr<bmcweb::AsyncResp>&,
48 const std::vector<std::string>&) = 0;
Patrick Williams504af5a2025-02-03 14:29:03 -050049 virtual void handleUpgrade(
50 const Request& /*req*/,
51 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
52 boost::asio::ip::tcp::socket&& /*adaptor*/)
Ed Tanous08bbe112023-04-06 13:10:02 -070053 {
54 asyncResp->res.result(boost::beast::http::status::not_found);
55 }
Ed Tanous8db83742024-04-13 09:11:15 -070056
Ed Tanous08bbe112023-04-06 13:10:02 -070057 virtual void handleUpgrade(
58 const Request& /*req*/,
59 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous003301a2024-04-16 09:59:19 -070060 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&& /*adaptor*/)
Ed Tanous08bbe112023-04-06 13:10:02 -070061 {
62 asyncResp->res.result(boost::beast::http::status::not_found);
63 }
Ed Tanous08bbe112023-04-06 13:10:02 -070064
65 size_t getMethods() const
66 {
67 return methodsBitfield;
68 }
69
70 bool checkPrivileges(const redfish::Privileges& userPrivileges)
71 {
72 // If there are no privileges assigned, assume no privileges
73 // required
74 if (privilegesSet.empty())
75 {
76 return true;
77 }
78
79 for (const redfish::Privileges& requiredPrivileges : privilegesSet)
80 {
81 if (userPrivileges.isSupersetOf(requiredPrivileges))
82 {
83 return true;
84 }
85 }
86 return false;
87 }
88
89 size_t methodsBitfield{1 << static_cast<size_t>(HttpVerb::Get)};
90 static_assert(std::numeric_limits<decltype(methodsBitfield)>::digits >
Ed Tanousa3b9eb92024-06-03 08:39:37 -070091 static_cast<int>(HttpVerb::Max),
Ed Tanous08bbe112023-04-06 13:10:02 -070092 "Not enough bits to store bitfield");
93
Ed Tanousa3b9eb92024-06-03 08:39:37 -070094 bool isNotFound = false;
95 bool isMethodNotAllowed = false;
96 bool isUpgrade = false;
97
Ed Tanous08bbe112023-04-06 13:10:02 -070098 std::vector<redfish::Privileges> privilegesSet;
99
100 std::string rule;
101
102 std::unique_ptr<BaseRule> ruleToUpgrade;
103
104 friend class Router;
105 template <typename T>
106 friend struct RuleParameterTraits;
107};
108
109} // namespace crow