private BalanceDeposit ProcessBalanceCredit(string signature, BalanceDepositDTO payload) { try { // Verify that the event was actually sent by TransferWise by checking the "X-Signature-SHA256" header value var signatureVerified = VerifyTransferWiseSignature(signature, payload); return(payload.DTOtoBalanceDeposit(signatureVerified)); } catch (Exception ex) { _logger.LogError($"TransferWiseEventProcessor::ProcessBalanceCredit. Exception, {ex.Message}. {ex.StackTrace}."); return(null); } }
public async Task <IActionResult> ProcessBalanceCreditEventAsync([FromBody()] BalanceDepositDTO payload) { string signature = string.Empty; var headers = this.Request.Headers; if (headers.ContainsKey("X-Signature-SHA256")) { var signatureHeader = headers.ToList().Find(h => h.Key.Equals("X-Signature-SHA256")); signature = signatureHeader.Value.FirstOrDefault(); } try { return(await _transferWiseEventProcessor.ProcessBalanceCreditEventAsync(payload, signature)); } catch (Exception ex) { _logger.LogError($"TransferWiseEventsController::ProcessBalanceCreditEventAsync. Exception, {ex.Message}. {ex.StackTrace}."); return(new BadRequestObjectResult(new { StatusCode = StatusCodes.Status400BadRequest, message = "exception thrown." }));; } }
public async Task <IActionResult> ProcessBalanceCreditEventAsync(BalanceDepositDTO payload, string signature) { string BALANCE_CREDIT = "balances#credit"; // Make sure a JSON object was provided in the body. if (payload == null) { _logger.LogInformation("TransferWiseEventProcessor::ProcessBalanceCreditEventAsync. Error. Request Body is empty."); return(new BadRequestObjectResult(new { StatusCode = StatusCodes.Status400BadRequest, message = "Request Body is empty." })); } if (string.IsNullOrEmpty(signature)) { _logger.LogInformation("TransferWiseEventProcessor::ProcessBalanceCreditEventAsync. Error. X-Signature-SHA256 Not found in the request."); return(new BadRequestObjectResult(new { StatusCode = StatusCodes.Status400BadRequest, message = " X-Signature-SHA256 Not found in the request." })); } // We expect this payload was sent when the balances#credit event was raised at TransferWise if (payload.EventType != BALANCE_CREDIT) { _logger.LogInformation($"TransferWiseEventProcessor::ProcessBalanceCreditEventAsync. Error. Payload event type was NOT {BALANCE_CREDIT}."); return(new BadRequestObjectResult(new { StatusCode = StatusCodes.Status400BadRequest, message = $"Payload event type was NOT {BALANCE_CREDIT}." })); } var balanceDeposit = await ProcessBalanceCreditAsync(signature, payload).ConfigureAwait(false); _logger.LogInformation($"TransferWiseEventProcessor::ProcessBalanceCreditEventAsync. {balanceDeposit}."); if (balanceDeposit.SignatureVerified) { return(new OkObjectResult(balanceDeposit)); } else { _logger.LogInformation($"TransferWiseEventProcessor::ProcessBalanceCreditEventAsync. Error. Invalid signature."); return(new BadRequestObjectResult(new { StatusCode = StatusCodes.Status400BadRequest, message = "Invalid signature." })); } }
private bool VerifyTransferWiseSignature(string signature, BalanceDepositDTO payload) { if (string.IsNullOrEmpty(signature)) { _logger.LogError($"TransferWiseEventProcessor::VerifyTransferWiseSignature. Error. X-Signature-SHA256 must be provided. Unable to continue."); return(false); } var json = JsonConvert.SerializeObject(payload); // Log the whole object. _logger.LogInformation($"TransferWiseEventProcessor::VerifyTransferWiseSignature.\nJSON string:\n[{json}]."); var signatureVerified = SignatureHelper.VerifySignature(signature, json); if (!signatureVerified) { _logger.LogInformation("TransferWiseEventProcessor::VerifyTransferWiseSignature. Error. Attempt to verify signature for Balance Credit Event returned false."); return(false); } _logger.LogInformation("TransferWiseEventProcessor::VerifyTransferWiseSignature. Signature for Balance Credit Event verified successfully."); return(true); }
public async Task <BalanceDeposit> ProcessBalanceCreditAsync(string signature, BalanceDepositDTO payload) { return(await Task.Run(() => ProcessBalanceCredit(signature, payload))); }