CaptchaRequestUtils.java
Home
/
sm-shop /
src /
main /
java /
com /
salesmanager /
shop /
utils /
CaptchaRequestUtils.java
package com.salesmanager.shop.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.utils.CoreConfiguration;
import com.salesmanager.shop.constants.ApplicationConstants;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Creates a request to reCaptcha 2
* https://www.google.com/recaptcha/api/siteverify
* Throws an exception if it can't connect to reCaptcha
* returns true or false if validation has passed
* @author carlsamson
*
*/
@Component
public class CaptchaRequestUtils {
@Inject
private CoreConfiguration configuration; //for reading public and secret key
private static final String SUCCESS_INDICATOR = "success";
public boolean checkCaptcha(String gRecaptchaResponse) throws Exception {
HttpClient client = HttpClientBuilder.create().build();
String url = configuration.getProperty(ApplicationConstants.RECAPTCHA_URL);;
List<NameValuePair> data = new ArrayList<NameValuePair>();
data.add(new BasicNameValuePair("secret", configuration.getProperty(ApplicationConstants.RECAPTCHA_PRIVATE_KEY)));
data.add(new BasicNameValuePair("response", gRecaptchaResponse));
/* NameValuePair[] data = {
new NameValuePair("secret", configuration.getProperty(ApplicationConstants.RECAPTCHA_PRIVATE_KEY)),
new NameValuePair("response", gRecaptchaResponse)
};*/
// Create a method instance.
HttpPost post = new HttpPost(url);
post.setEntity(new UrlEncodedFormEntity(data,StandardCharsets.UTF_8));
boolean checkCaptcha = false;
try {
// Execute the method.
HttpResponse httpResponse = client.execute(post);
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
throw new Exception("Got an invalid response from reCaptcha " + url + " [" + httpResponse.getStatusLine() + "]");
}
// Read the response body.
HttpEntity entity = httpResponse.getEntity();
byte[] responseBody =EntityUtils.toByteArray(entity);
// Deal with the response.
// Use caution: ensure correct character encoding and is not binary data
//System.out.println(new String(responseBody));
String json = new String(responseBody);
Map<String,String> map = new HashMap<String,String>();
ObjectMapper mapper = new ObjectMapper();
map = mapper.readValue(json,
new TypeReference<HashMap<String,String>>(){});
String successInd = map.get(SUCCESS_INDICATOR);
if(StringUtils.isBlank(successInd)) {
throw new Exception("Unreadable response from reCaptcha " + json);
}
Boolean responseBoolean = Boolean.valueOf(successInd);
if(responseBoolean) {
checkCaptcha = true;
}
return checkCaptcha;
} finally {
// Release the connection.
post.releaseConnection();
}
}
}