package egovframework.com.cmm.selfauth;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.sci.v2.pcc.secu.SciSecuManager;
import com.sci.v2.pcc.secu.hmac.SciHmac;
import egovframework.com.cmm.UserVO;
import egovframework.let.cop.bbs.service.BoardVO;
import egovframework.let.cop.resve.service.ResveVO;
/**
* 휴대폰 인증 처리를 위한 컨트롤러 클래스
* @author 공통 서비스 개발팀 이삼섭
* @since 2009.03.19
* @version 1.0
* @see
*
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.03.19 이삼섭 최초 생성
* 2009.06.29 한성곤 2단계 기능 추가 (댓글관리, 만족도조사)
* 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성
*
*
*/
@Controller
public class SelfauthController {
@Value("#{globalSettings['Globals.Site.URL']}")
private String SITE_URL;
@Value("#{globalSettings['Globals.selfauth.siteId']}")
private String SELFAUTH_SITE_ID;
@Value("#{globalSettings['Globals.selfauth.srvNo']}")
private String SELFAUTH_SRV_NO;
private static final Logger LOGGER = LoggerFactory.getLogger(SelfauthController.class);
/**
* (사용자)인증여부 체크 (본인인증(휴대폰), 아이핀인증)
*
* @param ResveVO
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/selfauth/authCheckAjax.do")
public ModelAndView authenticationAjax(HttpServletRequest request, @ModelAttribute("searchVO") ResveVO resveVO, ModelMap model, @RequestParam Map commandMap) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
String returnType = (String) commandMap.get("returnType");
String returnUrl = (String) commandMap.get("returnUrl");
UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
String authChck = "";
// 인증여부
if (userVO != null) {
authChck = "true";
modelAndView.addObject("userNm", userVO.getName());
} else {
authChck = "false";
request.getSession().setAttribute("returnType", returnType);
request.getSession().setAttribute("returnUrl", returnUrl);
}
modelAndView.addObject("authChck", authChck);
return modelAndView;
}
/**
* (사용자)인증 처리 Test
*
* @param boardVO
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/selfauth/authenticationResult.do")
public String authenticationResult(HttpServletRequest request, ModelMap model
,RedirectAttributes redirectAttributes) throws Exception {
UserVO userVO = new UserVO();
String nameEn = (String)request.getParameter("nameEn");
String returnType = (String)request.getParameter("returnType");
switch (nameEn) {
case "yu1" :
userVO.setName("홍길동"); userVO.setMblDn("1111"); break;
case "yu2" :
userVO.setName("김길동"); userVO.setMblDn("2222"); break;
case "yu3" :
userVO.setName("박길동"); userVO.setMblDn("3333"); break;
}
request.getSession().setAttribute("userVO", userVO); // 인증 처리 개발용이니 실서버 적용 되면 안됨.
String url = returnType;
url = "";
// if (("resveAdd").equals(returnType)) {
// url = "/web/cop/resve/addResveIntro.do";
// } else if (("resveInqire").equals(returnType)) {
// url = "/web/cop/resve/selectResveList.do";
// redirectAttributes.addAttribute("resveInqire", "resveInqire"); //내 대관현황
// }
// url = "/web/cop/resve/selectResveList.do?viewCnd=resveList";
return "redirect:" + url;
}
/**
* (사용자)본인인증 요청 입력 Sample
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/bbs/pccInput.do")
public String pccInput(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
return "web/cop/selfauth/pcc_V3_input_seed";
}
/**
* (사용자)본인인증 요청 팝업 Sample
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/bbs/selfauth.do")
public String selfauthTest(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
return "web/cop/selfauth/pcc_V3_sample_seed";
}
/**
* (사용자)본인인증 결과 리턴 Sample
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/bbs/pccPopSeed.do")
public String pccPopSeed(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
return "web/cop/selfauth/pcc_V3_popup_seed";
}
/**
* (사용자)본인인증 결과 Sample
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/bbs/pccResult.do")
public String pccResult(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
return "web/cop/selfauth/pcc_V3_result_seed";
}
/**
* (사용자)본인인증 안내 화면 휴대폰인증. 사용안함
*
* @param
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/selfauth/authentication.do")
public String authentication(ModelMap model) throws Exception {
model.addAttribute("SITE_URL", SITE_URL);
return "web/cop/selfauth/authentication";
}
/**
* (사용자) 휴대폰 본인인증 요청 1 pop
*
* @param model
* @return
* @throws Exception
*/
@RequestMapping("/web/cop/selfauth/selfauth.do")
public String selfauth(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
// 사이렌 요청 URL 등록 : /web/cop/selfauth/selfauth.do
// test 서버 서비스 번호 001001
//날짜 생성
Calendar today = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String day = sdf.format(today.getTime());
java.util.Random ran = new Random();
//랜덤 문자 길이
int numLength = 6;
String randomStr = "";
for (int i = 0; i < numLength; i++) {
//0 ~ 9 랜덤 숫자 생성
randomStr += ran.nextInt(10);
}
String reqNum = day + randomStr; // //reqNum은 최대 40byte 까지 사용 가능
String certDate=day;
String exVar = "0000000000000000"; // 복호화용 임시필드
String certGb = "H"; // 인증구분 H: 휴대폰
String addVar = "";
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); // 본인확인 요청 정보
request.getSession().setAttribute("SITE_URL", SITE_URL); // 사이트 URL
return "web/cop/selfauth/selfauth";
}
/**
* (사용자)본인인증 결과 휴대폰인증2 리턴
*
* @param model
* @return
* @throws Exception
*/
@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")) {
model.addAttribute("msgChk", msgChk);
return "web/cop/selfauth/resultSeed";
}
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 ci1 = aRetInfo[5]; //CI
// String ci2 = aRetInfo[6]; //CI
// String civersion = aRetInfo[7]; //CI Version
// String reqNum = aRetInfo[8]; // 본인확인 요청번호
// String result = aRetInfo[9]; // 본인확인결과 (Y/N)
// String certGb = aRetInfo[10]; // 인증수단
// String cellNo = aRetInfo[11]; // 핸드폰 번호
// String cellCorp = aRetInfo[12]; // 이동통신사
// String certDate = aRetInfo[13]; // 검증시간
// String addVar = aRetInfo[14];
// 비정상 접근 처리
if(di == null || di.equals("")) {
model.addAttribute("msgChk", "N");
return "web/cop/selfauth/resultSeed";
}
// 사용자 세션생성
UserVO userVO = new UserVO();
userVO.setName(name);
userVO.setMblDn(di);
request.getSession().setAttribute("userVO", userVO);
String returnType = (String)request.getSession().getAttribute("returnType");
String returnUrl = (String)request.getSession().getAttribute("returnUrl");
// if (!("resveAdd").equals(returnType) && !("resveInqire").equals(returnType)) {
// BoardVO searchVO = (BoardVO)request.getSession().getAttribute("searchVO");
// model.addAttribute("searchVO", searchVO);
// }
model.addAttribute("returnType", returnType);
model.addAttribute("returnUrl", returnUrl);
model.addAttribute("name", name);
return "web/cop/selfauth/resultSeed";
}
}