diff --git a/WebContent/WEB-INF/auditpoints.dat b/WebContent/WEB-INF/auditpoints.dat index 8c4f211..6b048d5 100644 --- a/WebContent/WEB-INF/auditpoints.dat +++ b/WebContent/WEB-INF/auditpoints.dat @@ -14,4 +14,5 @@ ApiSpecController_API스펙관리_APIGW_INSERT,DELETE MessageTemplateManController_메세지템플릿관리_APIGW_INSERT,UPDATE,DELETE PortalPartnershipManController_피드백/개선요청관리_APIGW_UNMASK,DELETE PortalPropertyController_포탈 프로퍼티 관리_APIGW_UPDATE -PortalUserTermsManController_약관동의 이력_APIGW_UNMASK \ No newline at end of file +PortalUserTermsManController_약관동의 이력_APIGW_UNMASK +MessageRequestManController_메세지발송내역_APIGW_UPDATE_STATUS diff --git a/WebContent/jsp/onl/apim/messagerequest/messageRequestMan.jsp b/WebContent/jsp/onl/apim/messagerequest/messageRequestMan.jsp new file mode 100644 index 0000000..73516a7 --- /dev/null +++ b/WebContent/jsp/onl/apim/messagerequest/messageRequestMan.jsp @@ -0,0 +1,211 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> +<%@ page import="java.io.*" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> +<%@ include file="/jsp/common/include/localemessage.jsp" %> +<% + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Expires", "0"); +%> + +
+| 메세지 코드 | ++ | ||
|---|---|---|---|
| 제목 | ++ | ||
| 유형 | ++ | 상태 | ++ |
| 수신자명 | ++ | 메신저 ID | ++ |
| 이메일 | ++ | 휴대폰 | ++ |
| 요청 시간 | ++ | 발송 시간 | ++ |
| EAI 인터페이스 ID | ++ | 서비스 ID | ++ |
| UMS UID | ++ | ||
| 메세지 내용 | ++ | ||
elink-portal-common 의 {@code template.repository.MessageRequestRepository}(JpaRepository) 와 + * 단순 클래스명이 겹치면 Spring Data 빈 이름이 충돌하므로(둘 다 admin 컨텍스트에 스캔됨) + * 이름을 분리한다. 또한 QueryDSL {@code findAll(predicate, pageable)} 를 쓰기 위해 + * {@link BaseRepository} 를 상속한다.
+ */ +@EMSDataSource +public interface MessageRequestEmsRepository extends BaseRepository본문(message) 안에 섞여 있는 개인정보/인증정보를 패턴으로 찾아 마스킹하고, + * 패턴 종류별로 색상 강조 {@code } 으로 감싼 안전한 HTML 을 만든다. + * 매칭되지 않은 영역과 마스킹 결과 모두 HTML escape 하므로 본문에 스크립트가 있어도 무력화된다.
+ * + *+ * 이메일 test@gmail.com → <span class="mask-email">**st@gmail.com</span> + * 휴대폰(하이픈) 010-1234-5678 → <span class="mask-phone">010-12**-56**</span> + * 6자리+ 숫자 123456 → <span class="mask-digits">123***</span> (앞 3자리 제외) + * 메신저ID kakao_abcd → kakao_ab** (뒤 2자리) + *+ * + *
실제 이메일/휴대폰 마스킹 규칙은 표준 구현 + * {@link com.eactive.eai.common.util.MaskingUtils}(elink-online-core)에 위임한다.
+ */ +public final class MessagePatternMaskingUtils { + + private MessagePatternMaskingUtils() {} + + private static final int DIGITS_KEEP_HEAD = 3; + + /** + * 매칭 우선순위(이메일 > 하이픈 휴대폰 > 6자리+ 숫자)를 단일 패스로 보장하는 결합 정규식. + * 휴대폰 하이픈 형식이 "6자리 이상 숫자" 규칙에 이중 적용되지 않도록 한 Matcher 로 순회한다. + */ + private static final Pattern COMBINED = Pattern.compile( + "(?조회 전용 + PENDING→FAILED 상태 전환만 제공한다. (등록/수정/삭제 없음)
+ */ +@Controller +@RequiredArgsConstructor +public class MessageRequestManController extends BaseAnnotationController { + + private final MessageRequestManService messageRequestManService; + + @GetMapping(value = "/onl/apim/messagerequest/messageRequestMan.view") + public void view() { + // 목록 view + } + + @GetMapping(value = "/onl/apim/messagerequest/messageRequestMan.view", params = "cmd=DETAIL") + public String detailView() { + return "/onl/apim/messagerequest/messageRequestManDetail"; + } + + @PostMapping(value = "/onl/apim/messagerequest/messageRequestMan.json", params = "cmd=LIST") + public ResponseEntity