xref: /openbmc/bmcweb/http/routing/baserule.hpp (revision 8db83747)
1 #pragma once
2 
3 #include "async_resp.hpp"
4 #include "http_request.hpp"
5 #include "privileges.hpp"
6 #include "verb.hpp"
7 
8 #include <boost/beast/ssl/ssl_stream.hpp>
9 
10 #include <memory>
11 #include <string>
12 
13 namespace crow
14 {
15 class BaseRule
16 {
17   public:
18     explicit BaseRule(const std::string& thisRule) : rule(thisRule) {}
19 
20     virtual ~BaseRule() = default;
21 
22     BaseRule(const BaseRule&) = delete;
23     BaseRule(BaseRule&&) = delete;
24     BaseRule& operator=(const BaseRule&) = delete;
25     BaseRule& operator=(const BaseRule&&) = delete;
26 
27     virtual void validate() = 0;
28     std::unique_ptr<BaseRule> upgrade()
29     {
30         if (ruleToUpgrade)
31         {
32             return std::move(ruleToUpgrade);
33         }
34         return {};
35     }
36 
37     virtual void handle(const Request& /*req*/,
38                         const std::shared_ptr<bmcweb::AsyncResp>&,
39                         const std::vector<std::string>&) = 0;
40     virtual void
41         handleUpgrade(const Request& /*req*/,
42                       const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
43                       boost::asio::ip::tcp::socket&& /*adaptor*/)
44     {
45         asyncResp->res.result(boost::beast::http::status::not_found);
46     }
47 
48     virtual void handleUpgrade(
49         const Request& /*req*/,
50         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
51         boost::beast::ssl_stream<boost::asio::ip::tcp::socket>&& /*adaptor*/)
52     {
53         asyncResp->res.result(boost::beast::http::status::not_found);
54     }
55 
56     size_t getMethods() const
57     {
58         return methodsBitfield;
59     }
60 
61     bool checkPrivileges(const redfish::Privileges& userPrivileges)
62     {
63         // If there are no privileges assigned, assume no privileges
64         // required
65         if (privilegesSet.empty())
66         {
67             return true;
68         }
69 
70         for (const redfish::Privileges& requiredPrivileges : privilegesSet)
71         {
72             if (userPrivileges.isSupersetOf(requiredPrivileges))
73             {
74                 return true;
75             }
76         }
77         return false;
78     }
79 
80     size_t methodsBitfield{1 << static_cast<size_t>(HttpVerb::Get)};
81     static_assert(std::numeric_limits<decltype(methodsBitfield)>::digits >
82                       methodNotAllowedIndex,
83                   "Not enough bits to store bitfield");
84 
85     std::vector<redfish::Privileges> privilegesSet;
86 
87     std::string rule;
88 
89     std::unique_ptr<BaseRule> ruleToUpgrade;
90 
91     friend class Router;
92     template <typename T>
93     friend struct RuleParameterTraits;
94 };
95 
96 } // namespace crow
97