| 206 | } |
| 207 | |
| 208 | static std::vector<std::pair<std::string, uint16_t>> GetBindAddresses() |
| 209 | { |
| 210 | uint16_t http_port{static_cast<uint16_t>(gArgs.GetIntArg("-rpcport", BaseParams().RPCPort()))}; |
| 211 | std::vector<std::pair<std::string, uint16_t>> endpoints; |
| 212 | |
| 213 | // Determine what addresses to bind to |
| 214 | // To prevent misconfiguration and accidental exposure of the RPC |
| 215 | // interface, require -rpcallowip and -rpcbind to both be specified |
| 216 | // together. If either is missing, ignore both values, bind to localhost |
| 217 | // instead, and log warnings. |
| 218 | if (gArgs.GetArgs("-rpcallowip").empty() || gArgs.GetArgs("-rpcbind").empty()) { // Default to loopback if not allowing external IPs |
| 219 | endpoints.emplace_back("::1", http_port); |
| 220 | endpoints.emplace_back("127.0.0.1", http_port); |
| 221 | if (!gArgs.GetArgs("-rpcallowip").empty()) { |
| 222 | LogWarning("Option -rpcallowip was specified without -rpcbind; this doesn't usually make sense"); |
| 223 | } |
| 224 | if (!gArgs.GetArgs("-rpcbind").empty()) { |
| 225 | LogWarning("Option -rpcbind was ignored because -rpcallowip was not specified, refusing to allow everyone to connect"); |
| 226 | } |
| 227 | } else { // Specific bind addresses |
| 228 | for (const std::string& strRPCBind : gArgs.GetArgs("-rpcbind")) { |
| 229 | uint16_t port{http_port}; |
| 230 | std::string host; |
| 231 | if (!SplitHostPort(strRPCBind, port, host)) { |
| 232 | LogError("%s\n", InvalidPortErrMsg("-rpcbind", strRPCBind).original); |
| 233 | return {}; // empty |
| 234 | } |
| 235 | endpoints.emplace_back(host, port); |
| 236 | } |
| 237 | } |
| 238 | return endpoints; |
| 239 | } |
| 240 | |
| 241 | void RegisterHTTPHandler(const std::string &prefix, bool exactMatch, const HTTPRequestHandler &handler) |
| 242 | { |
no test coverage detected