From 6fec0efb19fbe780db39ccaf90335c9cabe3e785 Mon Sep 17 00:00:00 2001 From: ijunho Date: Tue, 18 Nov 2025 18:16:25 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 33 +- .../kcc/kccadr/xxx/web/XxxWebController.java | 185 +++--- .../cop/bbs/web/EgovBBSManageController.java | 195 +++---- .../service/impl/EgovLoginServiceImpl.java | 3 - .../let/uat/uia/web/EgovLoginController.java | 75 ++- .../kcc/ve/cmm/crt/CertPhoneRequestUtill.java | 102 ++++ .../kcc/ve/cmm/crt/CertPhoneResultUtill.java | 355 ++++++++++++ .../ve/cmm/crt/CertPhoneWebController.java | 188 ++++++ .../kcc/ve/cmm/sendAt/PpurioGlobalSet.java | 121 ++++ src/main/java/kcc/ve/cmm/sendAt/SendAtVO.java | 89 +++ .../java/kcc/ve/cmm/sendAt/SendService.java | 52 ++ .../java/kcc/ve/cmm/sendAt/SendSmsVO.java | 24 + .../java/kcc/ve/cmm/sendAt/impl/SendDAO.java | 38 ++ .../ve/cmm/sendAt/impl/SendServiceImpl.java | 548 ++++++++++++++++++ src/main/java/kcc/web/MainController.java | 21 +- .../sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp | 2 +- .../jsp/uss/ion/pwm/PopupZoneModify.jsp | 4 +- .../WEB-INF/jsp/web/com/webCommonFooter.jsp | 50 +- .../webapp/WEB-INF/jsp/web/com/webLayout.jsp | 2 +- .../web/kccadr/login/CertPhoneResultPop.jsp | 11 + .../kccadr/login/SsoLoginSessionRegist.jsp | 90 --- .../jsp/web/kccadr/login/SsoLoginUsr.jsp | 171 ++++-- .../jsp/web/kccadr/login/SsoLoginUsr2.jsp | 82 --- .../jsp/web/kccadr/login/SsoLoginUsr3.jsp | 289 --------- .../webapp/WEB-INF/lib/sciSecuIPIN_v3.jar | Bin 43596 -> 0 bytes src/main/webapp/WEB-INF/lib/sciSecuPCC.jar | Bin 42177 -> 0 bytes 26 files changed, 1931 insertions(+), 799 deletions(-) create mode 100644 src/main/java/kcc/ve/cmm/crt/CertPhoneRequestUtill.java create mode 100644 src/main/java/kcc/ve/cmm/crt/CertPhoneResultUtill.java create mode 100644 src/main/java/kcc/ve/cmm/crt/CertPhoneWebController.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/PpurioGlobalSet.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/SendAtVO.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/SendService.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/SendSmsVO.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/impl/SendDAO.java create mode 100644 src/main/java/kcc/ve/cmm/sendAt/impl/SendServiceImpl.java create mode 100644 src/main/webapp/WEB-INF/jsp/web/kccadr/login/CertPhoneResultPop.jsp delete mode 100644 src/main/webapp/WEB-INF/jsp/web/kccadr/login/SsoLoginSessionRegist.jsp delete mode 100644 src/main/webapp/WEB-INF/jsp/web/kccadr/login/SsoLoginUsr2.jsp delete mode 100644 src/main/webapp/WEB-INF/jsp/web/kccadr/login/SsoLoginUsr3.jsp delete mode 100644 src/main/webapp/WEB-INF/lib/sciSecuIPIN_v3.jar delete mode 100644 src/main/webapp/WEB-INF/lib/sciSecuPCC.jar diff --git a/pom.xml b/pom.xml index 5bf3eab6..b1807292 100644 --- a/pom.xml +++ b/pom.xml @@ -339,24 +339,6 @@ ${basedir}/src/main/webapp/WEB-INF/lib/simplecaptcha-1.2.1_exp.jar - - - sciSecuPCC - sciSecuPCC - 2 - system - ${basedir}/src/main/webapp/WEB-INF/lib/sciSecuPCC.jar - - - - sciSecuPIN_v3 - sciSecuPIN_v3 - 2 - system - ${basedir}/src/main/webapp/WEB-INF/lib/sciSecuIPIN_v3.jar - - - jcaos @@ -560,8 +542,21 @@ spring-security-crypto 4.2.13.RELEASE + + org.projectlombok + lombok + 1.18.36 + provided + - + + + com.sci.v3 + sciSecuPCC_v3 + v3 + + + install diff --git a/src/main/java/kcc/kccadr/xxx/web/XxxWebController.java b/src/main/java/kcc/kccadr/xxx/web/XxxWebController.java index 591ea102..05b2a56f 100644 --- a/src/main/java/kcc/kccadr/xxx/web/XxxWebController.java +++ b/src/main/java/kcc/kccadr/xxx/web/XxxWebController.java @@ -1,26 +1,6 @@ package kcc.kccadr.xxx.web; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.annotation.Resource; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.MultipartHttpServletRequest; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; - +import com.fasterxml.jackson.databind.ObjectMapper; import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; import kcc.com.cmm.CmmUtil; @@ -30,18 +10,37 @@ import kcc.com.cmm.service.EgovCmmUseService; import kcc.com.cmm.service.EgovFileMngService; import kcc.com.cmm.service.EgovFileMngUtil; import kcc.com.cmm.service.FileVO; +import kcc.com.utl.user.service.CheckLoginUtil; import kcc.kccadr.xxx.service.XxxService; import kcc.kccadr.xxx.service.XxxVO; +import kcc.ve.cmm.crt.CertPhoneRequestUtill; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.*; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.*; + /** * 대국민(사용자) * XXX에 관한 controller 클래스를 정의한다. - * @author 이준호 - * @since 2021.08.09 - * @version 1.0 - * @see * - *
+ * @author 이준호
+ * @version 1.0
+ * @see 
  * << 개정이력(Modification Information) >>
  *
  *   수정일      수정자           수정내용
@@ -49,6 +48,7 @@ import kcc.kccadr.xxx.service.XxxVO;
  *   2021.08.09  이준호          최초 생성
  *
  * 
+ * @since 2021.08.09 */ @Controller public class XxxWebController { @@ -66,36 +66,45 @@ public class XxxWebController { // eGov 공통코드 @Resource(name = "EgovCmmUseService") private EgovCmmUseService cmmUseService; - + // global 프로퍼티 - @Resource(name="globalSettings") + @Resource(name = "globalSettings") protected Properties propertiesService; - + //첨부파일 경로, realPath 설정 - @Resource(name="EgovFileMngUtil") + @Resource(name = "EgovFileMngUtil") private EgovFileMngUtil fileUtil; - + // 첨부파일 정보 - @Resource(name="EgovFileMngService") - private EgovFileMngService fileMngService; - + @Resource(name = "EgovFileMngService") + private EgovFileMngService fileMngService; + + // 첨부파일 정보 + @Resource(name = "certPhoneRequestUtill") + private CertPhoneRequestUtill certPhoneRequestUtill; + + //로그인 체크 util + @Resource(name = "checkLoginUtil") + private CheckLoginUtil checkLoginUtil; + + /** * XXX 목록 화면 */ @RequestMapping("/web/kccadr/xxx/xxxList.do") - public String xxxList(@ModelAttribute("searchVO") XxxVO xxxVO, ModelMap model) throws Exception { + public String xxxList( @ModelAttribute("searchVO") XxxVO xxxVO, ModelMap model ) throws Exception { LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); //로그인 정보 model.addAttribute("user", user); - + List xxxList = xxxService.selectXxxList(xxxVO); // 목록 조회 - + // 페이징 처리 객체 PaginationInfo paginationInfo = CmmUtil.getPageing(xxxVO, xxxVO.getPageUnit()); paginationInfo.setTotalRecordCount(xxxList.size() > 0 ? xxxList.get(0).getTotCnt() : 0); - + //최초조회시 최신것 조회List - if("".equals(xxxVO.getSearchSortCnd())){ + if("".equals(xxxVO.getSearchSortCnd())) { xxxVO.setSearchSortCnd("xxxId"); xxxVO.setSearchSortOrd("desc"); } @@ -113,7 +122,7 @@ public class XxxWebController { * XXX 등록화면 */ @RequestMapping("/web/kccadr/xxx/xxxRegist.do") - public String xxxRegist(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception { + public String xxxRegist( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception { return "/web/kccadr/xxx/xxxRegist"; } @@ -122,42 +131,42 @@ public class XxxWebController { * XXX 등록 처리 */ @RequestMapping("/web/kccadr/xxx/insertXxx.do") - public String insertXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception { + public String insertXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception { xxxService.insertXxx(xxxVO); // 등록 redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert")); // 공통메세지 return "redirect:/web/kccadr/xxx/xxxList.do"; } - + /** - * XXX 등록 Ajax - */ - @RequestMapping(value = {"/web/kccadr/xxx/insertXxxAjax.do"}) - public ModelAndView insertXxxAjax(final MultipartHttpServletRequest multiRequest + * XXX 등록 Ajax + */ + @RequestMapping(value = { "/web/kccadr/xxx/insertXxxAjax.do" }) + public ModelAndView insertXxxAjax( final MultipartHttpServletRequest multiRequest , XxxVO xxxVO , RedirectAttributes redirectAttributes - , HttpServletRequest request) throws Exception { - + , HttpServletRequest request ) throws Exception { + LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); - + ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); - + String atchFileId = ""; final Map files = multiRequest.getFileMap(); - if (!files.isEmpty()) { + if(!files.isEmpty()) { //XXX_로 첨부파일 네이밍 List result = fileUtil.parseFileInf(files, "XXX_", 0, "", "", ""); atchFileId = fileMngService.insertFileInfs(result); //첨부파일Id(atchFileId)를 해당 VO atchFileId변수에 저장 xxxVO.setAtchFileId(atchFileId); } - + xxxVO.setFrstRegisterId(user.getId()); //게시글 등록 서비스 xxxService.insertXxx(xxxVO); - + modelAndView.addObject("result", "success"); return modelAndView; } @@ -166,7 +175,7 @@ public class XxxWebController { * XXX 상세화면 */ @RequestMapping("/web/kccadr/xxx/xxxDetail.do") - public String xxxDetail(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception { + public String xxxDetail( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception { XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회 model.addAttribute("result", result); @@ -178,7 +187,7 @@ public class XxxWebController { * XXX 수정화면 */ @RequestMapping("/web/kccadr/xxx/xxxModify.do") - public String xxxModify(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception { + public String xxxModify( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception { XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회 model.addAttribute("result", result); @@ -190,34 +199,34 @@ public class XxxWebController { * XXX 수정 처리 */ @RequestMapping("/web/kccadr/xxx/updateXxx.do") - public String updateXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception { - + public String updateXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception { + xxxService.updateXxx(xxxVO); // 수정 redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update")); // 공통메세지 return "redirect:/web/kccadr/xxx/xxxDetail.do"; } - + /** - * xxx 수정 Ajax - */ - @RequestMapping(value = {"/web/kccadr/xxx/updateXxxAjax.do"}) - public ModelAndView updateXxxAjax(final MultipartHttpServletRequest multiRequest + * xxx 수정 Ajax + */ + @RequestMapping(value = { "/web/kccadr/xxx/updateXxxAjax.do" }) + public ModelAndView updateXxxAjax( final MultipartHttpServletRequest multiRequest , XxxVO xxxVO , RedirectAttributes redirectAttributes - , HttpServletRequest request) throws Exception { - + , HttpServletRequest request ) throws Exception { + ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); - + String atchFileId = ""; final Map files = multiRequest.getFileMap(); - - if (!files.isEmpty()) { - if ("".equals(atchFileId)) { + + if(!files.isEmpty()) { + if("".equals(atchFileId)) { //XXX_로 첨부파일 네이밍 List result = fileUtil.parseFileInf(files, "XXX_", 0, atchFileId, "", ""); - + atchFileId = fileMngService.insertFileInfs(result); //첨부파일Id(atchFileId)를 해당 VO atchFileId변수에 저장 xxxVO.setAtchFileId(atchFileId); @@ -226,13 +235,13 @@ public class XxxWebController { fvo.setAtchFileId(atchFileId); int cnt = fileMngService.getMaxFileSN(fvo); List result = fileUtil.parseFileInf(files, "XXX_", cnt, atchFileId, "", ""); - + fileMngService.updateFileInfs(result); } } //게시글 수정 서비스 xxxService.updateXxx(xxxVO); - + modelAndView.addObject("result", "success"); return modelAndView; } @@ -241,29 +250,29 @@ public class XxxWebController { * XXX 삭제 처리 */ @RequestMapping("/web/kccadr/xxx/deleteXxx.do") - public String deleteXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception { + public String deleteXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception { xxxService.deleteXxx(xxxVO); // 삭제 redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete")); // 공통메세지 - + return "redirect:/web/kccadr/xxx/xxxList.do"; } - + /** - * XXX 삭제 처리(delete가 아닌 useYn컬럼을 상태값으로 'N'처리할때) + * XXX 삭제 처리(delete가 아닌 useYn컬럼을 상태값으로 'N'처리할때) */ @RequestMapping("/web/kccadr/xxx/deleteXxx2.do") - public String deleteXxx2(HttpServletRequest request, @ModelAttribute("searchVO") XxxVO xxxVO, - ModelMap model, RedirectAttributes redirectAttributes)throws Exception { + public String deleteXxx2( HttpServletRequest request, @ModelAttribute("searchVO") XxxVO xxxVO, + ModelMap model, RedirectAttributes redirectAttributes ) throws Exception { LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); xxxVO.setLastUpdusrId(user.getUniqId()); - xxxVO.setLastUpdusrNm(user.getName()); // 변경이력에 사용 + xxxVO.setLastUpdusrNm(user.getName()); // 변경이력에 사용 xxxService.deleteXxx2(xxxVO); xxxVO.setPageIndex(1); //삭제후 첫페이지로 로딩 - + redirectAttributes.addAttribute("pageIndex", xxxVO.getPageIndex()); redirectAttributes.addAttribute("searchCnd", xxxVO.getSearchCnd()); redirectAttributes.addAttribute("searchWrd", xxxVO.getSearchWrd()); @@ -271,15 +280,13 @@ public class XxxWebController { redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.useN")); return "redirect:/web/kccadr/xxx/xxxList.do"; } - - - + /** * XXX 팝업화면 */ @RequestMapping("/web/kccadr/xxx/xxxDetailPop.do") - public String xxxDetailPop(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception { + public String xxxDetailPop( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception { XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회 model.addAttribute("result", result); @@ -291,19 +298,19 @@ public class XxxWebController { * XXX YYYY(처리) Ajax 처리 */ @RequestMapping("/web/kccadr/xxx/xxxYyyyAjax.do") - public ModelAndView xxxYyyyAjax(@ModelAttribute("xxxVO") XxxVO xxxVO, BindingResult bindingResult) throws Exception { - + public ModelAndView xxxYyyyAjax( @ModelAttribute("xxxVO") XxxVO xxxVO, BindingResult bindingResult ) throws Exception { + String result = "success"; ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("jsonView"); - + // YYYY 처리 로직 - + // YYYY 처리 상태 체크 - if (1 == 0) { + if(1 == 0) { result = "fail"; } - + modelAndView.addObject("result", result); return modelAndView; } diff --git a/src/main/java/kcc/let/cop/bbs/web/EgovBBSManageController.java b/src/main/java/kcc/let/cop/bbs/web/EgovBBSManageController.java index cd02e070..b66af410 100644 --- a/src/main/java/kcc/let/cop/bbs/web/EgovBBSManageController.java +++ b/src/main/java/kcc/let/cop/bbs/web/EgovBBSManageController.java @@ -1,30 +1,31 @@ package kcc.let.cop.bbs.web; -import java.io.OutputStream; -import java.security.SecureRandom; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - +import NiceID.Check.CPClient; +import com.penta.scpdb.ScpDbAgent; +import egovframework.rte.fdl.property.EgovPropertyService; +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import egovframework.rte.psl.dataaccess.util.EgovMap; +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import kcc.com.cmm.*; +import kcc.com.cmm.service.*; +import kcc.com.cmm.util.StringUtil; +import kcc.com.cmm.util.WebUtil; +import kcc.com.uss.ion.cnf.service.ProhibitMngService; +import kcc.com.uss.ion.cnf.service.WordFilterService; +import kcc.com.uss.ion.cnf.service.WordFilterVO; +import kcc.com.utl.fcc.service.EgovStringUtil; import kcc.com.utl.user.service.CheckLoginUtil; +import kcc.let.cop.bbs.service.*; +import kcc.let.sym.mnu.mpm.service.EgovMenuManageService; +import kcc.let.sym.mnu.mpm.service.MenuManageVO; +import kcc.let.sym.site.service.EgovSiteManagerService; +import kcc.let.sym.site.service.SiteManagerVO; +import kcc.let.uat.uia.service.SsoLoginVO; +import kcc.let.utl.fcc.service.ITNotiUtil; +import kcc.let.utl.sim.service.EgovClntInfo; +import kcc.ve.cmm.VeConstants; import org.apache.commons.lang3.ArrayUtils; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Font; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -47,47 +48,15 @@ import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springmodules.validation.commons.DefaultBeanValidator; -import com.penta.scpdb.ScpDbAgent; -import com.sci.v2.pcc.secu.SciSecuManager; -import com.sci.v2.pcc.secu.hmac.SciHmac; - -import NiceID.Check.CPClient; -import egovframework.rte.fdl.property.EgovPropertyService; -import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; -import egovframework.rte.psl.dataaccess.util.EgovMap; -import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; -import kcc.com.cmm.ComDefaultCodeVO; -import kcc.com.cmm.EgovMessageSource; -import kcc.com.cmm.EgovMultiPartEmail; -import kcc.com.cmm.LoginVO; -import kcc.com.cmm.ReadVO; -import kcc.com.cmm.UserVO; -import kcc.com.cmm.service.EgovCmmUseService; -import kcc.com.cmm.service.EgovFileMngService; -import kcc.com.cmm.service.EgovFileMngUtil; -import kcc.com.cmm.service.FileVO; -import kcc.com.cmm.service.ReadService; -import kcc.com.cmm.util.StringUtil; -import kcc.com.cmm.util.WebUtil; -import kcc.com.uss.ion.cnf.service.ProhibitMngService; -import kcc.com.uss.ion.cnf.service.WordFilterService; -import kcc.com.uss.ion.cnf.service.WordFilterVO; -import kcc.com.utl.fcc.service.EgovStringUtil; -import kcc.let.cop.bbs.service.Board; -import kcc.let.cop.bbs.service.BoardChgHst; -import kcc.let.cop.bbs.service.BoardMaster; -import kcc.let.cop.bbs.service.BoardMasterVO; -import kcc.let.cop.bbs.service.BoardVO; -import kcc.let.cop.bbs.service.EgovBBSAttributeManageService; -import kcc.let.cop.bbs.service.EgovBBSManageService; -import kcc.let.sym.mnu.mpm.service.EgovMenuManageService; -import kcc.let.sym.mnu.mpm.service.MenuManageVO; -import kcc.let.sym.site.service.EgovSiteManagerService; -import kcc.let.sym.site.service.SiteManagerVO; -import kcc.let.uat.uia.service.SsoLoginVO; -import kcc.let.utl.fcc.service.ITNotiUtil; -import kcc.let.utl.sim.service.EgovClntInfo; -import kcc.ve.cmm.VeConstants; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.OutputStream; +import java.security.SecureRandom; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; /** * 게시물 관리를 위한 컨트롤러 클래스 @@ -2341,21 +2310,21 @@ public class EgovBBSManageController { request.getSession().setAttribute("reqNum", reqNum); // 결과값 복호화시 필요 - //01. 암호화 모듈 선언 - SciSecuManager seed = new SciSecuManager(); - - //02. 1차 암호화 - String encStr = ""; - String reqInfo = SELFAUTH_SITE_ID+"^"+SELFAUTH_SRV_NO+"^"+reqNum+"^"+certDate+"^"+certGb+"^"+addVar+"^"+exVar; // 데이터 암호화 - encStr = seed.getEncPublic(reqInfo); - - //03. 위변조 검증 값 생성 - String hmacMsg = SciHmac.HMacEncriptPublic(encStr); - - //03. 2차 암호화 - reqInfo = seed.getEncPublic(encStr + "^" + hmacMsg + "^" + "0000000000000000"); //2차암호화 - - request.getSession().setAttribute("reqInfo", reqInfo); // 본인확인 요청 정보 +// //01. 암호화 모듈 선언 +// SciSecuManager seed = new SciSecuManager(); +// +// //02. 1차 암호화 +// String encStr = ""; +// String reqInfo = SELFAUTH_SITE_ID+"^"+SELFAUTH_SRV_NO+"^"+reqNum+"^"+certDate+"^"+certGb+"^"+addVar+"^"+exVar; // 데이터 암호화 +// encStr = seed.getEncPublic(reqInfo); +// +// //03. 위변조 검증 값 생성 +// String hmacMsg = SciHmac.HMacEncriptPublic(encStr); +// +// //03. 2차 암호화 +// reqInfo = seed.getEncPublic(encStr + "^" + hmacMsg + "^" + "0000000000000000"); //2차암호화 +// +// request.getSession().setAttribute("reqInfo", reqInfo); // 본인확인 요청 정보 request.getSession().setAttribute("SITE_URL", SITE_URL); // 사이트 URL return "web/cop/selfauth/selfauth"; @@ -2371,41 +2340,41 @@ public class EgovBBSManageController { @RequestMapping("/web/cop/selfauth/resultSeed.do") public String resultSeed(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception { - String retInfo = request.getParameter("retInfo").trim(); - String cookiereqNum = (String)request.getSession().getAttribute("reqNum"); - - //복화화용 변수 - String encPara = ""; - String encMsg = ""; - String msgChk = "N"; - - // 1. 암호화 모듈 (jar) Loading - SciSecuManager sciSecuMg = new SciSecuManager(); - //쿠키에서 생성한 값을 Key로 생성 한다. - retInfo = sciSecuMg.getDec(retInfo, cookiereqNum); - - // 2.1차 파싱--------------------------------------------------------------- - String[] aRetInfo1 = retInfo.split("\\^"); - - encPara = aRetInfo1[0]; //암호화된 통합 파라미터 - encMsg = aRetInfo1[1]; //암호화된 통합 파라미터의 Hash값 - - String encMsg2 = sciSecuMg.getMsg(encPara); - // 3.위/변조 검증 --------------------------------------------------------------- - if(encMsg2.equals(encMsg)) msgChk="Y"; - - if(msgChk.equals("N")) { - // 비정상 접근 처리 - } - - retInfo = sciSecuMg.getDec(encPara, cookiereqNum); - - String[] aRetInfo = retInfo.split("\\^"); - String name = aRetInfo[0]; //성명 +// String retInfo = request.getParameter("retInfo").trim(); +// String cookiereqNum = (String)request.getSession().getAttribute("reqNum"); +// +// //복화화용 변수 +// String encPara = ""; +// String encMsg = ""; +// String msgChk = "N"; +// +// // 1. 암호화 모듈 (jar) Loading +// SciSecuManager sciSecuMg = new SciSecuManager(); +// //쿠키에서 생성한 값을 Key로 생성 한다. +// retInfo = sciSecuMg.getDec(retInfo, cookiereqNum); +// +// // 2.1차 파싱--------------------------------------------------------------- +// String[] aRetInfo1 = retInfo.split("\\^"); +// +// encPara = aRetInfo1[0]; //암호화된 통합 파라미터 +// encMsg = aRetInfo1[1]; //암호화된 통합 파라미터의 Hash값 +// +// String encMsg2 = sciSecuMg.getMsg(encPara); +// // 3.위/변조 검증 --------------------------------------------------------------- +// if(encMsg2.equals(encMsg)) msgChk="Y"; +// +// if(msgChk.equals("N")) { +// // 비정상 접근 처리 +// } +// +// retInfo = sciSecuMg.getDec(encPara, cookiereqNum); +// +// String[] aRetInfo = retInfo.split("\\^"); +// String name = aRetInfo[0]; //성명 // String birYMD = aRetInfo[1]; //생년월일 // String sex = aRetInfo[2]; //성별 // String fgnGbn = aRetInfo[3]; //내외국인 구분값 - String di = aRetInfo[4]; //DI +// String di = aRetInfo[4]; //DI // String ci1 = aRetInfo[5]; //CI // String ci2 = aRetInfo[6]; //CI // String civersion = aRetInfo[7]; //CI Version @@ -2419,8 +2388,8 @@ public class EgovBBSManageController { // 사용자 세션생성 UserVO userVO = new UserVO(); - userVO.setName(name); - userVO.setMblDn(di); +// userVO.setName(name); +// userVO.setMblDn(di); request.getSession().setAttribute("userVO", userVO); String url = (String)request.getSession().getAttribute("url"); diff --git a/src/main/java/kcc/let/uat/uia/service/impl/EgovLoginServiceImpl.java b/src/main/java/kcc/let/uat/uia/service/impl/EgovLoginServiceImpl.java index e3c32c27..eae078f1 100644 --- a/src/main/java/kcc/let/uat/uia/service/impl/EgovLoginServiceImpl.java +++ b/src/main/java/kcc/let/uat/uia/service/impl/EgovLoginServiceImpl.java @@ -66,9 +66,6 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements LoginVO loginVO = null; String s_password = vo.getPassword(); String s_ci = vo.getMberCi(); - System.out.println("======1========================"+s_password); - System.out.println("======1========================"+EgovNewPasswordUtil.hashPassword(s_password)); - System.out.println("======1========================"+EgovFileScrty.encryptPassword(s_password, vo.getId())); //step1.new 로그인인 경우 loginvo ret //최고관리자를 제외한 사용자 sso 로그인으로 비밀번호 암호화 삭제(210818, 이준호) diff --git a/src/main/java/kcc/let/uat/uia/web/EgovLoginController.java b/src/main/java/kcc/let/uat/uia/web/EgovLoginController.java index 634cf6a7..0e103638 100644 --- a/src/main/java/kcc/let/uat/uia/web/EgovLoginController.java +++ b/src/main/java/kcc/let/uat/uia/web/EgovLoginController.java @@ -5,18 +5,19 @@ import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URLEncoder; import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import javax.annotation.Resource; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; import javax.script.ScriptEngineManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import kcc.ve.cmm.crt.CertPhoneResultUtill; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; @@ -25,6 +26,8 @@ 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.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -189,6 +192,9 @@ public class EgovLoginController { /** 구동 환경 */ @Value("#{property['Globals.prod.islocal']}") private String environment; + + @Resource(name = "certPhoneResultUtill") + private CertPhoneResultUtill certPhoneResultUtill; /* *//** @@ -725,28 +731,55 @@ public class EgovLoginController { //일반 로그인이 아니므로 1로 세팅 loginVO.setPassword("1"); - - // 로그인 정보 check -// if (loginVO.getId() == null || loginVO.getPassword() == null) { -// SsoLoginVO SsoLoginSessionChk = (SsoLoginVO) session.getAttribute("SSOLoginVO"); -// // SSOLoginVO 세션 체크 -// if (SsoLoginSessionChk != null) { -// -// loginVO.setId(SsoLoginSessionChk.getMembId()); -// loginVO.setPassword("1"); -// } else { -// model.addAttribute("message", "로그인을 다시 해주세요."); -// // 로그인 페이지로 이동 -// /*return "/web/kccadr/login/SsoLoginUsr";*/ -// return "redirect:/web/user/login/ssoLogin.do"; -// } -// } - if(StringUtil.isEmpty(loginVO.getMberCi())) { + + String retInfo = request.getParameter("retInfo"); + + if(StringUtil.isEmpty(retInfo)) { model.addAttribute("message", "로그인을 다시 해주세요."); + redirectAttributes.addAttribute("message", "로그인을 다시 해주세요."); // 로그인 페이지로 이동 return "redirect:/web/user/login/ssoLogin.do"; } + // AES 복호화 설정 (AES/CBC/PKCS5Padding) + String reqkey = request.getSession().getAttribute("reqkey").toString(); + String reqiv = request.getSession().getAttribute("reqiv").toString(); + + SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8"))); + + // Base64 디코딩 후 복호화 수행 + byte[] cipherEnc = Base64.getDecoder().decode(retInfo); + + String resData = new String(cipher.doFinal(cipherEnc), "UTF-8"); + + // 복호화된 결과를 다시 JSON으로 파싱 + JSONParser parser2 = new JSONParser(); + JSONObject jsonData = (JSONObject) parser2.parse(resData); + if(jsonData != null) { + System.out.println("===== 복호화된 결과 ====="); + + for(Object keyObj : jsonData.keySet()) { + String key2 = (String) keyObj; + Object value = jsonData.get(key2); + System.out.println(key2 + " = " + value); + } + + } else { + System.out.println("복호화 실패: jsonData가 null 입니다."); + model.addAttribute("message", "로그인을 다시 해주세요."); + redirectAttributes.addAttribute("message", "로그인을 다시 해주세요."); + // 로그인 페이지로 이동 + return "redirect:/web/user/login/ssoLogin.do"; + } + + loginVO.setMembName(jsonData.get("userName").toString()); + loginVO.setMembCelnum(jsonData.get("celNo").toString()); + loginVO.setSexCode(jsonData.get("gender").toString()); + loginVO.setMembBirth(jsonData.get("birYMD").toString()); + loginVO.setMberCi(jsonData.get("ci").toString()); + // 기존에 있던 회원이 아니면 DB에 일련번호 저장 UserManageVO userManageVO = new UserManageVO(); userManageVO.setMberCi(loginVO.getMberCi()); diff --git a/src/main/java/kcc/ve/cmm/crt/CertPhoneRequestUtill.java b/src/main/java/kcc/ve/cmm/crt/CertPhoneRequestUtill.java new file mode 100644 index 00000000..e6d6b269 --- /dev/null +++ b/src/main/java/kcc/ve/cmm/crt/CertPhoneRequestUtill.java @@ -0,0 +1,102 @@ +package kcc.ve.cmm.crt; + +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.stereotype.Service; + +import javax.crypto.Cipher; +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.MessageDigest; +import java.util.Base64; + +@Service(value = "certPhoneRequestUtill") +public class CertPhoneRequestUtill { + + public String getEncReqData( String key, String iv, String reqData ) throws Exception { + String reqInfo = ""; + try { + SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes())); + byte[] encrypted; + encrypted = cipher.doFinal(reqData.trim().getBytes()); + reqInfo = Base64.getEncoder().encodeToString(encrypted); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) getEncReqData Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + return reqInfo; + } + + public String createSymmetricKey( String req_dtim, String req_no, String token_val ) throws Exception { + String symmetricKey = ""; + String value = req_dtim.trim() + req_no.trim() + token_val.trim(); + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-256"); + md.update(value.getBytes()); + byte[] arrHashValue = md.digest(); + symmetricKey = Base64.getEncoder().encodeToString(arrHashValue); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) createSymmetricKey Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + return symmetricKey; + } + + public byte[] hmac256( byte[] secretKey, byte[] message ) throws Exception { + byte[] hmac256 = null; + try { + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec sks = new SecretKeySpec(secretKey, "HmacSHA256"); + mac.init(sks); + hmac256 = mac.doFinal(message); + return hmac256; + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) hmac256 Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + } + + public String getReqData( String id, String srvNo, String reqNum, String retUrl, String certDate, String certGb ) { + + JSONObject msgMap = new JSONObject(); + msgMap.put("id", id); + msgMap.put("srvNo", srvNo); + msgMap.put("reqNum", reqNum); + msgMap.put("retUrl", retUrl); + msgMap.put("certDate", certDate); + msgMap.put("certGb", certGb); + String reqData = msgMap.toJSONString(); + return reqData; + + } + + //복호화 + public JSONObject getResData( String req_info, String key, String iv ) throws Exception { + SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES"); + Cipher c; + String resData = ""; + try { + c = Cipher.getInstance("AES/CBC/PKCS5Padding"); + c.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes())); + /*byte[] cipherEnc = Base64.getDecoder().decode(encData);*/ + byte[] cipherEnc = Base64.getDecoder().decode(req_info); + resData = new String(c.doFinal(cipherEnc), "utf-8"); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) getResData Exception : %s", e.getMessage())); + e.printStackTrace(); + return null; + } + JSONParser parser = new JSONParser(); + JSONObject jsonResData = (JSONObject) parser.parse(resData); + return jsonResData; + } + +} diff --git a/src/main/java/kcc/ve/cmm/crt/CertPhoneResultUtill.java b/src/main/java/kcc/ve/cmm/crt/CertPhoneResultUtill.java new file mode 100644 index 00000000..05f55586 --- /dev/null +++ b/src/main/java/kcc/ve/cmm/crt/CertPhoneResultUtill.java @@ -0,0 +1,355 @@ +package kcc.ve.cmm.crt; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.crypto.Cipher; +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; +import java.security.SecureRandom; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Service(value = "certPhoneResultUtill") +public class CertPhoneResultUtill { + public String createCryptoTokenUrl = "https://sciapi.siren24.com:52099/authentication/api/v1.0/common/crypto/token"; + public String access_token = "994b5d96-3788-4239-a5b0-a0ba2e0cf089 "; + public String client_id = "5a2a72e2-16ce-420c-8816-57b3dda0e231"; + + public CertPhoneResultUtill() throws Exception { + } + + + public String certResult( HttpServletRequest request ) throws Exception { + String reqcryptotokenid = request.getParameter("crypto_token_id"); + String integrity_value = request.getParameter("integrity_value"); + System.out.println("crypto_token_id -> " + reqcryptotokenid); + System.out.println("integrity_value -> " + integrity_value); + + String id = "SKIP001"; + String url = "https://pcc.siren24.com/servlet/StoS"; + +// String reqInfo = certPhoneResultUtill.getReqData(id, crypto_token_id); +// +// String key = request.getSession().getAttribute("certPhoneKey").toString(); +// String iv = request.getSession().getAttribute("certPhoneIv").toString(); +// reqInfo = certPhoneResultUtill.getEncReqData(key, iv, reqInfo); + + //암호화키 얻기 + Date currentDate = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String reqDate = sdf.format(currentDate); + String reqNo = "koipa_edu"; + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); + + String cryptoToken = callCreateCryptoTokenAPI(currentDate, reqNo); + + JSONParser parser = new JSONParser(); + JSONObject cryptoTokenJson = (JSONObject) parser.parse(cryptoToken); + JSONObject dataBody = (JSONObject) cryptoTokenJson.get("dataBody"); + + String crypto_token_id = (String) dataBody.get("crypto_token_id"); + String token_val = (String) dataBody.get("crypto_token"); + String reqInfo = getReqData(id, reqcryptotokenid); + + + String day = formatter.format(currentDate); + + String symmetricKey = createSymmetricKey(day, reqNo, token_val); + String key = symmetricKey.substring(0, 16); // 데이터 암호화할 대칭키 + String iv = symmetricKey.substring(symmetricKey.length() - 16, symmetricKey.length());// 데이터 암호화할 lnitail Vector + + reqInfo = getEncReqData(key, iv, reqInfo); + + //복호화 + try { + RestTemplate restTemplate = new RestTemplate(); + + // 1. Header 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + // 2. Body 생성 + Map dataHeader = new HashMap<>(); + dataHeader.put("CNTY_CD", "kr"); + dataHeader.put("TRAN_ID", id); + + Map dataBody2 = new HashMap<>(); + dataBody2.put("crypto_token_id", crypto_token_id); + dataBody2.put("reqInfo", reqInfo); + dataBody2.put("integrity_value", integrity_value); + + Map requestJson = new HashMap<>(); + requestJson.put("dataHeader", dataHeader); + requestJson.put("dataBody", dataBody2); + + HttpEntity> entity = new HttpEntity<>(requestJson, headers); + + // 3. POST 요청 호출 + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + String.class + ); + + System.out.println("Response: " + response.getBody()); + + ObjectMapper mapper = new ObjectMapper(); + + Map json = mapper.readValue(response.getBody(), Map.class); + Map resDataBody = (Map) json.get("dataBody"); + + String retInfo = (String) resDataBody.get("RET_INFO"); + + // AES 복호화 설정 (AES/CBC/PKCS5Padding) + String reqkey = request.getSession().getAttribute("reqkey").toString(); + String reqiv = request.getSession().getAttribute("reqiv").toString(); + + SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8"))); + + // Base64 디코딩 후 복호화 수행 + byte[] cipherEnc = Base64.getDecoder().decode(retInfo); + + + String resData = new String(cipher.doFinal(cipherEnc), "UTF-8"); + + + + + /* + ===== 복호화된 결과 ===== + Commid = KTM + reqNum = koipa_edu + gender = M + di = MC0GCCqGSIb3DQIJAyEAu7FiVqtM/qf7o/KlCxGNQtWWSEoxUzcLWNtM3gXU/hA= + ci = BWqlL7enYj5t2aDsrbvX97vk5wW2+MD08M6e7NtHI9GVeWfWioe8L2m7mheHWKht4uxDUC3k8xG81YgRnUP2lw== + celNo = 01030266269 + fgnGbn = 1 + certGb = H + userName = 이준호 + ci2 = 00 + result = Y + addVar = + certdate = 20251118123928 + birYMD = 19890202 + ciVersion = 1 + utf8Name = %EC%9D%B4%EC%A4%80%ED%98%B8 + id = SKIP001 + + + + ===== 복호화된 결과 ===== + Commid = LGT + reqNum = koipa_edu + gender = F + di = MC0GCCqGSIb3DQIJAyEAHq52+k0nurs/FS2kArC2+JTfs+3Xa8KPvSTY2WtgMDY= + ci = vDDZDokeyyUJ3i3jaktyXRVGib2XoZZUvp4Rb9tOOWg1sATqRChD4qRNSCaY78EKpsggJMZ/j6jwcLngkXxZtg== + celNo = 01057058729 + fgnGbn = 1 + certGb = H + userName = 정수빈 + ci2 = + result = Y + addVar = + certdate = 20251118125047 + birYMD = 19970829 + ciVersion = 1 + utf8Name = %EC%A0%95%EC%88%98%EB%B9%88 + id = SKIP001 + */ + return retInfo; + + } catch(Exception e) { + System.out.println(e.getMessage()); + return "fail"; + } + } + + + public String callCreateCryptoTokenAPI( Date currentDate, String req_no ) throws Exception { + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); + long current_timestamp = currentDate.getTime() / 1000; + String authorization = "bearer " + access_token; + + Map requestPropertyMap = new HashMap<>(); + requestPropertyMap.put("Content-Type", "application/json"); + requestPropertyMap.put("Authorization", authorization); + + HttpURLConnection connection = getURLConnection(createCryptoTokenUrl, "POST", requestPropertyMap, true, false); + JSONObject dataHeader = new JSONObject(); + dataHeader.put("lang_code", "kr"); + JSONObject dataBody = new JSONObject(); + dataBody.put("client_id", client_id); + dataBody.put("req_date", formatter.format(currentDate)); + dataBody.put("req_no", req_no); + dataBody.put("enc_mode", "1"); + JSONObject msgMap = new JSONObject(); + msgMap.put("dataHeader", dataHeader); + msgMap.put("dataBody", dataBody); + String msg = msgMap.toJSONString(); + if(send(connection.getOutputStream(), msg)) return ""; + String receiveMsg = receive(connection.getInputStream()); + + return receiveMsg; + } + + public String getEncReqData( String key, String iv, String reqData ) throws Exception { + String req_info = ""; + try { + SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes())); + byte[] encrypted; + encrypted = cipher.doFinal(reqData.trim().getBytes()); + req_info = Base64.getEncoder().encodeToString(encrypted); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) getEncReqData Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + return req_info; + } + + public byte[] hmac256( byte[] secretKey, byte[] message ) throws Exception { + byte[] hmac256 = null; + try { + Mac mac = Mac.getInstance("HmacSHA256"); + SecretKeySpec sks = new SecretKeySpec(secretKey, "HmacSHA256"); + mac.init(sks); + hmac256 = mac.doFinal(message); + return hmac256; + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) hmac256 Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + } + + public String createSymmetricKey( String req_dtim, String req_no, String token_val ) throws Exception { + String symmetricKey = ""; + String value = req_dtim.trim() + req_no.trim() + token_val.trim(); + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-256"); + md.update(value.getBytes()); + byte[] arrHashValue = md.digest(); + symmetricKey = Base64.getEncoder().encodeToString(arrHashValue); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) createSymmetricKey Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } + return symmetricKey; + } + + + public Boolean send( OutputStream outputStream, String sendMsg ) throws Exception { + Boolean isFail = true; + BufferedWriter bufferedWriter = null; + try { + bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); + bufferedWriter.write(sendMsg); + bufferedWriter.flush(); + isFail = false; + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) send Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } finally { + if(bufferedWriter != null) { + bufferedWriter.close(); + } + } + return isFail; + } + + private static HttpsURLConnection openHttps12( String urlStr ) throws Exception { + URL url = new URL(urlStr); + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + + SSLContext ctx = SSLContext.getInstance("TLSv1.2"); + ctx.init(null, null, new SecureRandom()); + conn.setSSLSocketFactory(ctx.getSocketFactory()); + + + return conn; + } + + + public String receive( InputStream inputStream ) throws Exception { + String receiveMsg = ""; + BufferedReader bufferedReader = null; + try { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); + StringBuilder stringBuilder = new StringBuilder(); + String inputLine; + while((inputLine = bufferedReader.readLine()) != null) { + stringBuilder.append(inputLine); + } + receiveMsg = stringBuilder.toString(); + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) receive Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } finally { + if(bufferedReader != null) { + bufferedReader.close(); + } + } + return receiveMsg; + } + + public HttpURLConnection getURLConnection( String urlStr, String method, Map requestPropertyMap, Boolean isNeedOutput, Boolean isHttps ) throws Exception { + try { + URL url = new URL(urlStr); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(method); + + connection.setDoInput(true); + if(isNeedOutput) connection.setDoOutput(true); + for(String key : requestPropertyMap.keySet()) { + connection.setRequestProperty(key, requestPropertyMap.get(key)); + } + return connection; + } catch(Exception e) { + System.out.println(String.format("(APICERT)(ERR) getURLConnection Exception : %s", e.getMessage())); + e.printStackTrace(); + throw e; + } finally { + } + } + + public String getReqData( String id, String reqcryptotokenid ) { + + + JSONObject msgMap = new JSONObject(); + msgMap.put("id", id); + msgMap.put("reqcryptotokenid", reqcryptotokenid); + + + String reqData = msgMap.toJSONString(); + + return reqData; + } + +} diff --git a/src/main/java/kcc/ve/cmm/crt/CertPhoneWebController.java b/src/main/java/kcc/ve/cmm/crt/CertPhoneWebController.java new file mode 100644 index 00000000..ef3cb03e --- /dev/null +++ b/src/main/java/kcc/ve/cmm/crt/CertPhoneWebController.java @@ -0,0 +1,188 @@ +package kcc.ve.cmm.crt; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import kcc.com.utl.user.service.CheckLoginUtil; +import org.springframework.http.*; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Controller +public class CertPhoneWebController { + + // 첨부파일 정보 + @Resource(name = "certPhoneRequestUtill") + private CertPhoneRequestUtill certPhoneRequestUtill; + + // 첨부파일 정보 + @Resource(name = "certPhoneResultUtill") + private CertPhoneResultUtill certPhoneResultUtill; + + //로그인 체크 util + @Resource(name = "checkLoginUtil") + private CheckLoginUtil checkLoginUtil; + + /** + * 본인인증 + */ + @RequestMapping("/web/cmm/crt/certPhoneRequestAjax.do") + public ModelAndView certPhoneRequestAjax( HttpServletRequest request ) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + String result = "fail"; + + try { + String url = "https://sciapi.siren24.com:52099/authentication/api/v1.0/common/crypto/token"; + + Date currentDate = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String reqDate = sdf.format(currentDate); + String reqNo = "koipa_edu"; + String id = "SKIP001"; + String clientId = "5a2a72e2-16ce-420c-8816-57b3dda0e231"; + String srvNo = "001003"; + String retUrl = "https://dev-ipedu-cert.iten.co.kr/ipedu/web/cmm/crt/certPhoneReturn.do"; +// String retUrl = "https://dev-ipedu-cert.iten.co.kr/ipedu/web/user/login/actionSecurityLogin.do"; + + String accessToken = "994b5d96-3788-4239-a5b0-a0ba2e0cf089"; + + RestTemplate restTemplate = new RestTemplate(); + + // 1. Header 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("Authorization", "bearer " + accessToken); + + // 2. Body 생성 + Map dataHeader = new HashMap<>(); + dataHeader.put("lang_code", "kr"); + + Map dataBody = new HashMap<>(); + dataBody.put("client_id", clientId); + dataBody.put("req_date", reqDate); + dataBody.put("req_no", reqNo); + dataBody.put("enc_mode", "1"); + + Map requestJson = new HashMap<>(); + requestJson.put("dataHeader", dataHeader); + requestJson.put("dataBody", dataBody); + + HttpEntity> entity = new HttpEntity<>(requestJson, headers); + + // 3. POST 요청 호출 + ResponseEntity response = restTemplate.exchange( + url, + HttpMethod.POST, + entity, + String.class + ); + + System.out.println("Response: " + response.getBody()); + + ObjectMapper mapper = new ObjectMapper(); + + Map json = mapper.readValue(response.getBody(), Map.class); + Map resDataBody = (Map) json.get("dataBody"); + + String cryptoTokenId = (String) resDataBody.get("crypto_token_id"); + String cryptoToken = (String) resDataBody.get("crypto_token"); + + String reqInfo = certPhoneRequestUtill.getReqData(id + , srvNo + , reqNo + , "72" + retUrl + , reqDate + , "H"); //4번시트 5 본인확인 서비스 요청데이터 암호화 항목참조 + + String symmetricKey = certPhoneRequestUtill.createSymmetricKey(reqDate, reqNo, cryptoToken); + + String key = symmetricKey.substring(0, 16); + String iv = symmetricKey.substring(symmetricKey.length() - 16, symmetricKey.length()); + + request.getSession().setAttribute("reqkey", key); + request.getSession().setAttribute("reqiv", iv); + + reqInfo = certPhoneRequestUtill.getEncReqData(key, iv, reqInfo); + + String hmacKey = symmetricKey.substring(0, 32); + byte[] hmacSha256 = certPhoneRequestUtill.hmac256(hmacKey.getBytes(), reqInfo.getBytes()); + String integrityValue = Base64.getEncoder().encodeToString(hmacSha256); + String baseEncStr = Base64.getEncoder().encodeToString(hmacSha256); + + modelAndView.addObject("reqInfo", reqInfo); + modelAndView.addObject("cryptoTokenId", cryptoTokenId); + modelAndView.addObject("integrityValue", integrityValue); + modelAndView.addObject("verSion", "3"); + result = "success"; + + } catch(Exception ex) { + System.out.println(ex.getMessage()); + } + + modelAndView.addObject("result", result); + return modelAndView; + } + + @RequestMapping("/web/cmm/crt/certPhoneReturn.do") + public String certPhoneReturn( HttpServletRequest request, ModelMap model ) throws Exception { + + String retInfo = certPhoneResultUtill.certResult(request); + + model.addAttribute("retInfo", retInfo); + return "web/kccadr/login/CertPhoneResultPop"; + } + + + @RequestMapping("/web/cmm/crt/certPhoneRequestAjax_dev.do") + public ModelAndView certPhoneRequestAjax_dev( HttpServletRequest request ) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + // 1. 클라이언트에서 넘어온 평문 JSON 문자열 + String retInfo = request.getParameter("retInfo"); + System.out.println("plain retInfo -> " + retInfo); + + // 2. 세션에서 키/IV 가져오기 + String reqkey = request.getSession().getAttribute("reqkey").toString(); + String reqiv = request.getSession().getAttribute("reqiv").toString(); + + // 3. AES 암호화 설정 + SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8"))); + + // 4. 평문 JSON 문자열을 바이트로 변환 후 암호화 + byte[] plainBytes = retInfo.getBytes("UTF-8"); + byte[] cipherBytes = cipher.doFinal(plainBytes); + + // 5. 암호문을 Base64 인코딩해서 최종 문자열로 변환 + String encRetInfo = Base64.getEncoder().encodeToString(cipherBytes); + + System.out.println("encrypted retInfo(Base64) -> " + encRetInfo); + + // 필요하다면 응답에 포함 + modelAndView.addObject("result", "success"); + modelAndView.addObject("encRetInfo", encRetInfo); + + return modelAndView; + } + + +} diff --git a/src/main/java/kcc/ve/cmm/sendAt/PpurioGlobalSet.java b/src/main/java/kcc/ve/cmm/sendAt/PpurioGlobalSet.java new file mode 100644 index 00000000..8042fb5b --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/PpurioGlobalSet.java @@ -0,0 +1,121 @@ +package kcc.ve.cmm.sendAt; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class PpurioGlobalSet { + + private static String id; + private static String pw; + private static String host; + private static String senderKey; + private static String templateCode1; + private static String templateCode2; + private static String templateCode3; + private static String templateCode4; + private static String templateCode5; + private static String templateCode6; + + private static String from; + + @Value("#{globalSettings['ppurio.id']}") + public void setId(String id) { + PpurioGlobalSet.id = id; + } + + public static String getId() { + return id; + } + + @Value("#{globalSettings['ppurio.pw']}") + public void setPw(String pw) { + PpurioGlobalSet.pw = pw; + } + + public static String getPw() { + return pw; + } + + @Value("#{globalSettings['ppurio.host']}") + public void setHost(String host) { + PpurioGlobalSet.host = host; + } + + public static String getHost() { + return host; + } + + @Value("#{globalSettings['ppurio.senderKey']}") + public void setSenderKey(String senderKey) { + PpurioGlobalSet.senderKey = senderKey; + } + + public static String getSenderKey() { + return senderKey; + } + + @Value("#{globalSettings['ppurio.templateCode1']}") + public void setTemplateCode1(String templateCode1) { + PpurioGlobalSet.templateCode1 = templateCode1; + } + + public static String getTemplateCode1() { + return templateCode1; + } + + @Value("#{globalSettings['ppurio.templateCode2']}") + public void setTemplateCode2(String templateCode2) { + PpurioGlobalSet.templateCode2 = templateCode2; + } + + public static String getTemplateCode2() { + return templateCode2; + } + + @Value("#{globalSettings['ppurio.templateCode3']}") + public void setTemplateCode3(String templateCode3) { + PpurioGlobalSet.templateCode3 = templateCode3; + } + + public static String getTemplateCode3() { + return templateCode3; + } + + @Value("#{globalSettings['ppurio.templateCode4']}") + public void setTemplateCode4(String templateCode4) { + PpurioGlobalSet.templateCode4 = templateCode4; + } + + public static String getTemplateCode4() { + return templateCode4; + } + + @Value("#{globalSettings['ppurio.templateCode5']}") + public void setTemplateCode5(String templateCode5) { + PpurioGlobalSet.templateCode5 = templateCode5; + } + + public static String getTemplateCode5() { + return templateCode5; + } + + @Value("#{globalSettings['ppurio.templateCode6']}") + public void setTemplateCode6(String templateCode6) { + PpurioGlobalSet.templateCode6 = templateCode6; + } + + public static String getTemplateCode6() { + return templateCode6; + } + + @Value("#{globalSettings['ppurio.from']}") + public void setFrom(String from) { + PpurioGlobalSet.from = from; + } + + public static String getFrom() { + return from; + } + +} diff --git a/src/main/java/kcc/ve/cmm/sendAt/SendAtVO.java b/src/main/java/kcc/ve/cmm/sendAt/SendAtVO.java new file mode 100644 index 00000000..17d17e8c --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/SendAtVO.java @@ -0,0 +1,89 @@ +package kcc.ve.cmm.sendAt; + +import java.io.Serializable; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** +* @packageName : kcc.com.snd.service +* @templatecode +* @신청인_접수확인_1 : +* TEMPLATE_APP_JUBSU +* @chihwan : 없음 +* @신청인_담당자배정_1 : +* TEMPLATE_APP_BAEJUNG +* @chihwan : "caseNo", "team", "examiner", "tel", "email" +* @양당사자_분쟁조정협의회 안건상정 : +* TEMPLATE_BOTH_SANGJUNG +* @chihwan : "caseNo", "cfrnc", "tel", "email" +* @양당사자_출석요구 n차 : +* TEMPLATE_BOTH_CHULSUK +* @chihwan : "caseNo", "nCha" +* @양당사자_통지 : +* TEMPLATE_BOTH_TONGJI +* @chihwan : "caseNo", "cfrnc" +* @신청인_보완요구 n차 : +* TEMPLATE_APP_BOWAN +* @chihwan : "caseNo", "nCha" +* +*/ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SendAtVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonIgnore + private String accesstoken; + private String type; + @JsonIgnore + private String expired; + + + private String account; + private String refkey; + private String from; + private String to; + private Content content; + + @JsonIgnore + private Map chihwan; + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class Content { + private At at; + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class At { + private String senderkey; + private String templatecode; + private String message; + + } + } + + public String toJson() throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(this); + } +} \ No newline at end of file diff --git a/src/main/java/kcc/ve/cmm/sendAt/SendService.java b/src/main/java/kcc/ve/cmm/sendAt/SendService.java new file mode 100644 index 00000000..61dfa700 --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/SendService.java @@ -0,0 +1,52 @@ +package kcc.ve.cmm.sendAt; + +import egovframework.rte.psl.dataaccess.util.EgovMap; + +import java.util.List; +import java.util.Map; + +public interface SendService { + + /** + * @methodName : sendAt + * @author : JunHo Lee + * @date : 2024.12.09 + * @description : + * @param to + * @param templateCode + * @param chihwan + * + * @packageName : kcc.com.snd.service + * @templatecode + * @신청인_접수확인_1 : + * TEMPLATE_APP_JUBSU + * @chihwan : 없음 + * @신청인_담당자배정_2 : + * TEMPLATE_APP_BAEJUNG + * @chihwan : "respondent", "caseNo", "team", "examiner", "tel", "email" + * @양당사자_분쟁조정협의회 안건상정 : + * TEMPLATE_BOTH_SANGJUNG + * @chihwan : "caseNo", "cfrnc", "tel", "email" + * @양당사자_출석요구 n차 : + * TEMPLATE_BOTH_CHULSUK + * @chihwan : "caseNo", "nCha" + * @양당사자_통지 : + * TEMPLATE_BOTH_TONGJI + * @chihwan : "caseNo", "cfrnc" + * @신청인_보완요구 n차 : + * TEMPLATE_APP_BOWAN + * @chihwan : "caseNo", "nCha" + * + */ + void sendAt(String to, String templateCode, Map chihwan) throws Exception; + + Map sendSms(String to, String subject, String smsContent, String type) throws Exception; + + SendSmsVO selectSendSet() throws Exception; + + void updateSendSet(SendSmsVO sendSmsVO) throws Exception; + + EgovMap selectTEMPLATE_APP_BAEJUNG(EgovMap egovMap) throws Exception; + + List selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) throws Exception; +} \ No newline at end of file diff --git a/src/main/java/kcc/ve/cmm/sendAt/SendSmsVO.java b/src/main/java/kcc/ve/cmm/sendAt/SendSmsVO.java new file mode 100644 index 00000000..48927beb --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/SendSmsVO.java @@ -0,0 +1,24 @@ +package kcc.ve.cmm.sendAt; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +public class SendSmsVO extends SendAtVO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String subject; + private String smsContent; + + private String atYn; + private String smsYn; + private String emailYn; + +} \ No newline at end of file diff --git a/src/main/java/kcc/ve/cmm/sendAt/impl/SendDAO.java b/src/main/java/kcc/ve/cmm/sendAt/impl/SendDAO.java new file mode 100644 index 00000000..83927487 --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/impl/SendDAO.java @@ -0,0 +1,38 @@ +package kcc.ve.cmm.sendAt.impl; + +import egovframework.rte.psl.dataaccess.util.EgovMap; +import kcc.com.cmm.service.impl.EgovComAbstractDAO; +import kcc.ve.cmm.sendAt.SendAtVO; +import kcc.ve.cmm.sendAt.SendSmsVO; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +@Repository("sendDAO") +public class SendDAO extends EgovComAbstractDAO { + + public SendAtVO selectToken() throws Exception{ + return (SendAtVO) select("sendDAO.selectToken"); + } + + public void updateToken(SendAtVO SendAtVO) throws Exception{ + update("sendDAO.updateToken", SendAtVO); + } + + public SendSmsVO selectSendSet() throws Exception{ + return (SendSmsVO) select("sendDAO.selectSendSet"); + } + + public void updateSendSet(SendSmsVO sendSmsVO) throws Exception{ + update("sendDAO.updateSendSet", sendSmsVO); + } + + public EgovMap selectTEMPLATE_APP_BAEJUNG(EgovMap egovMap) { + return (EgovMap) select("sendDAO.selectTEMPLATE_APP_BAEJUNG", egovMap); + } + + public List selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) { + return (List) list("sendDAO.selectTEMPLATE_BOTH_CHULSUK", egovMap); + } +} diff --git a/src/main/java/kcc/ve/cmm/sendAt/impl/SendServiceImpl.java b/src/main/java/kcc/ve/cmm/sendAt/impl/SendServiceImpl.java new file mode 100644 index 00000000..a10e769a --- /dev/null +++ b/src/main/java/kcc/ve/cmm/sendAt/impl/SendServiceImpl.java @@ -0,0 +1,548 @@ +package kcc.ve.cmm.sendAt.impl; + + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import egovframework.rte.psl.dataaccess.util.EgovMap; +import kcc.ve.cmm.sendAt.SendAtVO.Content; +import kcc.ve.cmm.sendAt.SendAtVO.Content.At; +import kcc.ve.cmm.sendAt.PpurioGlobalSet; +import kcc.ve.cmm.sendAt.SendAtVO; +import kcc.ve.cmm.sendAt.SendService; +import kcc.ve.cmm.sendAt.SendSmsVO; +import org.apache.commons.beanutils.BeanUtils; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service("SendService") +public class SendServiceImpl extends EgovAbstractServiceImpl implements SendService { + + @Resource(name="sendDAO") + private SendDAO sendDAO; + + @Override + public void sendAt( + String to + , String templateCode + , Map chihwan + ) throws Exception{ + SendAtVO vo = new SendAtVO(); + vo = sendDAO.selectToken(); + + //이전 발급 토큰이 만료되었는지 시간비교 + if(timeDiffBefore(vo.getExpired())) { + //토큰 발급 + if(this.getPpurioToken(vo)) { + //토큰 갱신 + sendDAO.updateToken(vo); + }else { + System.out.println("토큰 갱신 실패"); + throw new Exception(); + } + } + + vo = vo.builder() + .accesstoken(vo.getAccesstoken()) + .expired(vo.getExpired()) + .refkey("test1234") + .type(vo.getType()) + .to(to) + .content(Content.builder() + .at(SendAtVO.Content.At.builder() + .templatecode(templateCode) + .build() + ) + .build() + ) + .chihwan(chihwan) + .build() + ; + + this.sendAt(vo); + + } + + @Override + public Map sendSms( + String to + , String subject + , String smsContent + , String type + ) throws Exception{ + Boolean success = true; + int successCnt = 0; + SendAtVO vo = new SendAtVO(); + vo = sendDAO.selectToken(); + + //이전 발급 토큰이 만료되었는지 시간비교 + if(timeDiffBefore(vo.getExpired())) { + //토큰 발급 + if(this.getPpurioToken(vo)) { + //토큰 갱신 + sendDAO.updateToken(vo); + }else { + System.out.println("토큰 갱신 실패"); + throw new Exception(); + } + } + SendSmsVO smsVO = new SendSmsVO(); + BeanUtils.copyProperties(smsVO, vo); + smsVO.setSubject(subject); + smsVO.setSmsContent(smsContent); + smsVO.setType(type); + + String[] phoneNums = to.split(","); + for(String phone : phoneNums) { + smsVO.setTo(phone); + boolean result = this.sendSmsPrcs(smsVO); + if(result) { + successCnt++; + }else { + success = false; + System.out.println("문자 발송 실패: " + phone); + } + } + + Map resultMap = new HashMap<>(); + resultMap.put("success" , success); + resultMap.put("successCnt" , successCnt); + return resultMap; + } + + @Override + public SendSmsVO selectSendSet() throws Exception{ + return sendDAO.selectSendSet(); + } + + @Override + public void updateSendSet(SendSmsVO sendSmsVO) throws Exception{ + sendDAO.updateSendSet(sendSmsVO); + } + + @Override + public EgovMap selectTEMPLATE_APP_BAEJUNG( EgovMap egovMap) throws Exception{ + return sendDAO.selectTEMPLATE_APP_BAEJUNG(egovMap); + } + + @Override + public List selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) throws Exception{ + return sendDAO.selectTEMPLATE_BOTH_CHULSUK(egovMap); + } + + /** + * @methodName : timeDiffBefore + * @author : JunHo Lee + * @date : 2024.12.09 + * @description : + * @param str + * @return : + * !str이 현재 시간보다 이전이면 true + * !str이 현재 시간보다 이후이면 false + */ + private Boolean timeDiffBefore(String str) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + Date diffDate = sdf.parse(str); + + Date currentDate = new Date(); + + if (diffDate.before(currentDate)) { + return true; + } else { + return false; + } + } catch (Exception e) { + return false; + } + } + + public static String sendAt(SendAtVO sendAtVO) { + + StringBuffer result = new StringBuffer(); + + String input = null; + + PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet(); + + try { + + /** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/ + if(!ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) { + TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } } }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + URL url = new URL(ppurioGlobalSet.getHost() + "/v3/message"); + + /** Connection 설정 **/ + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Accept-Charset", "UTF-8"); + connection.addRequestProperty("Authorization", "Bearer " + sendAtVO.getAccesstoken()); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setConnectTimeout(15000); + + + /** Request **/ + At at = sendAtVO.getContent().getAt(); + at = messageSet(at, sendAtVO.getChihwan()); + + sendAtVO = sendAtVO.builder() + .account(ppurioGlobalSet.getId()) + .refkey(sendAtVO.getRefkey()) + .type("at") + .from(ppurioGlobalSet.getFrom()) + .to(sendAtVO.getTo()) + .content(Content.builder() + .at(At.builder() + .senderkey(ppurioGlobalSet.getSenderKey()) + .templatecode(at.getTemplatecode()) + .message(at.getMessage()) + .build() + ) + .build() + ) + .build(); + + // Request body 전송 + try (OutputStream os = connection.getOutputStream()) { + os.write(sendAtVO.toJson().getBytes("UTF-8")); + os.flush(); + } + + // 서버 응답 처리 + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) { + while ((input = reader.readLine()) != null) { + result.append(input); + } + } + } else { + // 오류 응답 처리 + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "UTF-8"))) { + StringBuilder errorResponse = new StringBuilder(); + while ((input = reader.readLine()) != null) { + errorResponse.append(input); + } + System.out.println("Error Response: " + errorResponse.toString()); + return "Error: " + errorResponse.toString(); + } + } + connection.disconnect(); + + System.out.println("Response : " + result.toString()); + + JSONObject jObject = new JSONObject(result.toString()); +// status = jObject.getString("description"); + + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (KeyManagementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; +// return status; + } + + public static Boolean sendSmsPrcs(SendSmsVO sendSmsVO) { + + Boolean success = true; + + StringBuffer result = new StringBuffer(); + + String input = null; + + PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet(); + + try { + + /** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/ + if(ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) { + TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } } }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + URL url = new URL(ppurioGlobalSet.getHost() + "/v3/message"); + + /** Connection 설정 **/ + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Accept-Charset", "UTF-8"); + connection.addRequestProperty("Authorization", "Bearer " + sendSmsVO.getAccesstoken()); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setConnectTimeout(15000); + + /*SMS LMS 구분처리*/ + JSONObject sms = new JSONObject(); + sms.put("message", sendSmsVO.getSmsContent()); + if("LMS".equals(sendSmsVO.getType())) { + sms.put("subject", sendSmsVO.getSubject()); + } + JSONObject content = new JSONObject(); + if("SMS".equals(sendSmsVO.getType())) { + content.put("sms", sms); + }else { + content.put("lms", sms); + } + + JSONObject json = new JSONObject(); + json.put("account", ppurioGlobalSet.getId()); + json.put("type", sendSmsVO.getType().toLowerCase()); + json.put("from", "15881490"); + json.put("to", sendSmsVO.getTo()); + json.put("content", content); + json.put("refkey", "test1234"); + + String body = json.toString(); + + // Request body 전송 + try (OutputStream os = connection.getOutputStream()) { + os.write(body.getBytes("UTF-8")); + os.flush(); + } + + // 서버 응답 처리 + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) { + while ((input = reader.readLine()) != null) { + result.append(input); + } + } + } else { + // 오류 응답 처리 + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "UTF-8"))) { + StringBuilder errorResponse = new StringBuilder(); + while ((input = reader.readLine()) != null) { + errorResponse.append(input); + } + System.out.println("Error Response: " + errorResponse.toString()); + success = false; + //return "Error: " + errorResponse.toString(); + } + } + connection.disconnect(); + + System.out.println("Response : " + result.toString()); + + JSONObject jObject = new JSONObject(result.toString()); +// status = jObject.getString("description"); + + + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + success = false; + } catch (KeyManagementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + success = false; + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + success = false; + } + return success; +// return status; + } + + public static Boolean getPpurioToken(SendAtVO sendAtVO) { + + StringBuffer result = new StringBuffer(); + + String input = null; + + PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet(); + + try { + + /** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/ + if(ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) { + TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] chain, String authType) { } + public void checkServerTrusted(X509Certificate[] chain, String authType) { } } }; + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + URL url = new URL(ppurioGlobalSet.getHost() + "/v1/token"); + + /** Connection 설정 **/ + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Accept-Charset", "UTF-8"); + + //Base64 인코딩 + String idpw = ppurioGlobalSet.getId() + ":" + ppurioGlobalSet.getPw(); + String authData = Base64.getEncoder().encodeToString(idpw.getBytes()); + + connection.addRequestProperty("Authorization", "Basic " + authData); + + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setUseCaches(false); + connection.setConnectTimeout(15000); + + /** Request **/ + OutputStream os = connection.getOutputStream(); + os.flush(); + + /** Response **/ + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); + + while ((input = in.readLine()) != null) { + result.append(input); + } + connection.disconnect(); + + if (result.length() > 0) { + JSONObject jObject = new JSONObject(result.toString()); + if ( + jObject.has("accesstoken") + && !jObject.isNull("accesstoken") + && jObject.has("type") + && !jObject.isNull("type") + && jObject.has("expired") + && !jObject.isNull("expired") + ) { + sendAtVO.setAccesstoken(jObject.getString("accesstoken")); + sendAtVO.setType(jObject.getString("type")); + sendAtVO.setExpired(jObject.getString("expired")); + } else { + System.out.println("response data not found or is null"); + return false; + } + } else { + System.out.println("Empty response"); + return false; + } + + } catch (IOException e) { + System.out.println(e.getMessage()); + return false; + } catch (KeyManagementException e) { + System.out.println(e.getMessage()); + return false; + } catch (NoSuchAlgorithmException e) { + System.out.println(e.getMessage()); + return false; + } + return true; + } + + private static At messageSet( + At at, + Map chihwan + ) { + String content = ""; + Map requiredPlaceholders = new HashMap<>(); + + switch (at.getTemplatecode()) { + case "TEMPLATE_APP_JUBSU": // 신청인_접수확인_1 + at.setTemplatecode("bizp_2024112810423519814410026"); + content = "[한국공정거래조정원] \r\n" + + "귀사(하)의 조정신청이 접수 완료되었습니다.\r\n" + + "향후 담당부서 및 담당자가 배정될 예정입니다."; + break; + case "TEMPLATE_APP_BAEJUNG": // 신청인_담당자배정_2 +// at.setTemplatecode("bizp_2024112810423516931294012"); + at.setTemplatecode("bizp_2024121915475924487679960"); + content = "[한국공정거래조정원]\r\n" + + "귀사(하)가 #{respondent}을(를) 상대로 신청한 사건의 사건번호는 #{caseNo}, 담당자는 #{team}팀 #{examiner} 조사관(유선전화:#{tel}, 메일주소 #{email})입니다.\r\n" + + "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다."; + requiredPlaceholders.put(at.getTemplatecode(), new String[]{"respondent","caseNo", "team", "examiner", "tel", "email"}); + break; + case "TEMPLATE_BOTH_SANGJUNG": // 양당사자_분쟁조정협의회 안건상정 + at.setTemplatecode("bizp_2024112810492919814837182"); + content = "[한국공정거래조정원]\r\n" + + "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]이 향후 개최될 #{cfrnc}분쟁조정협의회에 상정될 예정입니다.\r\n" + + "#{cfrnc}분쟁조정협의회 기일은 담당 조사관(유선전화:#{tel}, 메일주소 #{email})에게 문의주시면 안내드리겠습니다."; + requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "cfrnc", "tel", "email"}); + break; + case "TEMPLATE_BOTH_CHULSUK": // 양당사자_출석요구 n차 +// at.setTemplatecode("bizp_2024112810492916931760451"); + at.setTemplatecode("bizp_2025011515420924487914030"); + content = "[한국공정거래조정원]\r\n" + + "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]의 출석조사(#{nCha}차) 기일이 확정되었습니다. \r\n" + + "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다. \r\n" + + "https://fairnet.kofair.or.kr"; + requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "nCha"}); + break; + case "TEMPLATE_BOTH_TONGJI": // 양당사자_통지 +// at.setTemplatecode("bizp_2024112810492916931854671"); + at.setTemplatecode("bizp_2025011515425124487733149"); + content = "[한국공정거래조정원]\r\n" + + "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]에 대한 #{cfrnc}분쟁조정협의회 의결이 완료되었습니다.\r\n" + + "한국공정거래조정원 분쟁조정사건처리시스템에서 확인해주시기 바랍니다.\r\n" + + "https://fairnet.kofair.or.kr"; + requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "cfrnc"}); + break; + case "TEMPLATE_APP_BOWAN": // 신청인_보완요구 n차 +// at.setTemplatecode("bizp_2024112810522719814540186"); + at.setTemplatecode("bizp_2025011515404892092190436"); + content = + "[한국공정거래조정원]\r\n" + + "귀사(하)가 신청한 분쟁조정 신청사건(사건번호 #{caseNo})에 대한 보완(#{nCha}차)이 필요합니다.\r\n" + + "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다. \r\n" + + "https://fairnet.kofair.or.kr"; + requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "nCha"}); + break; + } + + String[] placeholders = requiredPlaceholders.get(at.getTemplatecode()); + if (placeholders != null) { + for (String placeholder : placeholders) { + String value = chihwan.get(placeholder); + if (value == null || value.isEmpty()) { + throw new IllegalArgumentException(placeholder + " 값이 없습니다."); + } + content = content.replace("#{" + placeholder + "}", value); + } + } + + at.setMessage(content); + return at; + } +} diff --git a/src/main/java/kcc/web/MainController.java b/src/main/java/kcc/web/MainController.java index a662eb4b..2080496c 100644 --- a/src/main/java/kcc/web/MainController.java +++ b/src/main/java/kcc/web/MainController.java @@ -6,16 +6,7 @@ import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; +import java.util.*; import java.util.stream.Collectors; import javax.activation.DataHandler; @@ -394,8 +385,18 @@ public class MainController { @RequestMapping(value = "/web/main/mainPage.do") public String siteMainPage(HttpServletRequest request, ModelMap model, HttpSession session) throws Exception{ + //메인이미지 try { + + // 문자열을 바이트로 변환하고 Base64로 인코딩합니다. + byte[] encodedBytes = Base64.getEncoder().encode("5a2a72e2-16ce-420c-8816-57b3dda0e231:75f6288bae324cd6bd112e82d693aa01".getBytes()); + + // 바이트 배열을 다시 문자열로 변환하여 출력합니다. + String encodedString = new String(encodedBytes); + + System.out.println("encodedString :: " + encodedString); + /** 메인존 */ model.addAttribute("mainzoneList", mainZone()); //PC diff --git a/src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp b/src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp index 399b049a..c62665d1 100644 --- a/src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp +++ b/src/main/webapp/WEB-INF/jsp/sym/mnu/mpm/EgovMenuCreatSelectJtree.jsp @@ -896,7 +896,7 @@ function set_bbs(){ diff --git a/src/main/webapp/WEB-INF/jsp/uss/ion/pwm/PopupZoneModify.jsp b/src/main/webapp/WEB-INF/jsp/uss/ion/pwm/PopupZoneModify.jsp index 195eb980..5929f931 100644 --- a/src/main/webapp/WEB-INF/jsp/uss/ion/pwm/PopupZoneModify.jsp +++ b/src/main/webapp/WEB-INF/jsp/uss/ion/pwm/PopupZoneModify.jsp @@ -108,14 +108,14 @@ function fn_popupzone_update(method_parm) { frm = document.writeForm; frm.action = ""; if(fn_checkForm(1)) - goSave(method_parm) + goSave(method_parm); } /* 글 등록 function */ function fn_popupzone_insert(method_parm) { frm = document.writeForm; frm.action = ""; if(fn_checkForm(1)) - goSave(method_parm) + goSave(method_parm); } /* 배너 삭제 function */ diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonFooter.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonFooter.jsp index 30c96469..94eabe14 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonFooter.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonFooter.jsp @@ -1,47 +1,7 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -