diff --git a/WebContent/damo.jsp b/WebContent/damo.jsp new file mode 100644 index 0000000..6cac785 --- /dev/null +++ b/WebContent/damo.jsp @@ -0,0 +1,170 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%@ page import="java.lang.reflect.Method" %> +<%@ page import="org.apache.commons.lang3.StringUtils" %> +<%@ page import="com.eactive.eai.rms.common.login.SessionManager" %> +<%! + // 최소 HTML 이스케이프 (진단 페이지 XSS 방지) + private String esc(String s) { + if (s == null) return ""; + StringBuilder b = new StringBuilder(s.length() + 16); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '&': b.append("&"); break; + case '<': b.append("<"); break; + case '>': b.append(">"); break; + case '"': b.append("""); break; + case '\'': b.append("'"); break; + default: b.append(c); + } + } + return b.toString(); + } +%> +<% + // 로그인 사용자만 접근 — real 모드에서 운영 키 암복호화 오라클이 되지 않도록 보호 + if (StringUtils.isBlank(SessionManager.getUserId(request)) + && StringUtils.isBlank(SessionManager.getRoleIdString(request))) { + response.sendRedirect(request.getContextPath() + "/loginForm.do"); + return; + } + + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Expires", "0"); + request.setCharacterEncoding("utf-8"); + + String op = request.getParameter("op"); + String input = request.getParameter("input"); + boolean run = request.getParameter("run") != null; + if (op == null) op = "encrypt"; + if (input == null) input = ""; + + String mode = "UNKNOWN"; + String revision = "-"; + String returnCode = "-"; + String result = ""; + String error = ""; + boolean loaded = false; + + try { + Class> cls = Class.forName("com.eactive.ext.djb.DamoManager"); + Object damo = cls.getMethod("getInstance").invoke(null); + loaded = true; + + boolean bypass = (Boolean) cls.getMethod("isBypassMode").invoke(damo); + boolean fake = (Boolean) cls.getMethod("isFakeMode").invoke(damo); + mode = bypass ? "BYPASS" : (fake ? "FAKE" : "REAL"); + revision = String.valueOf(cls.getMethod("getRevision").invoke(damo)); + returnCode = String.valueOf(cls.getMethod("getReturnCode").invoke(damo)); + + if (run) { + if ("encrypt".equals(op)) { + result = (String) cls.getMethod("encrypt", String.class).invoke(damo, input); + } else if ("decrypt".equals(op)) { + result = (String) cls.getMethod("decrypt", String.class).invoke(damo, input); + } else if ("sha256".equals(op)) { + int t = cls.getField("SHA256").getInt(null); + result = (String) cls.getMethod("hash", int.class, String.class).invoke(damo, t, input); + } else if ("sha512".equals(op)) { + int t = cls.getField("SHA512").getInt(null); + result = (String) cls.getMethod("hash", int.class, String.class).invoke(damo, t, input); + } else { + error = "알 수 없는 op: " + op; + } + } + } catch (ClassNotFoundException e) { + error = "com.eactive.ext.djb.DamoManager 클래스를 찾을 수 없습니다. " + + "damo-manager.jar 를 WAS lib (운영) 또는 WEB-INF/lib 에 배포하세요."; + } catch (Throwable t) { + // require-real fail-fast(ExceptionInInitializerError) 또는 초기화 실패(NoClassDefFoundError) 포함 + Throwable c = (t.getCause() != null) ? t.getCause() : t; + error = c.toString(); + if (c instanceof NoClassDefFoundError + || error.contains("require-real") + || error.contains("Could not initialize")) { + error += " (※ -Ddamo-manager.require-real=true 인데 scpdb 가 없어 기동에 실패했을 수 있습니다. " + + "scpdb 를 갖추거나 옵션을 내리세요.)"; + } + } + + String badgeColor = "REAL".equals(mode) ? "#1a7f37" + : "BYPASS".equals(mode) ? "#9a3412" + : "FAKE".equals(mode) ? "#9a6700" : "#6e7781"; +%> + + +
+ + +-Ddamo-manager.enabled=true, scpdb 없음) · REAL: penta scpdb 실 암복호화(enabled=true + scpdb).-Ddamo-manager.require-real=true 로 real 강제(아니면 기동 실패). CLI 로도 동일 확인: java -jar damo-manager.jar enc <text>
+