/*
 * Copyright 2008-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package egovframework.com.cmm.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import egovframework.rte.fdl.idgnr.impl.Base64;

public class TokenUtil {

	private static final String TOKEN_KEY = "TOKEN_KEY";
	private static final Logger logger = Logger.getLogger(TokenUtil.class.getName());
 
	 /**
	  * 로직처리를 위해 세션과 request에 Token 생성
	  * 
	  * @param request
	  */
	 public static void saveToken(HttpServletRequest request) {
		  HttpSession session = request.getSession(true);
		  long systemTime = System.currentTimeMillis();
		  byte[] time = new Long(systemTime).toString().getBytes();
		  byte[] id = session.getId().getBytes();
		   
		  try {
			   MessageDigest SHA = MessageDigest.getInstance("SHA-256");
			   SHA.update(id);
			   SHA.update(time);
			 
			   String token = Base64.encode(SHA.digest());
			   request.setAttribute(TOKEN_KEY, token);
			   session.setAttribute(TOKEN_KEY, token);
			    
			   logger.error("#########################################################################");
			   logger.error("# Generate Token Key Value = " + token + " #");
			   logger.error("#########################################################################");
			    
		  } catch (NoSuchAlgorithmException e) {
			  System.out.println("토큰에러");
		  }
	 }
 
	 /**
	  * 로직처리 이후 중복방지를 위해 세션의 Token 초기화
	  * 
	  * @param request
	  */
	 public static void resetToken(HttpServletRequest request) {
		  HttpSession session = request.getSession(true);
		 
		  try {
			  session.removeAttribute(TOKEN_KEY);
		  } catch (Exception e) {
			  System.out.println("토큰에러");
		  }
	 }
 
	 /**
	  * 세션과 request의 Token이 동일한지 비교
	  * 
	  * @param request
	  * @return
	  */
	 public static boolean isTokenValid(HttpServletRequest request) {
		  HttpSession session = request.getSession(true);
		  String requestToken = request.getParameter(TOKEN_KEY);
		  String sessionToken = (String) session.getAttribute(TOKEN_KEY);
		 
		  if (requestToken == null || sessionToken == null) {
			  logger.error("# null #");
		   	  return false;
		  } else {
			  logger.error("# notnull #");
			  return requestToken.equals(sessionToken);
		  }
	 }
	 
}