| 287 | } |
| 288 | |
| 289 | bool HTTPRPCRequestProcessor::ProcessHTTPRequest(HTTPRequest *req) { |
| 290 | // First, check and/or set CORS headers |
| 291 | if (checkCORS(req)) { |
| 292 | return true; |
| 293 | } |
| 294 | |
| 295 | // JSONRPC handles only POST |
| 296 | if (req->GetRequestMethod() != HTTPRequest::POST) { |
| 297 | req->WriteReply(HTTP_BAD_METHOD, |
| 298 | "JSONRPC server handles only POST requests"); |
| 299 | return false; |
| 300 | } |
| 301 | // Check authorization |
| 302 | std::pair<bool, std::string> authHeader = req->GetHeader("authorization"); |
| 303 | if (!authHeader.first) { |
| 304 | req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA); |
| 305 | req->WriteReply(HTTP_UNAUTHORIZED); |
| 306 | return false; |
| 307 | } |
| 308 | |
| 309 | JSONRPCRequest jreq; |
| 310 | jreq.context = context; |
| 311 | jreq.peerAddr = req->GetPeer().ToStringAddrPort(); |
| 312 | if (!RPCAuthorized(authHeader.second, jreq.authUser)) { |
| 313 | LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", |
| 314 | jreq.peerAddr); |
| 315 | |
| 316 | /** |
| 317 | * Deter brute-forcing. |
| 318 | * If this results in a DoS the user really shouldn't have their RPC |
| 319 | * port exposed. |
| 320 | */ |
| 321 | UninterruptibleSleep( |
| 322 | std::chrono::milliseconds{RPC_AUTH_BRUTE_FORCE_DELAY}); |
| 323 | |
| 324 | req->WriteHeader("WWW-Authenticate", WWW_AUTH_HEADER_DATA); |
| 325 | req->WriteReply(HTTP_UNAUTHORIZED); |
| 326 | return false; |
| 327 | } |
| 328 | |
| 329 | try { |
| 330 | // Parse request |
| 331 | UniValue valRequest; |
| 332 | if (!valRequest.read(req->ReadBody())) { |
| 333 | throw JSONRPCError(RPC_PARSE_ERROR, "Parse error"); |
| 334 | } |
| 335 | |
| 336 | // Set the URI |
| 337 | jreq.URI = req->GetURI(); |
| 338 | |
| 339 | std::string strReply; |
| 340 | bool user_has_whitelist = g_rpc_whitelist.count(jreq.authUser); |
| 341 | if (!user_has_whitelist && g_rpc_whitelist_default) { |
| 342 | LogPrintf("RPC User %s not allowed to call any methods\n", |
| 343 | jreq.authUser); |
| 344 | req->WriteReply(HTTP_FORBIDDEN); |
| 345 | return false; |
| 346 |
no test coverage detected