From 9d931058e1a5d3ac693570bda37e0e5c214c4cbd Mon Sep 17 00:00:00 2001 From: "Yunsam.Eo" Date: Thu, 18 Sep 2025 10:34:42 +0900 Subject: [PATCH 1/9] =?UTF-8?q?KJB=20=EC=B4=88=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8F=99=20=EC=84=A4=EC=A0=95.=20Baseline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/META-INF/context.xml | 9 +-- .../WEB-INF/properties/env.D.properties | 14 ++-- WebContent/WEB-INF/web.xml | 35 ++++++--- WebContent/WEB-INF/weblogic.xml | 10 +++ WebContent/manage.jsp | 73 +++++++++++++++++++ build.gradle | 4 +- 6 files changed, 119 insertions(+), 26 deletions(-) create mode 100644 WebContent/manage.jsp diff --git a/WebContent/META-INF/context.xml b/WebContent/META-INF/context.xml index 2df0867..8e8180c 100644 --- a/WebContent/META-INF/context.xml +++ b/WebContent/META-INF/context.xml @@ -25,10 +25,9 @@ - + \ No newline at end of file diff --git a/WebContent/WEB-INF/properties/env.D.properties b/WebContent/WEB-INF/properties/env.D.properties index c69e742..f73d61a 100644 --- a/WebContent/WEB-INF/properties/env.D.properties +++ b/WebContent/WEB-INF/properties/env.D.properties @@ -2,20 +2,22 @@ # Examples # - H2 : org.hibernate.dialect.H2Dialect # - oracle10g : org.hibernate.dialect.Oracle10gDialect +# - oracle12c : org.hibernate.dialect.Oracle12cDialect +# - MySQL5 : org.hibernate.dialect.MySQL5Dialect # - MySQL8 : org.hibernate.dialect.MySQL8Dialect # - MariaDB 10.3 : org.hibernate.dialect.MariaDB103Dialect -hibernate.dialect=org.hibernate.dialect.MySQL5Dialect +hibernate.dialect=org.hibernate.dialect.Oracle12cDialect # eLink default functions # set System property in real system #inst.Name=${HOSTNAME} -inst.Name=elinkSvr11 -eai.jdbc.Name=NDAPIGW_APP_NXA -eai.rmiport=10211 -eai.rmiserviceport=10212 +inst.Name=agwSvr11 +eai.jdbc.Name=jdbc/dsOBP_AGW +eai.rmiport=30111 +eai.rmiserviceport=30112 eai.systemmode=D # EAI FEP MCI GW ... eai.systemtype=API -eai.tableowner=ndapigw +eai.tableowner=AGWADM eai.server.extractor=[0,2],[0,2],[-2] diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml index 3e0192a..6661aad 100644 --- a/WebContent/WEB-INF/web.xml +++ b/WebContent/WEB-INF/web.xml @@ -34,7 +34,18 @@ contextConfigLocation /WEB-INF/applicationContext.xml - + + + authserver @@ -60,17 +71,17 @@ - - - - - - - - - - - + + + RestApiDynamicInAdapter + com.eactive.eai.adapter.http.dynamic.RestApiAdapterMain + 2 + + + RestApiDynamicInAdapter + /API/* + /api/* + +<%@ page language="java" contentType="text/html;charset=utf-8"%> + + + Gateway 관리메뉴 + + + <% + String display = null; + try{ + com.eactive.kakao.rolling.TableSuffixResolver service = com.eactive.eai.common.util.ApplicationContextProvider.getContext().getBean(com.eactive.kakao.rolling.TableSuffixResolver.class); + com.eactive.kakao.rolling.CurrentCommitIdService currentCommitIdService = com.eactive.eai.common.util.ApplicationContextProvider.getContext().getBean(com.eactive.kakao.rolling.CurrentCommitIdService.class); + String currentCommitId = currentCommitIdService.getSystemCommitId(); + String currentSuffix = service.getCurrentSuffix(); + if (currentCommitId != null && currentSuffix != null){ + display = "rolling [ currentCommitId=" + currentCommitId + ", currentSuffix=" + currentSuffix +" ]" ; + } + }catch(Exception e){ + + } + %> +

POD[<%=System.getProperty("inst.Name")%>] IP[<%=request.getLocalAddr()%>] Hostname[<%=java.net.InetAddress.getLocalHost().getHostName()%>] <%=display != null ? display : "" %>

+

+ 오류메시지 관리
+ + 어댑터 관리
+ + 프라퍼티 관리
+ + 로그조회키 관리
+ 메시지 키 관리
+ + 내부표준메시지 관리
+ + EAI 서비스 코드 관리
+ + 라우팅 필드추출 정보
+ 라우팅 B2B기관 정보
+ 라우팅 특정포트 매핑
+ + EAI 서버 관리
+ Routing 관리
+ + TestCall 상태 관리
+ LifeCycle List
+ +
+ + + + + +
Transform Rule Reload
    └──>메시지레이아웃 유형 관리
    └──>변환함수 관리
+
+ + 어댑터 유량제어 정보
+ 인터페이스 유량제어 정보
+

+ + diff --git a/build.gradle b/build.gradle index fbbc1cc..657cb6f 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { } group 'com.eactvie' -version '4.5.7' +//version '4.5.7' def springVersion = "5.3.27" //def springSecurityVersion = '4.2.13.RELEASE' @@ -46,8 +46,6 @@ compileJava { } war { - archiveFileName = "eapim-online.war" - exclude '**/persistence.xml' exclude '**/context.xml' } From a02d179ba18f02925928da1844c154d534371d6d Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 14:05:47 +0900 Subject: [PATCH 2/9] =?UTF-8?q?KJBank=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=B0=8F=20Sync=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WEB-INF/properties/env.common.properties | 4 +- .../adapter/service/ApiAdapterService.java | 167 +++++++++++++++++- 2 files changed, 167 insertions(+), 4 deletions(-) diff --git a/WebContent/WEB-INF/properties/env.common.properties b/WebContent/WEB-INF/properties/env.common.properties index 1341574..9122d87 100644 --- a/WebContent/WEB-INF/properties/env.common.properties +++ b/WebContent/WEB-INF/properties/env.common.properties @@ -18,7 +18,9 @@ shutdown.wait.intervalms=1000 # message function # use default options # async queue -use.internal.queue=true +// below false to test Weblogic JMS, jwhong +#use.internal.queue=true +use.internal.queue=false # sync-async mapping use.internal.topic=true # restore mapping diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index ddc536c..d846aa1 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -7,6 +7,7 @@ import com.eactive.eai.adapter.Keys; import com.eactive.eai.adapter.http.HttpMemoryLogger; import com.eactive.eai.adapter.http.HttpMethodType; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; +import com.eactive.eai.authserver.service.OAuth2Manager; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.util.CommonLib; @@ -18,6 +19,10 @@ import com.eactive.eai.message.StandardMessageUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.kjbank.encrypt.exchange.crypto.AES256Cipher; +import com.kjbank.encrypt.exchange.crypto.AESCipher; + +import edu.emory.mathcs.backport.java.util.Arrays; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; @@ -33,9 +38,32 @@ import org.springframework.util.AntPathMatcher; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.*; +//for encrypt/decrypt jwhong +import com.kjbank.encrypt.exchange.crypto.AES256Cipher; +import com.kjbank.encrypt.exchange.crypto.AESCipher; +import java.nio.charset.StandardCharsets; + +import com.eactive.eai.common.util.Logger; +import edu.emory.mathcs.backport.java.util.Arrays; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.io.ByteArrayInputStream; +import java.io.ObjectInputStream; +import com.eactive.eai.authserver.vo.ClientVO; +import org.springframework.security.oauth2.provider.ClientDetails; + @Service public class ApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); @@ -49,7 +77,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { private static final String JSON_FIELD_NAME = "json-body"; private static final String FILE_GROUP_NAME = "image-file"; private static final String UPLOAD_ROOT_PATH = "UPLOAD_ROOT_PATH"; - + public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; @@ -70,7 +98,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String paramValue = null; String adptMsgType = null; - + transactionProp.put(INBOUND_METHOD, request.getMethod()); transactionProp.put(INBOUND_URI, request.getRequestURI()); transactionProp.put(INBOUND_HEADER, getHeaders(request)); @@ -80,7 +108,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String extUrl = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); transactionProp.put(INBOUND_EXTURI, extUrl); } else { - transactionProp.put(INBOUND_EXTURI, getExtUri(request)); + transactionProp.put(INBOUND_EXTURI, getExtUri(request)); } transactionProp.put(INBOUND_CLIENT_IP, getClientIp(request)); // Client IP 추가 transactionProp.put(Processor.REQUEST_ACTION, adapterVO.getAdapterGroupVO().getRefClass()); @@ -92,6 +120,13 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { transactionProp.put(ENC_PATHS, httpProp.getProperty(ENC_PATHS, "")); + transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); //jwhong + transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); // jwhong + transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong + //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong + transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put + + try { traceLevel = Integer.parseInt(traceLevelTemp); } catch (Exception e) { @@ -197,6 +232,9 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { if (paramValue == null) { // parameter가 없는 경우때문에 처리 paramValue = ""; + } + else { // jwhong decrypt + paramValue = doPreDecryption(paramValue, transactionProp); } if ("Y".equals(urlDecodeYn) && isParameterType) { @@ -279,6 +317,129 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { return result; } + + + // jwhong encrypt + + private String doPreDecryption(String eaiBody, Properties transactionProp) { + String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); + String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong + String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); + String inboundToken = transactionProp.getProperty(INBOUND_TOKEN, ""); + + if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 + return eaiBody; + } + + // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 + // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 + String clientSecret = ""; + if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { + clientSecret = inboundToken; + } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { + OAuth2Manager manager = OAuth2Manager.getInstance(); + ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); + + if ( clientDetail != null ) { + clientSecret = clientDetail.getClientSecret(); + } + } + + byte[] decryptedMessage = null; + decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret); + + String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); + return resultMessage; + //return new String(decryptedMessage, StandardCharsets.UTF_8 ); + } + + + private byte[] convertObjectToBytes(Object obj) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + return bos.toByteArray(); + } + + private byte[] convertObjectToBase64Bytes(Object obj) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + oos.close(); + + // 직렬화된 byte[] → Base64 문자열 → 다시 byte[]로 변환 + String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); + return base64String.getBytes(StandardCharsets.UTF_8); + } + + public static Object convertBytesToObject(byte[] bytes) throws IOException, ClassNotFoundException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + ObjectInputStream ois = new ObjectInputStream(bis)) { + return ois.readObject(); + } + } + + + private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey) { + + byte[] decryptedMessage = null; + //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); + + //test source + //System.out.println("eaiBody 바이트 배열 길이: " + eaiBody.length); + System.out.println("Base64 문자열: " + eaiStringBody); + System.out.println("Base64 문자열 길이: " + eaiStringBody.length()); + System.out.println("Base64 문자열 끝: " + eaiStringBody.substring(eaiStringBody.length() - 10)); + + // Base64 디코딩 테스트 + try { + byte[] decoded = Base64.getDecoder().decode(eaiStringBody); + System.out.println("디코딩 성공, 길이: " + decoded.length); + } catch (IllegalArgumentException e) { + System.out.println("Base64 디코딩 실패: " + e.getMessage()); + } + // end test source + + switch (decryptAlgorithm) { + case "AES128": + + String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? + try { + //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); + String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); + } + break; + case "AES256": + String key = clientSecretKey.substring(10,42); + try { + String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, key); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + default: + try { + //decryptedMessage = Arrays.copyOf(eaiBody, eaiBody.length); + decryptedMessage = eaiStringBody.getBytes(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); + } + break; + } + + return decryptedMessage; + } + + // jwhong until here private Map assignParameterMap(HttpServletRequest request, String adptGrpName, String adptName, From 6f26e949c583e6c276e45fba1c93fbde44b2caac Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 15:10:07 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=EC=95=94=ED=98=B8=ED=99=94=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/service/ApiAdapterService.java | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index d846aa1..2bb510e 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -7,7 +7,6 @@ import com.eactive.eai.adapter.Keys; import com.eactive.eai.adapter.http.HttpMemoryLogger; import com.eactive.eai.adapter.http.HttpMethodType; import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceSupport; -import com.eactive.eai.authserver.service.OAuth2Manager; import com.eactive.eai.common.exception.ExceptionUtil; import com.eactive.eai.common.message.MessageType; import com.eactive.eai.common.util.CommonLib; @@ -19,16 +18,12 @@ import com.eactive.eai.message.StandardMessageUtil; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.kjbank.encrypt.exchange.crypto.AES256Cipher; -import com.kjbank.encrypt.exchange.crypto.AESCipher; - -import edu.emory.mathcs.backport.java.util.Arrays; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.mina.common.ByteBuffer; import org.json.simple.JSONObject; -import org.json.simple.JSONValue; +import org.json.simple.JSONValue; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -38,30 +33,19 @@ import org.springframework.util.AntPathMatcher; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.util.*; //for encrypt/decrypt jwhong +import com.eactive.eai.authserver.service.OAuth2Manager; import com.kjbank.encrypt.exchange.crypto.AES256Cipher; import com.kjbank.encrypt.exchange.crypto.AESCipher; import java.nio.charset.StandardCharsets; - -import com.eactive.eai.common.util.Logger; -import edu.emory.mathcs.backport.java.util.Arrays; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.IOException; -import java.io.Serializable; -import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; -import com.eactive.eai.authserver.vo.ClientVO; import org.springframework.security.oauth2.provider.ClientDetails; @Service From bb068cce206731ea6a5a40af1ae04d9afa2d1a4c Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 15:20:52 +0900 Subject: [PATCH 4/9] =?UTF-8?q?KJBank=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=B0=8F=20Sync=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/META-INF/context.xml | 36 +++++++++++++++++++++++++++++++++ elink-online-common | 2 +- elink-online-core | 2 +- elink-online-core-jpa | 2 +- elink-online-emsclient | 2 +- elink-online-transformer | 2 +- 6 files changed, 41 insertions(+), 5 deletions(-) diff --git a/WebContent/META-INF/context.xml b/WebContent/META-INF/context.xml index 8e8180c..e2156df 100644 --- a/WebContent/META-INF/context.xml +++ b/WebContent/META-INF/context.xml @@ -25,9 +25,45 @@ +<<<<<<< HEAD +======= + + + + + + + + + + + + + + + +>>>>>>> 05596e9 (KJBank 암호화 관련 및 Sync 관련 수정) \ No newline at end of file diff --git a/elink-online-common b/elink-online-common index aacc1a3..8ba0b6e 160000 --- a/elink-online-common +++ b/elink-online-common @@ -1 +1 @@ -Subproject commit aacc1a389e145453cf92c18e9d7ffef568cf89e7 +Subproject commit 8ba0b6ee9c9fe1f751be5ee5e727b73faccb80ee diff --git a/elink-online-core b/elink-online-core index 0f148e9..668aca0 160000 --- a/elink-online-core +++ b/elink-online-core @@ -1 +1 @@ -Subproject commit 0f148e997ec808e01a013baa8ca7b0053a69fe22 +Subproject commit 668aca0ff96e021096ba3add447e36a3c05b4535 diff --git a/elink-online-core-jpa b/elink-online-core-jpa index 2cd9c29..33cf6fb 160000 --- a/elink-online-core-jpa +++ b/elink-online-core-jpa @@ -1 +1 @@ -Subproject commit 2cd9c29d4df228c1ffd7ed6471c8245510b19213 +Subproject commit 33cf6fbd3d5914095d2ef57c72888560bbdb3ac3 diff --git a/elink-online-emsclient b/elink-online-emsclient index f68423b..b5f62fd 160000 --- a/elink-online-emsclient +++ b/elink-online-emsclient @@ -1 +1 @@ -Subproject commit f68423b40ecb5076990739f09f87ec62f7fd17ae +Subproject commit b5f62fda76bdbb1f50f2427abf3979edad87610f diff --git a/elink-online-transformer b/elink-online-transformer index c3e2de4..3e16b13 160000 --- a/elink-online-transformer +++ b/elink-online-transformer @@ -1 +1 @@ -Subproject commit c3e2de482be0fa692a5133cf77e0e3dc86357b6e +Subproject commit 3e16b13d7265518ad140433273101a9d4a4f694d From 1a5cf2c78ff663471f748e4e5231cfe7b061507d Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 14:47:47 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/service/ApiAdapterService.java | 139 +----------------- 1 file changed, 3 insertions(+), 136 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 2bb510e..6a72af8 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -61,7 +61,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { private static final String JSON_FIELD_NAME = "json-body"; private static final String FILE_GROUP_NAME = "image-file"; private static final String UPLOAD_ROOT_PATH = "UPLOAD_ROOT_PATH"; - + public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; @@ -82,7 +82,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String paramValue = null; String adptMsgType = null; - + transactionProp.put(INBOUND_METHOD, request.getMethod()); transactionProp.put(INBOUND_URI, request.getRequestURI()); transactionProp.put(INBOUND_HEADER, getHeaders(request)); @@ -92,7 +92,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String extUrl = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); transactionProp.put(INBOUND_EXTURI, extUrl); } else { - transactionProp.put(INBOUND_EXTURI, getExtUri(request)); + transactionProp.put(INBOUND_EXTURI, getExtUri(request)); } transactionProp.put(INBOUND_CLIENT_IP, getClientIp(request)); // Client IP 추가 transactionProp.put(Processor.REQUEST_ACTION, adapterVO.getAdapterGroupVO().getRefClass()); @@ -104,13 +104,6 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { transactionProp.put(ENC_PATHS, httpProp.getProperty(ENC_PATHS, "")); - transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); //jwhong - transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); // jwhong - transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong - //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong - transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put - - try { traceLevel = Integer.parseInt(traceLevelTemp); } catch (Exception e) { @@ -216,9 +209,6 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { if (paramValue == null) { // parameter가 없는 경우때문에 처리 paramValue = ""; - } - else { // jwhong decrypt - paramValue = doPreDecryption(paramValue, transactionProp); } if ("Y".equals(urlDecodeYn) && isParameterType) { @@ -301,129 +291,6 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { return result; } - - - // jwhong encrypt - - private String doPreDecryption(String eaiBody, Properties transactionProp) { - String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); - String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong - String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); - String inboundToken = transactionProp.getProperty(INBOUND_TOKEN, ""); - - if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 - return eaiBody; - } - - // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 - // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 - String clientSecret = ""; - if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { - clientSecret = inboundToken; - } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { - OAuth2Manager manager = OAuth2Manager.getInstance(); - ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); - - if ( clientDetail != null ) { - clientSecret = clientDetail.getClientSecret(); - } - } - - byte[] decryptedMessage = null; - decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret); - - String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); - return resultMessage; - //return new String(decryptedMessage, StandardCharsets.UTF_8 ); - } - - - private byte[] convertObjectToBytes(Object obj) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - oos.flush(); - return bos.toByteArray(); - } - - private byte[] convertObjectToBase64Bytes(Object obj) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - oos.flush(); - oos.close(); - - // 직렬화된 byte[] → Base64 문자열 → 다시 byte[]로 변환 - String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); - return base64String.getBytes(StandardCharsets.UTF_8); - } - - public static Object convertBytesToObject(byte[] bytes) throws IOException, ClassNotFoundException { - try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(bis)) { - return ois.readObject(); - } - } - - - private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey) { - - byte[] decryptedMessage = null; - //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); - - //test source - //System.out.println("eaiBody 바이트 배열 길이: " + eaiBody.length); - System.out.println("Base64 문자열: " + eaiStringBody); - System.out.println("Base64 문자열 길이: " + eaiStringBody.length()); - System.out.println("Base64 문자열 끝: " + eaiStringBody.substring(eaiStringBody.length() - 10)); - - // Base64 디코딩 테스트 - try { - byte[] decoded = Base64.getDecoder().decode(eaiStringBody); - System.out.println("디코딩 성공, 길이: " + decoded.length); - } catch (IllegalArgumentException e) { - System.out.println("Base64 디코딩 실패: " + e.getMessage()); - } - // end test source - - switch (decryptAlgorithm) { - case "AES128": - - String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? - try { - //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); - String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); - } - break; - case "AES256": - String key = clientSecretKey.substring(10,42); - try { - String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, key); - decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); - } - break; - default: - try { - //decryptedMessage = Arrays.copyOf(eaiBody, eaiBody.length); - decryptedMessage = eaiStringBody.getBytes(); - } catch (Exception e) { - e.printStackTrace(); - logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); - } - break; - } - - return decryptedMessage; - } - - // jwhong until here private Map assignParameterMap(HttpServletRequest request, String adptGrpName, String adptName, From 70a5f4d9d4e676aa78514677031af98fadc784d6 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 15:02:20 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=EC=95=94=ED=98=B8=ED=99=94=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eai/adapter/service/ApiAdapterService.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 6a72af8..9ff80e3 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -36,18 +36,6 @@ import javax.servlet.http.HttpServletResponse; import java.net.URLDecoder; import java.util.*; -//for encrypt/decrypt jwhong -import com.eactive.eai.authserver.service.OAuth2Manager; -import com.kjbank.encrypt.exchange.crypto.AES256Cipher; -import com.kjbank.encrypt.exchange.crypto.AESCipher; -import java.nio.charset.StandardCharsets; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import org.springframework.security.oauth2.provider.ClientDetails; - @Service public class ApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); From 430cf9a5af38199159a5e95b3eb2683f39ca87c0 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 15:25:18 +0900 Subject: [PATCH 7/9] aaaa --- .../eai/adapter/service/ApiAdapterService.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index 9ff80e3..f527741 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -23,7 +23,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; import org.apache.mina.common.ByteBuffer; import org.json.simple.JSONObject; -import org.json.simple.JSONValue; +import org.json.simple.JSONValue; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -36,6 +36,19 @@ import javax.servlet.http.HttpServletResponse; import java.net.URLDecoder; import java.util.*; +//for encrypt/decrypt jwhong +import com.eactive.eai.authserver.service.OAuth2Manager; +import com.kjbank.encrypt.exchange.crypto.AES256Cipher; +import com.kjbank.encrypt.exchange.crypto.AESCipher; +import java.nio.charset.StandardCharsets; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import org.springframework.security.oauth2.provider.ClientDetails; + + @Service public class ApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); From bf0f77838fec2803ce58be35cfd8563dc5d0d8be Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 16:24:57 +0900 Subject: [PATCH 8/9] =?UTF-8?q?KJBank=20=EC=95=94=ED=98=B8=ED=99=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/service/ApiAdapterService.java | 140 +++++++++++++++++- 1 file changed, 136 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java index f527741..77b80b4 100644 --- a/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java +++ b/src/main/java/com/eactive/eai/adapter/service/ApiAdapterService.java @@ -48,7 +48,6 @@ import java.io.IOException; import java.io.ObjectInputStream; import org.springframework.security.oauth2.provider.ClientDetails; - @Service public class ApiAdapterService extends HttpAdapterServiceSupport { static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); @@ -62,7 +61,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { private static final String JSON_FIELD_NAME = "json-body"; private static final String FILE_GROUP_NAME = "image-file"; private static final String UPLOAD_ROOT_PATH = "UPLOAD_ROOT_PATH"; - + public String callApi(HttpServletRequest request, HttpServletResponse response, Properties httpProp, AdapterGroupVO adapterGroupVO, AdapterVO adapterVO, Properties transactionProp) throws Exception { int traceLevel = 0; @@ -83,7 +82,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String paramValue = null; String adptMsgType = null; - + transactionProp.put(INBOUND_METHOD, request.getMethod()); transactionProp.put(INBOUND_URI, request.getRequestURI()); transactionProp.put(INBOUND_HEADER, getHeaders(request)); @@ -93,7 +92,7 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { String extUrl = StringUtils.removeStart(request.getRequestURI(), request.getContextPath()); transactionProp.put(INBOUND_EXTURI, extUrl); } else { - transactionProp.put(INBOUND_EXTURI, getExtUri(request)); + transactionProp.put(INBOUND_EXTURI, getExtUri(request)); } transactionProp.put(INBOUND_CLIENT_IP, getClientIp(request)); // Client IP 추가 transactionProp.put(Processor.REQUEST_ACTION, adapterVO.getAdapterGroupVO().getRefClass()); @@ -105,6 +104,13 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { transactionProp.put(ENC_PATHS, httpProp.getProperty(ENC_PATHS, "")); + transactionProp.put(ENCRYPT_ALGORITHM, httpProp.getProperty(ENCRYPT_ALGORITHM, "")); //jwhong + transactionProp.put(HEADER_NAME_CLIENT_ID, getHeaders(request).get(HEADER_NAME_CLIENT_ID)); // jwhong + transactionProp.put(ENCRYPT_BASE_TYPE, httpProp.getProperty(ENCRYPT_BASE_TYPE, "")); //jwhong + //transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN)); // jwhong + transactionProp.put(INBOUND_TOKEN, getHeaders(request).get(INBOUND_TOKEN) != null ? getHeaders(request).get(INBOUND_TOKEN) : ""); //jwhong , null 이면 default로 "" put + + try { traceLevel = Integer.parseInt(traceLevelTemp); } catch (Exception e) { @@ -210,6 +216,9 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { if (paramValue == null) { // parameter가 없는 경우때문에 처리 paramValue = ""; + } + else { // jwhong decrypt + paramValue = doPreDecryption(paramValue, transactionProp); } if ("Y".equals(urlDecodeYn) && isParameterType) { @@ -292,6 +301,129 @@ public class ApiAdapterService extends HttpAdapterServiceSupport { return result; } + + + // jwhong encrypt + + private String doPreDecryption(String eaiBody, Properties transactionProp) { + String decryptAlgorithm = transactionProp.getProperty(ENCRYPT_ALGORITHM, ""); + String xElinkClientId = transactionProp.getProperty(HEADER_NAME_CLIENT_ID, ""); // 이 값이 OAuth의 client id 값이다 . http header 에 포함되어 온다. jwhong + String encryptBaseKeyType = transactionProp.getProperty(ENCRYPT_BASE_TYPE); + String inboundToken = transactionProp.getProperty(INBOUND_TOKEN, ""); + + if ( decryptAlgorithm == "" ) { // 복호화 대상이 아님 + return eaiBody; + } + + // 암호화 key를 token 내용으로 할지 client secret 내용으로 할지 결정함. adapter property에 정의함 + // ENCRYPT_ALGORITHM 을 설정했는데 ENCRYPT_BASE_TYPE을 설정안하면 Decrypt 수행시 Exception 발생함 + String clientSecret = ""; + if ("TOKEN".equalsIgnoreCase(encryptBaseKeyType)) { + clientSecret = inboundToken; + } else if ( "SECRETKEY".equalsIgnoreCase(encryptBaseKeyType)) { + OAuth2Manager manager = OAuth2Manager.getInstance(); + ClientDetails clientDetail = manager.getClientDeatilsStore().get(xElinkClientId); + + if ( clientDetail != null ) { + clientSecret = clientDetail.getClientSecret(); + } + } + + byte[] decryptedMessage = null; + decryptedMessage = doInboundPreDecrypt(eaiBody, decryptAlgorithm,clientSecret); + + String resultMessage = new String(decryptedMessage, StandardCharsets.UTF_8 ); + return resultMessage; + //return new String(decryptedMessage, StandardCharsets.UTF_8 ); + } + + + private byte[] convertObjectToBytes(Object obj) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + return bos.toByteArray(); + } + + private byte[] convertObjectToBase64Bytes(Object obj) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(obj); + oos.flush(); + oos.close(); + + // 직렬화된 byte[] → Base64 문자열 → 다시 byte[]로 변환 + String base64String = Base64.getEncoder().encodeToString(bos.toByteArray()); + return base64String.getBytes(StandardCharsets.UTF_8); + } + + public static Object convertBytesToObject(byte[] bytes) throws IOException, ClassNotFoundException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + ObjectInputStream ois = new ObjectInputStream(bis)) { + return ois.readObject(); + } + } + + + private byte[] doInboundPreDecrypt(String eaiStringBody, String decryptAlgorithm, String clientSecretKey) { + + byte[] decryptedMessage = null; + //String eaiStringBody = new String(eaiBody, StandardCharsets.UTF_8); + + //test source + //System.out.println("eaiBody 바이트 배열 길이: " + eaiBody.length); + System.out.println("Base64 문자열: " + eaiStringBody); + System.out.println("Base64 문자열 길이: " + eaiStringBody.length()); + System.out.println("Base64 문자열 끝: " + eaiStringBody.substring(eaiStringBody.length() - 10)); + + // Base64 디코딩 테스트 + try { + byte[] decoded = Base64.getDecoder().decode(eaiStringBody); + System.out.println("디코딩 성공, 길이: " + decoded.length); + } catch (IllegalArgumentException e) { + System.out.println("Base64 디코딩 실패: " + e.getMessage()); + } + // end test source + + switch (decryptAlgorithm) { + case "AES128": + + String key128 = clientSecretKey.substring(22,38); //togetherEncoder 경우는 substring(44,60) 이네?? + try { + //String decryptedStrMessage = AESCipher.decrypt(eaiStringBody, key128); + String decryptedStrMessage = AESCipher.decryptExistException(eaiStringBody, key128); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES128 Decryption error=" + e.getMessage()); + } + break; + case "AES256": + String key = clientSecretKey.substring(10,42); + try { + String decryptedStrMessage = AES256Cipher.decrypt(eaiStringBody, key); + decryptedMessage = decryptedStrMessage.getBytes(StandardCharsets.UTF_8); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] AES256 Decryption error=" + e.getMessage()); + } + break; + default: + try { + //decryptedMessage = Arrays.copyOf(eaiBody, eaiBody.length); + decryptedMessage = eaiStringBody.getBytes(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("HttpClientAdapterServiceRest] doOutboundPostFilter Array copy error=" + e.getMessage()); + } + break; + } + + return decryptedMessage; + } + + // jwhong until here private Map assignParameterMap(HttpServletRequest request, String adptGrpName, String adptName, From 4c4a22a2a58e847541162a671d745a7731e7bad4 Mon Sep 17 00:00:00 2001 From: jaewohong Date: Mon, 13 Oct 2025 16:31:54 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/META-INF/context.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/WebContent/META-INF/context.xml b/WebContent/META-INF/context.xml index e2156df..385912e 100644 --- a/WebContent/META-INF/context.xml +++ b/WebContent/META-INF/context.xml @@ -25,12 +25,6 @@ -<<<<<<< HEAD - -=======