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