request.h raw
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-present The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 #ifndef BITCOIN_RPC_REQUEST_H
7 #define BITCOIN_RPC_REQUEST_H
8
9 #include <any>
10 #include <optional>
11 #include <string>
12
13 #include <univalue.h>
14 #include <util/fs.h>
15
16 enum class JSONRPCVersion {
17 V1_LEGACY,
18 V2
19 };
20
21 /** JSON-RPC 2.0 request, only used in bitcoin-cli **/
22 UniValue JSONRPCRequestObj(const std::string& strMethod, const UniValue& params, const UniValue& id);
23 UniValue JSONRPCReplyObj(UniValue result, UniValue error, std::optional<UniValue> id, JSONRPCVersion jsonrpc_version);
24 UniValue JSONRPCError(int code, const std::string& message);
25
26 enum class AuthCookieResult : uint8_t {
27 Disabled, // -norpccookiefile
28 Error,
29 Ok,
30 };
31
32 /**
33 * Generate a new RPC authentication cookie and write it to disk
34 * @param[in] cookie_perms Filesystem permissions to use for the cookie file.
35 * @param[out] user Generated username, only set if `OK` is returned.
36 * @param[out] pass Generated password, only set if `OK` is returned.
37 * @retval AuthCookieResult::Disabled Authentication via cookie is disabled.
38 * @retval AuthCookieResult::Error Error occurred, auth data could not be saved to disk.
39 * @retval AuthCookieResult::Ok Auth data was generated, saved to disk and in `user` and `pass`.
40 */
41 AuthCookieResult GenerateAuthCookie(const std::optional<fs::perms>& cookie_perms,
42 std::string& user,
43 std::string& pass);
44
45 /** Read the RPC authentication cookie from disk */
46 AuthCookieResult GetAuthCookie(std::string& cookie_out);
47 /** Delete RPC authentication cookie from disk */
48 void DeleteAuthCookie();
49 /** Parse JSON-RPC batch reply into a vector */
50 std::vector<UniValue> JSONRPCProcessBatchReply(const UniValue& in);
51
52 class JSONRPCRequest
53 {
54 public:
55 std::optional<UniValue> id = UniValue::VNULL;
56 std::string strMethod;
57 UniValue params;
58 enum Mode { EXECUTE, GET_HELP, GET_ARGS } mode = EXECUTE;
59 std::string URI;
60 std::string authUser;
61 std::string peerAddr;
62 std::any context;
63 JSONRPCVersion m_json_version = JSONRPCVersion::V1_LEGACY;
64
65 void parse(const UniValue& valRequest);
66 [[nodiscard]] bool IsNotification() const { return !id.has_value() && m_json_version == JSONRPCVersion::V2; };
67 };
68
69 #endif // BITCOIN_RPC_REQUEST_H
70