コード例 #1
0
        public async Task ValidateToken <T>(RecaptchaRequest <T> request)
        {
            if (request == null)
            {
                throw new Exception("Invalid recaptcha request");
            }

            var uri = $"{_verificationUrl}?secret={_secret}&response={request.Token}";

            var requestPayload = new HttpRequestMessage(HttpMethod.Post, uri);

            var responseMessage = await httpClient.SendAsync(requestPayload);

            responseMessage.EnsureSuccessStatusCode();

            var responseString = await responseMessage.Content.ReadAsStringAsync();

            var response = JsonConvert.DeserializeObject <RecaptchaResponse>(responseString);

            if (!response.Success)
            {
                throw new Exception($"Recaptcha Verification Failed: {responseString}");
            }
            else if (response.Score < _minScore)
            {
                throw new Exception($"Recaptcha Score Too Low: {responseString}");
            }
        }
コード例 #2
0
        public async Task <GenericResponse <decimal?> > GetSmartSpotQuoteAsync(RecaptchaRequest <LoadshopSmartSpotQuoteRequest> request)
        {
            await _recaptchaService.ValidateToken(request);

            AssertConfig();

            var response = new GenericResponse <decimal?>();
            var awsModel = await MapFromLoadshopSmartSpotQuoteRequest(request.Data, response);

            if (!response.IsSuccess)
            {
                return(response);
            }

            response.Data = await RequestQuoteFromAWS(awsModel);

            _db.Add(new SmartSpotPriceQuoteLogEntity
            {
                SmartSpotPriceQuoteLogId = Guid.NewGuid(),
                Miles          = awsModel.DirectMiles,
                Weight         = awsModel.Weight,
                EquipmentId    = awsModel.EquipmentId,
                OrigState      = awsModel.OrigState,
                Orig3Zip       = awsModel.O3Zip,
                DestState      = awsModel.DestState,
                Dest3Zip       = awsModel.D3Zip,
                PkupDate       = awsModel.PkupDate,
                SmartSpotPrice = response.Data ?? 0,
                UserId         = _userContext.UserId
            });
            await _db.SaveChangesAsync(_userContext.UserName);

            return(response);
        }
コード例 #3
0
        public RecaptchaResponse Validate(RecaptchaRequest recaptchaRequest)
        {
            var result = new RecaptchaResponse
            {
                Success = false
            };

            var request = new FormUrlEncodedContent(new[]
                 {
                    new KeyValuePair<string, string>("secret", _configurationManager.GetAppSettingAs<string>(AppSettingsRecaptchaSecretKey)),
                    new KeyValuePair<string, string>("response", recaptchaRequest.Token),
                    new KeyValuePair<string, string>("remoteip", recaptchaRequest.IpAddress)
                });

            var response = _client.PostAsync(ApiUrl, request).Result;
            if (response.IsSuccessStatusCode)
            {
                var contents = response.Content.ReadAsStringAsync().Result;
                if (!string.IsNullOrEmpty(contents))
                {
                    result = JsonConvert.DeserializeObject<RecaptchaResponse>(contents, new StringEnumConverter());
                }
            }

            return result;
        }
コード例 #4
0
 public bool RecaptchaValidate(RecaptchaRequest model)
 {
     if (string.IsNullOrEmpty(model.Secret) || string.IsNullOrEmpty(model.Response)) return false;
     var client = new System.Net.WebClient();
     var googleReply = client.DownloadString($"https://www.google.com/recaptcha/api/siteverify?secret={model.Secret}&response={model.Response}");
     return JsonConvert.DeserializeObject<GoogleRecaptchaResponse>(googleReply).Success;
 }
コード例 #5
0
        private bool IsCaptchaValid(RecaptchaRequest captchaRequest)
        {
            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, "https://www.google.com/recaptcha/api/siteverify");
                request.Content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair <string, string>("secret", captchaRequest.Secret),
                    new KeyValuePair <string, string>("response", captchaRequest.Response),
                    new KeyValuePair <string, string>("remoteip", captchaRequest.RemoteIp)
                });

                var response = httpClient.SendAsync(request).Result;
                request.Dispose();
                if (response != null && response.Content != null && response.IsSuccessStatusCode)
                {
                    var responseContent = response.Content.ReadAsStringAsync().Result;
                    response.Dispose();
                    if (responseContent != null)
                    {
                        var recaptchaResponse = JsonConvert.DeserializeObject <RecaptchaResponse>(responseContent);
                        return(recaptchaResponse.Success);
                    }
                }

                return(false);
            }
        }
コード例 #6
0
 public void MissingRequest()
 {
     _request = null;
     _service.Awaiting(x => x.ValidateToken(_request))
     .Should()
     .Throw <Exception>()
     .WithMessage("Invalid recaptcha request");
 }
コード例 #7
0
        public async Task <IActionResult> QuoteAsync([FromBody] RecaptchaRequest <LoadshopSmartSpotQuoteRequest> request)
        {
            var response = await _svc.GetSmartSpotQuoteAsync(request);

            if (!response.IsSuccess)
            {
                var problemDetails = new ValidationProblemDetails(response.ModelState)
                {
                    Title    = "Send \"In Transit\" Status",
                    Detail   = "One or more errors occurred when trying to retrieve the Smart Spot Quote.  See form for error details",
                    Status   = (int)HttpStatusCode.BadRequest,
                    Instance = $"urn:kbxl:error:{Guid.NewGuid()}"
                };
                return(BadRequest(problemDetails));
            }
            return(Success(response.Data));
        }
コード例 #8
0
            public ValidateToken(TestFixture testFixture)
            {
                _httpHandler = new Mock <HttpMessageHandler>();

                _mockConfig = new Mock <IConfigurationRoot>();
                _mockConfig.SetupGet(x => x["GoogleReCaptchaAcceptableScore"]).Returns("0.8");
                _mockConfig.SetupGet(x => x["GoogleReCaptchaSiteVerify"]).Returns(URL);
                _mockConfig.SetupGet(x => x["GoogleReCaptchaV3Secret"]).Returns("SECRET");
                _mockConfig.SetupGet(x => x["ProxyAddress"]).Returns((string)null);


                _request = new RecaptchaRequest <object>
                {
                    Token = "RECAPTCHA_TOKEN",
                    Data  = null
                };
                InitService();
            }
コード例 #9
0
        public HttpResponseMessage sendCaptcha(RecaptchaRequest model)
        {
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            ItemResponse <bool> response = new ItemResponse <bool>();

            string key     = model.secret;
            string request = model.response;

            bool isCaptchaValid = RecaptchaService.Validate(request, key);

            response.Item = isCaptchaValid;

            return(Request.CreateResponse(HttpStatusCode.OK, response));
        }
コード例 #10
0
        public bool Validate([FromBody] RecaptchaRequest request)
        {
            if (string.IsNullOrEmpty(request.Response))
            {
                return(false);
            }

            var secret = "6Lf_riMUAAAAAMSczpv9Ll0DZVynuoKVCDbl3Jvs";

            if (string.IsNullOrEmpty(secret))
            {
                return(false);
            }

            var client = new System.Net.WebClient();

            var googleReply = client.DownloadString(
                $"https://www.google.com/recaptcha/api/siteverify?secret={secret}&response={request.Response}&remoteip={request.RemoteIp}");

            return(JsonConvert.DeserializeObject <RecaptchaResponse>(googleReply).Success);
        }
コード例 #11
0
        public ActionResult AddSession(SessionSubmissionViewModel viewModel)
        {
            try
            {
                var recaptchaRequest = new RecaptchaRequest
                {
                    Secret   = ConfigurationManager.AppSettings["Google.ReCaptcha.Secret"],
                    Response = Request.Form["g-recaptcha-response"],
                    RemoteIp = Request.UserHostAddress
                };

                if (TryValidateModel(viewModel) && IsCaptchaValid(recaptchaRequest))
                {
                    if (_sessionSubmissionService.AddSession(viewModel))
                    {
                        return(new RedirectResult("https://www.dddmelbourne.com/submit-a-session/success/"));
                    }
                }
            }
            catch (Exception) {}

            return(new RedirectResult("https://www.dddmelbourne.com/submit-a-session/failure/"));
        }
コード例 #12
0
            public GetSmartSpotQuote(TestFixture fixture)
            {
                _config = new SmartSpotPriceConfig
                {
                    ApiUrl          = URL,
                    AccessKeyId     = "access-key-id",
                    SecretAccessKey = "secret-access-key",
                    Service         = "service-name",
                    Region          = "us-east-1"
                };
                _db = new MockDbBuilder()
                      .Build();
                _mapper      = fixture.Mapper;
                _httpHandler = new Mock <HttpMessageHandler>();

                var expectedResponse = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(JsonConvert.SerializeObject(new AWSSmartSpotPriceResponse {
                        Results = new List <decimal> {
                            EXPECTED_SPOT_PRICE_0
                        }
                    }))
                };

                _httpHandler.SetupRequest(HttpMethod.Post, URL)
                .ReturnsAsync(expectedResponse);

                _userContext = new Mock <IUserContext>();
                _userContext.SetupGet(_ => _.UserId).Returns(USER_ID);
                _userContext.SetupGet(_ => _.UserName).Returns(USER_NAME);

                _recaptchaService = new Mock <IRecaptchaService>();

                _mileageService = new Mock <IMileageService>();
                _mileageService.Setup(_ => _.GetDirectMiles(It.IsAny <MileageRequestData>())).Returns(100);

                _securityService = new Mock <ISecurityService>();
                _securityService.Setup(_ => _.GetContractedCarriersByPrimaryCustomerIdAsync()).ReturnsAsync(CARRIERS.AsReadOnly());
                _shippingService         = new Mock <IShippingService>();
                _loadCarrierGroupService = new Mock <ILoadCarrierGroupService>();

                InitService();

                _request = new RecaptchaRequest <LoadshopSmartSpotQuoteRequest>
                {
                    Token = "RECAPTCHA_TOKEN",
                    Data  = new LoadshopSmartSpotQuoteRequest
                    {
                        OriginCity            = "Mosinee",
                        OriginState           = "WI",
                        OriginPostalCode      = "54455",
                        OriginCountry         = "USA",
                        DestinationCity       = "Stevens Point",
                        DestinationState      = "WI",
                        DestinationPostalCode = "54481",
                        DestinationCountry    = "USA",
                        EquipmentId           = "53TF102",
                        Weight     = 1000,
                        PickupDate = new DateTime(2020, 02, 01)
                    }
                };
            }