parent
86d36680fd
commit
9c09129010
@ -1,11 +0,0 @@
|
||||
package au.com.royalpay.payment.manage.shopify.support;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class GraphqlSchemaReaderUtil {
|
||||
|
||||
public static String getSchemaFromFileName(final String filename) throws IOException {
|
||||
return new String(
|
||||
GraphqlSchemaReaderUtil.class.getClassLoader().getResourceAsStream("graphql/" + filename + ".graphql").readAllBytes());
|
||||
}
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
package au.com.royalpay.payment.manage.shopify.support;
|
||||
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
import org.apache.commons.codec.digest.HmacAlgorithms;
|
||||
import org.apache.commons.codec.digest.HmacUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.bouncycastle.crypto.RuntimeCryptoException;
|
||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.Security;
|
||||
import java.util.Arrays;
|
||||
import java.util.Locale;
|
||||
|
||||
public class HmacVerificationUtil {
|
||||
private static final Logger logger = LoggerFactory.getLogger(HmacVerificationUtil.class);
|
||||
|
||||
private HmacVerificationUtil() {
|
||||
}
|
||||
|
||||
public static boolean checkParameters(String message, String secret, String hmac) {
|
||||
try {
|
||||
Security.addProvider(new BouncyCastleProvider());
|
||||
SecretKey secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
|
||||
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
|
||||
mac.init(secretKey);
|
||||
byte[] digest = mac.doFinal(message.getBytes(StandardCharsets.UTF_8));
|
||||
String marshal = new HexBinaryAdapter().marshal(digest).toLowerCase(Locale.ROOT);
|
||||
return StringUtils.equals(marshal, hmac);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeCryptoException("加密异常");
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hmacSHA256(String input, String key, String hmac) {
|
||||
if (isHex(hmac)) {
|
||||
try {
|
||||
byte[] requestHmac = Hex.decodeHex(hmac);
|
||||
byte[] hmacRes = hmac(input, key, HmacAlgorithms.HMAC_SHA_256);
|
||||
String hmacHex = Hex.encodeHexString(hmacRes);
|
||||
logger.debug("hex-mode: input={}; key={}; encoded={}; request-hmac: {}", input, key, hmacHex, hmac);
|
||||
return Arrays.equals(requestHmac, hmacRes);
|
||||
} catch (DecoderException ignore) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
//base64
|
||||
byte[] hmacRes = hmac(input, key, HmacAlgorithms.HMAC_SHA_256);
|
||||
String hmacB64 = Base64.encodeBase64String(hmacRes);
|
||||
logger.debug("b64-mode: input={}; key={}; encoded={}; request-hmac: {}", input, key, hmacB64, hmac);
|
||||
byte[] requestHmac = Base64.decodeBase64(hmac);
|
||||
return Arrays.equals(requestHmac, hmacRes);
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isHex(String str) {
|
||||
return str != null && str.toUpperCase(Locale.ROOT).matches("^[0-9A-F]+$");
|
||||
}
|
||||
|
||||
private static byte[] hmac(String input, String key, HmacAlgorithms algorithm) {
|
||||
Mac mac = HmacUtils.getInitializedMac(algorithm, key.getBytes(StandardCharsets.UTF_8));
|
||||
byte[] content = input.getBytes(StandardCharsets.UTF_8);
|
||||
return mac.doFinal(content);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package au.com.royalpay.payment.manage.shopify.support;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.METHOD, ElementType.TYPE})
|
||||
public @interface ShopifyEndpoint {
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package au.com.royalpay.payment.manage.shopify.support;
|
||||
|
||||
import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.StreamUtils;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class ShopifyHttpUtils {
|
||||
private ShopifyHttpUtils() {
|
||||
}
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ShopifyHttpUtils.class);
|
||||
|
||||
public static String getRequestBody(HttpServletRequest request) {
|
||||
try (InputStream in = request.getInputStream()) {
|
||||
String body = StreamUtils.copyToString(in, StandardCharsets.UTF_8);
|
||||
logger.debug("Shopify read body |-{}", body);
|
||||
return body;
|
||||
} catch (IOException e) {
|
||||
throw new ServerErrorException("Failed to read request content");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package au.com.royalpay.payment.manage.shopify.support;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ShopifyRequestInfoInterceptor extends HandlerInterceptorAdapter {
|
||||
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||
if (!(handler instanceof HandlerMethod)){
|
||||
return super.preHandle(request, response, handler);
|
||||
}
|
||||
Method method = ((HandlerMethod) handler).getMethod();
|
||||
|
||||
if(HttpMethod.GET.matches(request.getMethod())) {
|
||||
if (AnnotatedElementUtils.isAnnotated(method, ShopifyEndpoint.class)) {
|
||||
String shop = request.getParameter("shop");
|
||||
if (StringUtils.isNotBlank(shop)) {
|
||||
response.addHeader("Content-Security-Policy", "frame-ancestors 'none'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (HttpMethod.POST.matches(request.getMethod())) {
|
||||
if (AnnotatedElementUtils.isAnnotated(method, ShopifyEndpoint.class)) {
|
||||
|
||||
String requestBody = ShopifyHttpUtils.getRequestBody(request);
|
||||
logger.debug("shopify request body:[POST]{} -->{}", request.getRequestURI(), requestBody);
|
||||
String shop = Optional.ofNullable(requestBody).map(JSON::parseObject).map(body->body.getString("shop_domain")).orElse(null);
|
||||
if (StringUtils.isNotBlank(shop)) {
|
||||
response.addHeader("Content-Security-Policy", "frame-ancestors 'none'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.preHandle(request, response, handler);
|
||||
}
|
||||
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
mutation PaymentsAppConfigure($externalHandle: String, $ready: Boolean!) {
|
||||
paymentsAppConfigure(externalHandle: $externalHandle, ready: $ready) {
|
||||
userErrors{
|
||||
field
|
||||
message
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue