package froala.editor.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Date; import java.util.Enumeration; import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import egovframework.com.cmm.service.EgovProperties; import froala.editor.file.FileOptions; import froala.editor.image.ImageOptions; public class CommonUtil { private static Logger logger = LoggerFactory.getLogger(CommonUtil.class); /** * 배열을 문자열로 바꿈 * * @param glue 구분자 * @param array 배열 * @return */ public static String arrayJoin(String glue, String array[]) { String result = ""; for (int i = 0; i < array.length; i++) { result += array[i]; if (i < array.length - 1) result += glue; } return result; } /** * 파라메터 확인용 * * @param request */ public static void viewRequestParams(HttpServletRequest request) { Enumeration e = request.getParameterNames(); String name = ""; while (e.hasMoreElements()) { name = e.nextElement(); logger.info("{} : {}", name, request.getParameter(name)); } } /** * 시간유틸 * * @author simplys * */ private static class TIME_MAXIMUM { public static final int SEC = 60; public static final int MIN = 60; public static final int HOUR = 24; public static final int DAY = 30; public static final int MONTH = 12; } public static String formatTimeString(Date tempDate) { if (tempDate != null) { long curTime = System.currentTimeMillis(); long regTime = tempDate.getTime(); long diffTime = (curTime - regTime) / 1000; String msg = null; if (diffTime < TIME_MAXIMUM.SEC) { // sec msg = "방금 전"; } else if ((diffTime /= TIME_MAXIMUM.SEC) < TIME_MAXIMUM.MIN) { // min msg = diffTime + "분 전"; } else if ((diffTime /= TIME_MAXIMUM.MIN) < TIME_MAXIMUM.HOUR) { // hour msg = (diffTime) + "시간 전"; } else if ((diffTime /= TIME_MAXIMUM.HOUR) < TIME_MAXIMUM.DAY) { // day msg = (diffTime) + "일 전"; } else if ((diffTime /= TIME_MAXIMUM.DAY) < TIME_MAXIMUM.MONTH) { // day msg = (diffTime) + "달 전"; } else { msg = (diffTime) + "년 전"; } return msg; } else { return null; } } private static String makeLink(String url, Integer p, Map param) { StringBuffer ret = new StringBuffer(); if (url.startsWith("/")) { ret.append(url + "?page=" + p); if (param != null) for (String key : param.keySet()) ret.append("&" + key + "=" + (param.get(key) == null ? "" : param.get(key))); } else { ret.append(String.format("javascript:%s(%d", url, p)); if (param != null) for (String key : param.keySet()) if (param.get(key) instanceof Integer) ret.append(", " + param.get(key)); else ret.append(", '" + param.get(key) + "'"); ret.append(")"); } return ret.toString(); } /** * 페이징 생성 * * @param page 페이지 번호 * @param limit 한 페이지에 보여줄 목록 수 * @param pagelimit 한 줄에 보여줄 페이지 갯수 * @param allRowCount 전체 검색 레코드 갯수 * @param url 한 페이지에 걸릴 url 링크 * @param param URL 뒤에 queryString * @return */ public static String pagePopupList(Integer page, Integer limit, Integer pagelimit, Integer allRowCount, String url, Map param) { StringBuffer sb = new StringBuffer(); Integer lastpage = (int) Math.ceil((allRowCount * 1.0) / (limit * 1.0)); sb.append("
"); sb.append(" \n").append("
\n"); return sb.toString(); } /** * 페이징 생성 * * @param page 페이지 번호 * @param limit 한 페이지에 보여줄 목록 수 * @param pagelimit 한 줄에 보여줄 페이지 갯수 * @param allRowCount 전체 검색 레코드 갯수 * @param url 한 페이지에 걸릴 url 링크 * @param param URL 뒤에 queryString * @return */ public static String pageList(Integer page, Integer limit, Integer pagelimit, Integer allRowCount, String url, Map param) { StringBuffer sb = new StringBuffer(); Integer lastpage = (int) Math.ceil((allRowCount * 1.0) / (limit * 1.0)); sb.append(" \n"); return sb.toString(); } public static String getURL(HttpServletRequest request) { Enumeration param = request.getParameterNames(); StringBuffer strParam = new StringBuffer(); StringBuffer strURL = new StringBuffer(); if (param.hasMoreElements()) { strParam.append("?"); } while (param.hasMoreElements()) { String name = (String) param.nextElement(); String value = request.getParameter(name); strParam.append(name + "=" + value); if (param.hasMoreElements()) { strParam.append("&"); } } strURL.append(request.getRequestURI()); strURL.append(strParam); return strURL.toString(); } public static Boolean setTimeout(int delayTime) { long now = System.currentTimeMillis(); long currentTime = 0; while (currentTime - now < delayTime) { currentTime = System.currentTimeMillis(); } return true; } public static String arrayToString(String[] str, String argDelimiter) { String rString = ""; if (str == null) return ""; int cntArray = str.length; for (int i = 0; i < cntArray; i++) { if (i > 0 && i < cntArray) rString += argDelimiter; rString += str[i]; } return rString; } public static String hashSHA256(String str) { String SHA = ""; try { MessageDigest sh = MessageDigest.getInstance("SHA-256"); sh.update(str.getBytes()); byte byteData[] = sh.digest(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < byteData.length; i++) { sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); } SHA = sb.toString(); } catch (NoSuchAlgorithmException e) { logger.error("fail to process hashSHA256 {}", e); SHA = null; } return SHA; } /** * 에디터 내용 변경(contextpath) * * @Author : 임종호 * @Date : 2021. 11. 3. * @Method Name : convertEditorCn * @return : String */ public static String convertEditorCn(String cn, HttpServletRequest request) { String contextPath = request.getContextPath(); String convertCn = cn .replace("src=\"" + ImageOptions.downloadDefault, "src=\"" + contextPath + ImageOptions.downloadDefault) .replace("src=\"/vtsp" + ImageOptions.downloadDefault, "src=\"" + contextPath + ImageOptions.downloadDefault) .replace("href=\"" + FileOptions.downloadDefault, "href=\"" + contextPath + FileOptions.downloadDefault) .replace("href=\"/vtsp" + FileOptions.downloadDefault, "href=\"" + contextPath + FileOptions.downloadDefault); return convertCn; } /** * 모바일 체크 * * @Author : 임종호 * @Date : 2021. 11. 8. * @Method Name : isMobile * @return : boolean */ public static boolean isMobile(HttpServletRequest request) { String userAgent = request.getHeader("user-agent"); boolean mobile1 = userAgent.matches( ".*(iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson).*"); boolean mobile2 = userAgent.matches(".*(LG|SAMSUNG|Samsung).*"); if (mobile1 || mobile2) { return true; } else { return false; } } /** * AES256 암호화 - URL 인코딩 * @Author : 임종호 * @Date : 2021. 11. 16. * @Method Name : encryptAES256 * @return : String */ public static String encryptAES256(String str) { if (StringUtils.isBlank(str)) { return ""; } String enStr = ""; String keyStr = EgovProperties.getProperty("ctm.egovfilescrty.key").trim(); String ivStr = EgovProperties.getProperty("ctm.egovfilescrty.iv").trim(); Key key = new SecretKeySpec(keyStr.getBytes(), "AES"); IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); Cipher c; try { c = Cipher.getInstance("AES/CBC/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, key, iv); byte[] encrypted; encrypted = c.doFinal(str.getBytes("UTF-8")); enStr = new String(Base64.encodeBase64(encrypted)); enStr = URLEncoder.encode(enStr, "UTF-8"); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | UnsupportedEncodingException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) { logger.error(e.getCause().getMessage()); return ""; } return enStr; } /** * AES256 복호화 - URL 인코딩 * @Author : 임종호 * @Date : 2021. 11. 16. * @Method Name : decryptAES256 * @return : String */ public static String decryptAES256(String str) { if (StringUtils.isBlank(str)) { return ""; } String deStr = ""; String keyStr = EgovProperties.getProperty("ctm.egovfilescrty.key").trim(); String ivStr = EgovProperties.getProperty("ctm.egovfilescrty.iv").trim(); Key key = new SecretKeySpec(keyStr.getBytes(), "AES"); IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); Cipher c; try { c = Cipher.getInstance("AES/CBC/PKCS5Padding"); c.init(Cipher.DECRYPT_MODE, key, iv); str = str.replace(" ", "+"); // 암호화된 데이터가 + 일때 공백으로 넘어와서 치환 byte[] decrypted = Base64.decodeBase64(str); deStr = new String(c.doFinal(decrypted), "UTF-8"); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | UnsupportedEncodingException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) { logger.error(e.getCause().getMessage()); return ""; } return deStr; } }