PRCYCoin  2.0.0.7rc1
P2P Digital Currency
protocol.cpp
Go to the documentation of this file.
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Copyright (c) 2014-2015 The Dash developers
4 // Copyright (c) 2015-2018 The PIVX developers
5 // Copyright (c) 2018-2020 The DAPS Project developers
6 // Distributed under the MIT software license, see the accompanying
7 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
8 
9 #include "rpc/protocol.h"
10 
11 #include "random.h"
12 #include "tinyformat.h"
13 #include "util.h"
14 #include "utilstrencodings.h"
15 #include "utiltime.h"
16 #include "version.h"
17 
18 #include <stdint.h>
19 #include <fstream>
20 
21 
22 
33 std::string JSONRPCRequest(const std::string& strMethod, const UniValue& params, const UniValue& id)
34 {
35  UniValue request(UniValue::VOBJ);
36  request.push_back(Pair("method", strMethod));
37  request.push_back(Pair("params", params));
38  request.push_back(Pair("id", id));
39  return request.write() + "\n";
40 }
41 
42 UniValue JSONRPCReplyObj(const UniValue& result, const UniValue& error, const UniValue& id)
43 {
44  UniValue reply(UniValue::VOBJ);
45  if (!error.isNull())
46  reply.push_back(Pair("result", NullUniValue));
47  else
48  reply.push_back(Pair("result", result));
49  reply.push_back(Pair("error", error));
50  reply.push_back(Pair("id", id));
51  return reply;
52 }
53 
54 std::string JSONRPCReply(const UniValue& result, const UniValue& error, const UniValue& id)
55 {
56  UniValue reply = JSONRPCReplyObj(result, error, id);
57  return reply.write() + "\n";
58 }
59 
60 UniValue JSONRPCError(int code, const std::string& message)
61 {
63  error.push_back(Pair("code", code));
64  error.push_back(Pair("message", message));
65  return error;
66 }
67 
68 
72 static const std::string COOKIEAUTH_USER = "__cookie__";
74 static const std::string COOKIEAUTH_FILE = ".cookie";
75 
77 {
78  fs::path path(GetArg("-rpccookiefile", COOKIEAUTH_FILE));
79  return AbsPathForConfigVal(path);
80 }
81 
82 bool GenerateAuthCookie(std::string *cookie_out)
83 {
84  unsigned char rand_pwd[32];
85  GetRandBytes(rand_pwd, 32);
86  std::string cookie = COOKIEAUTH_USER + ":" + EncodeBase64(&rand_pwd[0],32);
87 
91  std::ofstream file;
92  fs::path filepath = GetAuthCookieFile();
93  file.open(filepath.string().c_str());
94  if (!file.is_open()) {
95  LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath.string());
96  return false;
97  }
98  file << cookie;
99  file.close();
100  LogPrintf("Generated RPC authentication cookie %s\n", filepath.string());
101 
102  if (cookie_out)
103  *cookie_out = cookie;
104  return true;
105 }
106 
107 bool GetAuthCookie(std::string *cookie_out)
108 {
109  std::ifstream file;
110  std::string cookie;
111  fs::path filepath = GetAuthCookieFile();
112  file.open(filepath.string().c_str());
113  if (!file.is_open())
114  return false;
115  std::getline(file, cookie);
116  file.close();
117 
118  if (cookie_out)
119  *cookie_out = cookie;
120  return true;
121 }
122 
124 {
125  try {
126  fs::remove(GetAuthCookieFile());
127  } catch (const fs::filesystem_error& e) {
128  LogPrintf("%s: Unable to remove random auth cookie file: %s\n", __func__, e.what());
129  }
130 }
UniValue::VOBJ
@ VOBJ
Definition: univalue.h:21
utiltime.h
JSONRPCReplyObj
UniValue JSONRPCReplyObj(const UniValue &result, const UniValue &error, const UniValue &id)
Definition: protocol.cpp:42
NullUniValue
const UniValue NullUniValue
Definition: univalue.cpp:78
protocol.h
GenerateAuthCookie
bool GenerateAuthCookie(std::string *cookie_out)
Generate a new RPC authentication cookie and write it to disk.
Definition: protocol.cpp:82
version.h
UniValue
Definition: univalue.h:19
tinyformat.h
random.h
GetRandBytes
void GetRandBytes(unsigned char *buf, int num)
Functions to gather random data via the OpenSSL PRNG.
Definition: random.cpp:273
AbsPathForConfigVal
fs::path AbsPathForConfigVal(const fs::path &path, bool net_specific)
Definition: util.cpp:423
JSONRPCError
UniValue JSONRPCError(int code, const std::string &message)
Definition: protocol.cpp:60
LogPrintf
#define LogPrintf(...)
Definition: logging.h:147
DeleteAuthCookie
void DeleteAuthCookie()
Delete RPC authentication cookie from disk.
Definition: protocol.cpp:123
EncodeBase64
std::string EncodeBase64(const unsigned char *pch, size_t len)
Definition: utilstrencodings.cpp:102
JSONRPCRequest
std::string JSONRPCRequest(const std::string &strMethod, const UniValue &params, const UniValue &id)
JSON-RPC protocol.
Definition: protocol.cpp:33
JSONRPCReply
std::string JSONRPCReply(const UniValue &result, const UniValue &error, const UniValue &id)
Definition: protocol.cpp:54
UniValue::push_back
bool push_back(const UniValue &val)
Definition: univalue.cpp:173
GetAuthCookieFile
fs::path GetAuthCookieFile()
Get name of RPC authentication cookie file.
Definition: protocol.cpp:76
GetAuthCookie
bool GetAuthCookie(std::string *cookie_out)
Read the RPC authentication cookie from disk.
Definition: protocol.cpp:107
utilstrencodings.h
GetArg
std::string GetArg(const std::string &strArg, const std::string &strDefault)
Return string argument or default value.
Definition: util.cpp:241
UniValue::write
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
Definition: univalue_write.cpp:31
error
bool error(const char *fmt, const Args &... args)
Definition: util.h:61