From a15e522f916d0da20ffcac89d0fdf43738eb850a Mon Sep 17 00:00:00 2001
From: Kohei Tamura
Date: Wed, 25 Oct 2017 17:22:20 +0900
Subject: [PATCH] Refactor code
---
.../easybuggy/core/dao/EmbeddedADS.java | 2 +-
.../core/servlets/AbstractServlet.java | 173 ++++++++++++++++
.../core/servlets/AdminsMainServlet.java | 23 +--
.../core/servlets/DefaultLoginServlet.java | 113 +++++------
.../core/servlets/DefaultLogoutServlet.java | 3 +-
.../easybuggy/core/servlets/ExitServlet.java | 8 +-
.../easybuggy/core/servlets/PingServlet.java | 7 +-
.../easybuggy/core/servlets/TestServlet.java | 7 +-
.../easybuggy/core/utils/EmailUtils.java | 30 ++-
.../core/utils/HTTPResponseCreator.java | 88 --------
.../easybuggy/core/utils/MessageUtils.java | 86 --------
.../core/utils/MultiPartFileUtils.java | 64 ++++++
.../errors/AssertionErrorServlet.java | 5 +-
.../ExceptionInInitializerErrorServlet.java | 7 +-
.../FactoryConfigurationErrorServlet.java | 5 +-
.../GenericSignatureFormatErrorServlet.java | 5 +-
.../errors/NoClassDefFoundErrorServlet.java | 4 +-
.../errors/OutOfMemoryErrorServlet.java | 5 +-
.../errors/OutOfMemoryErrorServlet2.java | 5 +-
.../errors/OutOfMemoryErrorServlet3.java | 10 +-
.../errors/OutOfMemoryErrorServlet4.java | 5 +-
.../errors/OutOfMemoryErrorServlet5.java | 8 +-
.../errors/OutOfMemoryErrorServlet6.java | 5 +-
.../errors/StackOverflowErrorServlet.java | 5 +-
...ormerFactoryConfigurationErrorServlet.java | 5 +-
.../errors/UnsatisfiedLinkErrorServlet.java | 5 +-
.../ArithmeticExceptionServlet.java | 5 +-
...ArrayIndexOutOfBoundsExceptionServlet.java | 5 +-
.../ArrayStoreExceptionServlet.java | 5 +-
.../BufferOverflowExceptionServlet.java | 10 +-
.../BufferUnderflowExceptionServlet.java | 5 +-
.../CannotRedoExceptionServlet.java | 5 +-
.../CannotUndoExceptionServlet.java | 5 +-
.../exceptions/ClassCastExceptionServlet.java | 5 +-
...oncurrentModificationExceptionServlet.java | 5 +-
.../EmptyStackExceptionServlet.java | 8 +-
.../IllegalArgumentExceptionServlet.java | 5 +-
.../IllegalMonitorStateExceptionServlet.java | 8 +-
.../IllegalPathStateExceptionServlet.java | 5 +-
.../IllegalStateExceptionServlet.java | 5 +-
.../IllegalThreadStateExceptionServlet.java | 5 +-
.../exceptions/ImagingOpExceptionServlet.java | 5 +-
.../IndexOutOfBoundsExceptionServlet.java | 5 +-
.../InputMismatchExceptionServlet.java | 5 +-
...rmedParameterizedTypeExceptionServlet.java | 5 +-
.../MissingResourceExceptionServlet.java | 5 +-
.../NegativeArraySizeExceptionServlet.java | 5 +-
.../NoSuchElementExceptionServlet.java | 5 +-
.../NullPointerExceptionServlet.java | 5 +-
.../NumberFormatExceptionServlet.java | 5 +-
.../exceptions/SecurityExceptionServlet.java | 5 +-
.../UnsupportedCharsetExceptionServlet.java | 5 +-
.../UnsupportedOperationExceptionServlet.java | 5 +-
.../CreatingUnnecessaryObjectsServlet.java | 19 +-
.../SlowRegularExpressionServlet.java | 27 +--
.../StringPlusOperationServlet.java | 37 ++--
.../troubles/DBConnectionLeakServlet.java | 30 ++-
.../easybuggy/troubles/DeadlockServlet.java | 22 +-
.../easybuggy/troubles/DeadlockServlet2.java | 37 ++--
.../troubles/EndlessWaitingServlet.java | 29 +--
.../troubles/FileDescriptorLeakServlet.java | 25 +--
.../troubles/ForwardLoopServlet.java | 5 +-
.../troubles/InfiniteLoopServlet.java | 8 +-
.../troubles/IntegerOverflowServlet.java | 23 +--
.../troubles/JVMCrashByEAVServlet.java | 8 +-
.../troubles/LossOfTrailingDigitsServlet.java | 19 +-
.../easybuggy/troubles/MemoryLeakServlet.java | 31 ++-
.../troubles/MemoryLeakServlet2.java | 33 ++-
.../troubles/MemoryLeakServlet3.java | 23 +--
.../easybuggy/troubles/MojibakeServlet.java | 25 +--
.../troubles/NetworkSocketLeakServlet.java | 29 +--
.../troubles/RedirectLoopServlet.java | 5 +-
.../troubles/RoundOffErrorServlet.java | 19 +-
.../easybuggy/troubles/ThreadLeakServlet.java | 17 +-
.../troubles/TruncationErrorServlet.java | 21 +-
.../vulnerabilities/CSRFServlet.java | 41 ++--
.../vulnerabilities/ClickJackingServlet.java | 56 ++----
.../vulnerabilities/CodeInjectionServlet.java | 36 ++--
.../vulnerabilities/LDAPInjectionServlet.java | 11 +-
.../MailHeaderInjectionServlet.java | 63 ++----
.../NullByteInjectionServlet.java | 21 +-
.../OGNLExpressionInjectionServlet.java | 31 ++-
.../vulnerabilities/OpenRedirectServlet.java | 53 ++---
.../vulnerabilities/SQLInjectionServlet.java | 31 ++-
.../UnrestrictedExtensionUploadServlet.java | 75 ++-----
.../UnrestrictedSizeUploadServlet.java | 76 ++-----
.../VerboseErrorMessageServlet.java | 34 +---
.../vulnerabilities/XEEandXXEServlet.java | 188 +++++++-----------
.../easybuggy/vulnerabilities/XSSServlet.java | 25 +--
src/main/resources/indexpage_en.properties | 2 +-
src/main/webapp/dfi/includable.jsp | 8 +-
src/main/webapp/dt/includable.jsp | 6 +-
src/main/webapp/images/easybuggy.png | Bin 19588 -> 19412 bytes
src/main/webapp/index.jsp | 34 ++--
src/main/webapp/uid/clientinfo.jsp | 6 +-
src/main/webapp/uid/serverinfo.jsp | 6 +-
96 files changed, 896 insertions(+), 1228 deletions(-)
create mode 100644 src/main/java/org/t246osslab/easybuggy/core/servlets/AbstractServlet.java
delete mode 100644 src/main/java/org/t246osslab/easybuggy/core/utils/HTTPResponseCreator.java
delete mode 100644 src/main/java/org/t246osslab/easybuggy/core/utils/MessageUtils.java
create mode 100644 src/main/java/org/t246osslab/easybuggy/core/utils/MultiPartFileUtils.java
diff --git a/src/main/java/org/t246osslab/easybuggy/core/dao/EmbeddedADS.java b/src/main/java/org/t246osslab/easybuggy/core/dao/EmbeddedADS.java
index a0e480ff..68fb4735 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/dao/EmbeddedADS.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/dao/EmbeddedADS.java
@@ -28,7 +28,7 @@ public final class EmbeddedADS {
/** The directory service */
private static DirectoryService service;
- /**
+ /*
* Create an instance of EmbeddedADS and initialize it.
*/
static {
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/AbstractServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/AbstractServlet.java
new file mode 100644
index 00000000..a786d39c
--- /dev/null
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/AbstractServlet.java
@@ -0,0 +1,173 @@
+package org.t246osslab.easybuggy.core.servlets;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.owasp.esapi.ESAPI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.utils.Closer;
+
+import java.io.PrintWriter;
+import java.text.MessageFormat;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+@SuppressWarnings("serial")
+public abstract class AbstractServlet extends HttpServlet {
+
+ protected Logger log = LoggerFactory.getLogger(this.getClass());
+
+ /**
+ * Send an HTTP response to the client.
+ *
+ * @param req HTTP servlet request.
+ * @param res HTTP servlet response.
+ * @param htmlTitle Title of HTML page.
+ * @param htmlBody Body of HTML page.
+ */
+ protected void responseToClient(HttpServletRequest req, HttpServletResponse res, String htmlTitle, String htmlBody) {
+ PrintWriter writer = null;
+ HttpSession session = req.getSession();
+ String userid = (String) session.getAttribute("userid");
+ Locale locale = req.getLocale();
+ try {
+ writer = res.getWriter();
+ writer.write("");
+ writer.write("");
+ if (htmlTitle != null) {
+ writer.write("" + htmlTitle + " ");
+ }
+ writer.write(" ");
+ writer.write(" ");
+ writer.write(" ");
+ writer.write("");
+ writer.write("");
+ writer.write("");
+ writer.write("");
+
+ writer.write("");
+ writer.write("");
+ writer.write("");
+ writer.write("");
+ writer.write("");
+ writer.write(" ");
+ if (htmlTitle != null) {
+ writer.write(htmlTitle);
+ }
+ writer.write(" ");
+ writer.write(" ");
+ if (userid != null && req.getServletPath().startsWith("/admins")) {
+ writer.write("");
+ writer.write(getMsg("label.login.user.id", locale) + ": " + userid);
+ writer.write(" ");
+ writer.write("" + getMsg("label.logout", locale) + " ");
+ writer.write(" ");
+ } else {
+ writer.write("");
+ writer.write("" + getMsg("label.go.to.main", locale) + " ");
+ writer.write(" ");
+ }
+ writer.write(" ");
+ writer.write("
");
+ writer.write(" ");
+ writer.write(htmlBody);
+ writer.write("");
+ writer.write("");
+
+ } catch (Exception e) {
+ log.error("Exception occurs: ", e);
+ } finally {
+ Closer.close(writer);
+ }
+ }
+
+ /**
+ * Return a message for a given property key.
+ *
+ * @return A message for a given property key
+ */
+ protected String getMsg(String propertyKey, Locale locale) {
+ return getMsg(propertyKey, null, locale);
+ }
+
+ /**
+ * Return an information message for a given property key.
+ *
+ * @return An information message for a given property key
+ */
+ protected String getInfoMsg(String propertyKey, Locale locale) {
+ return getInfoMsg(propertyKey, null, locale);
+ }
+
+ /**
+ * Return an error message for a given property key.
+ *
+ * @return An error message for a given property key
+ */
+ protected String getErrMsg(String propertyKey, Locale locale) {
+ return getErrMsg(propertyKey, null, locale);
+ }
+
+ /**
+ * Return a message for a given property key, replaced with placeholders.
+ *
+ * @return A message for a given property key, replaced with placeholders
+ */
+ protected String getMsg(String propertyKey, Object[] placeholders, Locale locale) {
+ String propertyValue = null;
+ try {
+ propertyValue = ResourceBundle.getBundle("messages", locale).getString(propertyKey);
+ if (placeholders != null) {
+ propertyValue = MessageFormat.format(propertyValue, placeholders);
+ }
+ } catch (Exception e) {
+ log.error("Exception occurs: ", e);
+ }
+ return propertyValue;
+ }
+
+ /**
+ * Return an information message for a given property key, replaced with placeholders.
+ *
+ * @return An information message for a given property key, replaced with placeholders
+ */
+ protected String getInfoMsg(String propertyKey, Object[] placeholders, Locale locale) {
+ return " "
+ + getMsg(propertyKey, placeholders, locale) + "
";
+ }
+
+ /**
+ * Return an error message for a given property key, replaced with placeholders.
+ *
+ * @return An error message for a given property key, replaced with placeholders
+ */
+ protected String getErrMsg(String propertyKey, Object[] placeholders, Locale locale) {
+ return " "
+ + getMsg(propertyKey, placeholders, locale) + "
";
+ }
+
+ /**
+ * Encode data for use in HTML using HTML entity encoding
+ * Note that this method just call ESAPI.encoder().encodeForHTML(String)
.
+ *
+ * @param input the text to encode for HTML
+ * @return input encoded for HTML
+ */
+ protected String encodeForHTML(String input) {
+ return ESAPI.encoder().encodeForHTML(input);
+ }
+
+ /**
+ * Encode data for use in LDAP queries.
+ * Note that this method just call ESAPI.encoder().encodeForLDAP((String)
.
+ *
+ * @param input the text to encode for LDAP
+ * @return input encoded for use in LDAP
+ */
+ protected String encodeForLDAP(String input) {
+ return ESAPI.encoder().encodeForLDAP(input);
+ }
+}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/AdminsMainServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/AdminsMainServlet.java
index 6de6f396..861da082 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/AdminsMainServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/AdminsMainServlet.java
@@ -5,31 +5,26 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
-
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/admins/main" })
-public class AdminsMainServlet extends HttpServlet {
+public class AdminsMainServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Locale locale = req.getLocale();
StringBuilder bodyHtml = new StringBuilder();
- bodyHtml.append(MessageUtils.getMsg("msg.admin.page.top", locale));
+ bodyHtml.append(getMsg("msg.admin.page.top", locale));
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.adminmain.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.adminmain.page", locale), bodyHtml.toString());
}
}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLoginServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLoginServlet.java
index b0b80c6c..f3da5483 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLoginServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLoginServlet.java
@@ -8,7 +8,6 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@@ -20,128 +19,112 @@
import org.apache.directory.shared.ldap.filter.SearchScope;
import org.apache.directory.shared.ldap.message.AliasDerefMode;
import org.apache.directory.shared.ldap.name.LdapDN;
-import org.owasp.esapi.ESAPI;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.t246osslab.easybuggy.core.dao.EmbeddedADS;
import org.t246osslab.easybuggy.core.model.User;
import org.t246osslab.easybuggy.core.utils.ApplicationUtils;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/login" })
-public class DefaultLoginServlet extends HttpServlet {
+public class DefaultLoginServlet extends AbstractServlet {
/* User's login history using in-memory account locking */
protected ConcurrentHashMap userLoginHistory = new ConcurrentHashMap();
- private static final Logger log = LoggerFactory.getLogger(DefaultLoginServlet.class);
-
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
Locale locale = req.getLocale();
StringBuilder bodyHtml = new StringBuilder();
- bodyHtml.append("" + MessageUtils.getMsg("msg.need.admin.privilege", locale) + " ");
- bodyHtml.append(MessageUtils.getMsg("msg.enter.id.and.password", locale) + "
");
+ bodyHtml.append("" + getMsg("msg.need.admin.privilege", locale) + " ");
+ bodyHtml.append(getMsg("msg.enter.id.and.password", locale) + "
");
bodyHtml.append("");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.login.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.login.page", locale), bodyHtml.toString());
}
@Override
- public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
+ public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
- String userid = StringUtils.trim(request.getParameter("userid"));
- String password = StringUtils.trim(request.getParameter("password"));
+ String userid = StringUtils.trim(req.getParameter("userid"));
+ String password = StringUtils.trim(req.getParameter("password"));
- HttpSession session = request.getSession(true);
+ HttpSession session = req.getSession(true);
if (isAccountLocked(userid)) {
session.setAttribute("authNMsg", "msg.account.locked");
- response.sendRedirect("/login");
+ res.sendRedirect("/login");
} else if (authUser(userid, password)) {
- /* Reset account lock */
- User admin = userLoginHistory.get(userid);
- if (admin == null) {
- User newAdmin = new User();
- newAdmin.setUserId(userid);
- admin = userLoginHistory.putIfAbsent(userid, newAdmin);
- if (admin == null) {
- admin = newAdmin;
- }
- }
- admin.setLoginFailedCount(0);
- admin.setLastLoginFailedTime(null);
+ /* Reset account lock count */
+ resetAccountLock(userid);
session.setAttribute("authNMsg", "authenticated");
session.setAttribute("userid", userid);
String target = (String) session.getAttribute("target");
if (target == null) {
- response.sendRedirect("/admins/main");
+ res.sendRedirect("/admins/main");
} else {
session.removeAttribute("target");
- response.sendRedirect(target);
+ res.sendRedirect(target);
}
} else {
/* account lock count +1 */
- User admin = userLoginHistory.get(userid);
- if (admin == null) {
- User newAdmin = new User();
- newAdmin.setUserId(userid);
- admin = userLoginHistory.putIfAbsent(userid, newAdmin);
- if (admin == null) {
- admin = newAdmin;
- }
- }
- admin.setLoginFailedCount(admin.getLoginFailedCount() + 1);
- admin.setLastLoginFailedTime(new Date());
-
+ incrementAccountLockNum(userid);
session.setAttribute("authNMsg", "msg.authentication.fail");
- doGet(request, response) ;
+ doGet(req, res) ;
}
}
+ protected void incrementAccountLockNum(String userid) {
+ User admin = getUser(userid);
+ admin.setLoginFailedCount(admin.getLoginFailedCount() + 1);
+ admin.setLastLoginFailedTime(new Date());
+ }
+
+ protected void resetAccountLock(String userid) {
+ User admin = getUser(userid);
+ admin.setLoginFailedCount(0);
+ admin.setLastLoginFailedTime(null);
+ }
+
protected boolean isAccountLocked(String userid) {
User admin = userLoginHistory.get(userid);
return (admin != null
@@ -150,16 +133,16 @@ protected boolean isAccountLocked(String userid) {
.getAccountLockTime()));
}
- protected boolean authUser(String username, String password) {
+ protected boolean authUser(String uid, String password) {
- if (username == null || password == null) {
+ if (uid == null || password == null) {
return false;
}
ExprNode filter = null;
EntryFilteringCursor cursor = null;
try {
- filter = FilterParser.parse("(&(uid=" + ESAPI.encoder().encodeForLDAP(username.trim())
- + ")(userPassword=" + ESAPI.encoder().encodeForLDAP(password.trim()) + "))");
+ filter = FilterParser.parse("(&(uid=" + encodeForLDAP(uid.trim())
+ + ")(userPassword=" + encodeForLDAP(password.trim()) + "))");
cursor = EmbeddedADS.getAdminSession().search(new LdapDN("ou=people,dc=t246osslab,dc=org"),
SearchScope.SUBTREE, filter, AliasDerefMode.NEVER_DEREF_ALIASES, null);
if (cursor.available()) {
@@ -178,4 +161,18 @@ protected boolean authUser(String username, String password) {
}
return false;
}
+
+ protected User getUser(String userid) {
+ User admin = userLoginHistory.get(userid);
+ if (admin == null) {
+ User newAdmin = new User();
+ newAdmin.setUserId(userid);
+ admin = userLoginHistory.putIfAbsent(userid, newAdmin);
+ if (admin == null) {
+ admin = newAdmin;
+ }
+ }
+ return admin;
+ }
+
}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLogoutServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLogoutServlet.java
index d594ee35..5e98ff10 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLogoutServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/DefaultLogoutServlet.java
@@ -4,14 +4,13 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/logout" })
-public class DefaultLogoutServlet extends HttpServlet {
+public class DefaultLogoutServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/ExitServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/ExitServlet.java
index c872e1b6..b1e08859 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/ExitServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/ExitServlet.java
@@ -4,18 +4,12 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/exit" })
-public class ExitServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(ExitServlet.class);
+public class ExitServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/PingServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/PingServlet.java
index 2d0e407b..c58066ea 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/PingServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/PingServlet.java
@@ -5,20 +5,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.t246osslab.easybuggy.core.utils.Closer;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ping" })
-public class PingServlet extends HttpServlet {
+public class PingServlet extends AbstractServlet {
- private static final Logger log = LoggerFactory.getLogger(PingServlet.class);
-
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/core/servlets/TestServlet.java b/src/main/java/org/t246osslab/easybuggy/core/servlets/TestServlet.java
index 649f0b15..311d0852 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/servlets/TestServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/servlets/TestServlet.java
@@ -4,19 +4,16 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/test" })
-public class TestServlet extends HttpServlet {
+public class TestServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
- HTTPResponseCreator.createSimpleResponse(req, res, "Test", "Test!!");
+ responseToClient(req, res, "Test", "Test!!");
}
}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/utils/EmailUtils.java b/src/main/java/org/t246osslab/easybuggy/core/utils/EmailUtils.java
index 12e42032..0bed4040 100644
--- a/src/main/java/org/t246osslab/easybuggy/core/utils/EmailUtils.java
+++ b/src/main/java/org/t246osslab/easybuggy/core/utils/EmailUtils.java
@@ -1,5 +1,5 @@
package org.t246osslab.easybuggy.core.utils;
-
+
import java.io.File;
import java.io.IOException;
import java.util.Date;
@@ -13,6 +13,7 @@
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
+import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
@@ -27,7 +28,7 @@
*
*/
public class EmailUtils {
-
+
private static final Logger log = LoggerFactory.getLogger(EmailUtils.class);
// squid:S1118: Utility classes should not have public constructors
@@ -35,6 +36,9 @@ private EmailUtils() {
throw new IllegalAccessError("Utility class");
}
+ /**
+ * Check if it is ready to send E-mail.
+ */
public static boolean isReadyToSendEmail() {
return !(StringUtils.isBlank(ApplicationUtils.getSmtpHost())
|| StringUtils.isBlank(ApplicationUtils.getSmtpPort())
@@ -43,6 +47,10 @@ public static boolean isReadyToSendEmail() {
/**
* Sends an e-mail message from a SMTP host with a list of attached files.
+ *
+ * @param subject Mail subject
+ * @param message Mail content
+ * @param attachedFiles Attached files
*/
public static void sendEmailWithAttachment(String subject, String message, List attachedFiles)
throws MessagingException {
@@ -101,4 +109,22 @@ public PasswordAuthentication getPasswordAuthentication() {
// sends the e-mail
Transport.send(msg);
}
+
+
+ /**
+ * Validate the given string as E-mail address.
+ *
+ * @param mailAddress Mail address
+ */
+ public static boolean isValidEmailAddress(String mailAddress) {
+ boolean result = true;
+ try {
+ InternetAddress emailAddr = new InternetAddress(mailAddress);
+ emailAddr.validate();
+ } catch (AddressException e) {
+ log.debug("Mail address is invalid: " + mailAddress, e);
+ result = false;
+ }
+ return result;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/org/t246osslab/easybuggy/core/utils/HTTPResponseCreator.java b/src/main/java/org/t246osslab/easybuggy/core/utils/HTTPResponseCreator.java
deleted file mode 100644
index e9be638c..00000000
--- a/src/main/java/org/t246osslab/easybuggy/core/utils/HTTPResponseCreator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.t246osslab.easybuggy.core.utils;
-
-import java.io.PrintWriter;
-import java.util.Locale;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utility class to create a HTTP response.
- */
-public final class HTTPResponseCreator {
-
- private static final Logger log = LoggerFactory.getLogger(HTTPResponseCreator.class);
-
- // squid:S1118: Utility classes should not have public constructors
- private HTTPResponseCreator() {
- throw new IllegalAccessError("Utility class");
- }
-
- /**
- * Create a simple HTTP response.
- *
- * @param req HTTP servlet request.
- * @param res HTTP servlet response.
- * @param htmlTitle Title of HTML page.
- * @param htmlBody Body of HTML page.
- */
- public static void createSimpleResponse(HttpServletRequest req, HttpServletResponse res, String htmlTitle, String htmlBody) {
- PrintWriter writer = null;
- HttpSession session = req.getSession();
- Object userid = session.getAttribute("userid");
- Locale locale = req.getLocale();
- try {
- writer = res.getWriter();
- writer.write("");
- writer.write("");
- if (htmlTitle != null) {
- writer.write("" + htmlTitle + " ");
- }
- writer.write(" ");
- writer.write(" ");
- writer.write(" ");
- writer.write("");
- writer.write("");
- writer.write("");
- writer.write("");
-
- writer.write("");
- writer.write("");
- writer.write("");
- writer.write("");
- writer.write("");
- writer.write(" ");
- if (htmlTitle != null) {
- writer.write(htmlTitle);
- }
- writer.write(" ");
- writer.write(" ");
- if (userid != null && req.getServletPath().startsWith("/admins")) {
- writer.write("");
- writer.write(MessageUtils.getMsg("label.login.user.id", locale) + ": " + userid);
- writer.write(" ");
- writer.write("" + MessageUtils.getMsg("label.logout", locale) + " ");
- writer.write(" ");
- } else {
- writer.write("");
- writer.write("" + MessageUtils.getMsg("label.go.to.main", locale) + " ");
- writer.write(" ");
- }
- writer.write(" ");
- writer.write("
");
- writer.write(" ");
- writer.write(htmlBody);
- writer.write("");
- writer.write("");
-
- } catch (Exception e) {
- log.error("Exception occurs: ", e);
- } finally {
- Closer.close(writer);
- }
- }
-}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/utils/MessageUtils.java b/src/main/java/org/t246osslab/easybuggy/core/utils/MessageUtils.java
deleted file mode 100644
index 483448c2..00000000
--- a/src/main/java/org/t246osslab/easybuggy/core/utils/MessageUtils.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.t246osslab.easybuggy.core.utils;
-
-import java.text.MessageFormat;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utility class to provide message properties.
- */
-public final class MessageUtils {
-
- private static final Logger log = LoggerFactory.getLogger(MessageUtils.class);
-
- // squid:S1118: Utility classes should not have public constructors
- private MessageUtils() {
- throw new IllegalAccessError("Utility class");
- }
-
- /**
- * Return a message for a given property key.
- *
- * @return A message for a given property key
- */
- public static String getMsg(String propertyKey, Locale locale) {
- return getMsg(propertyKey, (Object[]) null, locale);
- }
-
- /**
- * Return an information message for a given property key.
- *
- * @return An information message for a given property key
- */
- public static String getInfoMsg(String propertyKey, Locale locale) {
- return getInfoMsg(propertyKey, (Object[]) null, locale);
- }
-
- /**
- * Return an error message for a given property key.
- *
- * @return An error message for a given property key
- */
- public static String getErrMsg(String propertyKey, Locale locale) {
- return getErrMsg(propertyKey, (Object[]) null, locale);
- }
-
- /**
- * Return a message for a given property key, replaced with placeholders.
- *
- * @return A message for a given property key, replaced with placeholders
- */
- public static String getMsg(String propertyKey, Object[] placeholders, Locale locale) {
- String propertyValue = null;
- try {
- propertyValue = ResourceBundle.getBundle("messages", locale).getString(propertyKey);
- if (placeholders != null) {
- propertyValue = MessageFormat.format(propertyValue, placeholders);
- }
- } catch (Exception e) {
- log.error("Exception occurs: ", e);
- }
- return propertyValue;
- }
-
- /**
- * Return an information message for a given property key, replaced with placeholders.
- *
- * @return An information message for a given property key, replaced with placeholders
- */
- public static String getInfoMsg(String propertyKey, Object[] placeholders, Locale locale) {
- return " "
- + getMsg(propertyKey, placeholders, locale) + "
";
- }
-
- /**
- * Return an error message for a given property key, replaced with placeholders.
- *
- * @return An error message for a given property key, replaced with placeholders
- */
- public static String getErrMsg(String propertyKey, Object[] placeholders, Locale locale) {
- return " "
- + getMsg(propertyKey, placeholders, locale) + "
";
- }
-}
diff --git a/src/main/java/org/t246osslab/easybuggy/core/utils/MultiPartFileUtils.java b/src/main/java/org/t246osslab/easybuggy/core/utils/MultiPartFileUtils.java
new file mode 100644
index 00000000..a47d2869
--- /dev/null
+++ b/src/main/java/org/t246osslab/easybuggy/core/utils/MultiPartFileUtils.java
@@ -0,0 +1,64 @@
+package org.t246osslab.easybuggy.core.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.Part;
+import java.io.*;
+
+/**
+ * Utility class to handle multi part files.
+ */
+public final class MultiPartFileUtils {
+
+ private static final Logger log = LoggerFactory.getLogger(MultiPartFileUtils.class);
+
+ // squid:S1118: Utility classes should not have public constructors
+ private MultiPartFileUtils() {
+ throw new IllegalAccessError("Utility class");
+ }
+
+ /**
+ * Write uploaded file to the given path.
+ *
+ * @param part A part or form item that was received within a multipart/form-data
POST request.
+ * @param savePath Path to save an uploaded file.
+ * @param fileName The uploaded file name.
+ */
+ public static boolean writeFile(Part part, String savePath, String fileName) throws IOException {
+ boolean isConverted = false;
+ OutputStream out = null;
+ InputStream in = null;
+ try {
+ out = new FileOutputStream(savePath + File.separator + fileName);
+ in = part.getInputStream();
+ int read;
+ final byte[] bytes = new byte[1024];
+ while ((read = in.read(bytes)) != -1) {
+ out.write(bytes, 0, read);
+ }
+ } catch (FileNotFoundException e) {
+ // Ignore because file already exists (converted and Windows locked the file)
+ log.debug("Exception occurs: ", e);
+ isConverted = true;
+ } finally {
+ Closer.close(out, in);
+ }
+ return isConverted;
+ }
+
+
+ /**
+ * Retrieves file name of a upload part from its HTTP header
+ *
+ * @param part A part or form item that was received within a multipart/form-data
POST request.
+ */
+ public static String getFileName(final Part part) {
+ for (String content : part.getHeader("content-disposition").split(";")) {
+ if (content.trim().startsWith("filename")) {
+ return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/AssertionErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/AssertionErrorServlet.java
index aca935b4..a13ab18c 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/AssertionErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/AssertionErrorServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/asserr" })
-public class AssertionErrorServlet extends HttpServlet {
+public class AssertionErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/ExceptionInInitializerErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/ExceptionInInitializerErrorServlet.java
index 2ce09a49..e276f6d1 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/ExceptionInInitializerErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/ExceptionInInitializerErrorServlet.java
@@ -5,18 +5,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/eie" })
-public class ExceptionInInitializerErrorServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(ExceptionInInitializerErrorServlet.class);
+public class ExceptionInInitializerErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/FactoryConfigurationErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/FactoryConfigurationErrorServlet.java
index 4a9a613b..9d82a160 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/FactoryConfigurationErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/FactoryConfigurationErrorServlet.java
@@ -4,14 +4,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.SAXParserFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/fce" })
-public class FactoryConfigurationErrorServlet extends HttpServlet {
+public class FactoryConfigurationErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/GenericSignatureFormatErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/GenericSignatureFormatErrorServlet.java
index be27aa07..9fbd569e 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/GenericSignatureFormatErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/GenericSignatureFormatErrorServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/gsfe" })
-public class GenericSignatureFormatErrorServlet extends HttpServlet {
+public class GenericSignatureFormatErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/NoClassDefFoundErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/NoClassDefFoundErrorServlet.java
index fa32c223..a8735828 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/NoClassDefFoundErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/NoClassDefFoundErrorServlet.java
@@ -4,15 +4,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
import org.t246osslab.easybuggy.core.utils.DeleteClassWhileMavenBuild;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ncdfe" })
-public class NoClassDefFoundErrorServlet extends HttpServlet {
+public class NoClassDefFoundErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet.java
index fc6099ab..9d12664f 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome" })
-public class OutOfMemoryErrorServlet extends HttpServlet {
+public class OutOfMemoryErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet2.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet2.java
index 11493be8..a9dda74e 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet2.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet2.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome2" })
-public class OutOfMemoryErrorServlet2 extends HttpServlet {
+public class OutOfMemoryErrorServlet2 extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet3.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet3.java
index a8550493..7ac79718 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet3.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet3.java
@@ -4,25 +4,21 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome3" })
-public class OutOfMemoryErrorServlet3 extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(OutOfMemoryErrorServlet3.class);
+public class OutOfMemoryErrorServlet3 extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
while (true) {
new Thread() {
- @Override
+ @Override
public void run() {
try {
Thread.sleep(10000);
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet4.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet4.java
index 106aa205..ea09509c 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet4.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet4.java
@@ -6,13 +6,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome4" })
-public class OutOfMemoryErrorServlet4 extends HttpServlet {
+public class OutOfMemoryErrorServlet4 extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet5.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet5.java
index 62d09280..adfa90bb 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet5.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet5.java
@@ -6,18 +6,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome5" })
-public class OutOfMemoryErrorServlet5 extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(OutOfMemoryErrorServlet5.class);
+public class OutOfMemoryErrorServlet5 extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet6.java b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet6.java
index a157749c..4a27784d 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet6.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/OutOfMemoryErrorServlet6.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/oome6" })
-public class OutOfMemoryErrorServlet6 extends HttpServlet {
+public class OutOfMemoryErrorServlet6 extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/StackOverflowErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/StackOverflowErrorServlet.java
index 03dcffd0..1dd60ec3 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/StackOverflowErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/StackOverflowErrorServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@WebServlet(urlPatterns = { "/sofe" })
@SuppressWarnings("serial")
-public class StackOverflowErrorServlet extends HttpServlet {
+public class StackOverflowErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/TransformerFactoryConfigurationErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/TransformerFactoryConfigurationErrorServlet.java
index b8f63660..05d3872c 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/TransformerFactoryConfigurationErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/TransformerFactoryConfigurationErrorServlet.java
@@ -4,14 +4,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/tfce" })
-public class TransformerFactoryConfigurationErrorServlet extends HttpServlet {
+public class TransformerFactoryConfigurationErrorServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/errors/UnsatisfiedLinkErrorServlet.java b/src/main/java/org/t246osslab/easybuggy/errors/UnsatisfiedLinkErrorServlet.java
index 2da58f11..950531b3 100644
--- a/src/main/java/org/t246osslab/easybuggy/errors/UnsatisfiedLinkErrorServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/errors/UnsatisfiedLinkErrorServlet.java
@@ -6,16 +6,17 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
/**
* This servlet causes a JNI error.
*/
@WebServlet(urlPatterns = { "/jnicall" })
@SuppressWarnings("serial")
-public class UnsatisfiedLinkErrorServlet extends HttpServlet {
+public class UnsatisfiedLinkErrorServlet extends AbstractServlet {
private static native NetworkInterface getByName0(String name) throws SocketException;
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ArithmeticExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ArithmeticExceptionServlet.java
index 44845a57..c64107a5 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ArithmeticExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ArithmeticExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ae" })
-public class ArithmeticExceptionServlet extends HttpServlet {
+public class ArithmeticExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayIndexOutOfBoundsExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayIndexOutOfBoundsExceptionServlet.java
index 24ec8278..1d45d440 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayIndexOutOfBoundsExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayIndexOutOfBoundsExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/aioobe" })
-public class ArrayIndexOutOfBoundsExceptionServlet extends HttpServlet {
+public class ArrayIndexOutOfBoundsExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayStoreExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayStoreExceptionServlet.java
index 7e40b446..485794ce 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayStoreExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ArrayStoreExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ase" })
-public class ArrayStoreExceptionServlet extends HttpServlet {
+public class ArrayStoreExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/BufferOverflowExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/BufferOverflowExceptionServlet.java
index 2faf1cde..165c819a 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/BufferOverflowExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/BufferOverflowExceptionServlet.java
@@ -10,19 +10,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
import org.t246osslab.easybuggy.core.utils.Closer;
@SuppressWarnings("serial")
-@WebServlet(urlPatterns = { "/boe" })
-public class BufferOverflowExceptionServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(BufferOverflowExceptionServlet.class);
+@WebServlet(urlPatterns = {"/boe"})
+public class BufferOverflowExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/BufferUnderflowExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/BufferUnderflowExceptionServlet.java
index c04afad6..aec58a1a 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/BufferUnderflowExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/BufferUnderflowExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/bue" })
-public class BufferUnderflowExceptionServlet extends HttpServlet {
+public class BufferUnderflowExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/CannotRedoExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/CannotRedoExceptionServlet.java
index ffb27040..4d912fb7 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/CannotRedoExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/CannotRedoExceptionServlet.java
@@ -4,14 +4,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.undo.UndoManager;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/cre" })
-public class CannotRedoExceptionServlet extends HttpServlet {
+public class CannotRedoExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/CannotUndoExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/CannotUndoExceptionServlet.java
index 1301f0bc..84a9ad78 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/CannotUndoExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/CannotUndoExceptionServlet.java
@@ -4,14 +4,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.undo.UndoManager;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/cue" })
-public class CannotUndoExceptionServlet extends HttpServlet {
+public class CannotUndoExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ClassCastExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ClassCastExceptionServlet.java
index ec196ced..69195a07 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ClassCastExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ClassCastExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/cce" })
-public class ClassCastExceptionServlet extends HttpServlet {
+public class ClassCastExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ConcurrentModificationExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ConcurrentModificationExceptionServlet.java
index d7688404..ab427fe9 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ConcurrentModificationExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ConcurrentModificationExceptionServlet.java
@@ -7,13 +7,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/cme" })
-public class ConcurrentModificationExceptionServlet extends HttpServlet {
+public class ConcurrentModificationExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/EmptyStackExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/EmptyStackExceptionServlet.java
index 8e5aaed5..85a25f0b 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/EmptyStackExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/EmptyStackExceptionServlet.java
@@ -5,18 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ese" })
-public class EmptyStackExceptionServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(EmptyStackExceptionServlet.class);
+public class EmptyStackExceptionServlet extends AbstractServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalArgumentExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalArgumentExceptionServlet.java
index ecac63e6..a948fa6e 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalArgumentExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalArgumentExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/iae" })
-public class IllegalArgumentExceptionServlet extends HttpServlet {
+public class IllegalArgumentExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalMonitorStateExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalMonitorStateExceptionServlet.java
index 4d259cc2..fae9fb5d 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalMonitorStateExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalMonitorStateExceptionServlet.java
@@ -4,18 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/imse" })
-public class IllegalMonitorStateExceptionServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(IllegalMonitorStateExceptionServlet.class);
+public class IllegalMonitorStateExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalPathStateExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalPathStateExceptionServlet.java
index 4bf14b14..2eb483d1 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalPathStateExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalPathStateExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ipse" })
-public class IllegalPathStateExceptionServlet extends HttpServlet {
+public class IllegalPathStateExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalStateExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalStateExceptionServlet.java
index add2a7fd..38ca3158 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalStateExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalStateExceptionServlet.java
@@ -8,13 +8,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/iase" })
-public class IllegalStateExceptionServlet extends HttpServlet {
+public class IllegalStateExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalThreadStateExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalThreadStateExceptionServlet.java
index 7277faac..3a4cdd62 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalThreadStateExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IllegalThreadStateExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/itse" })
-public class IllegalThreadStateExceptionServlet extends HttpServlet {
+public class IllegalThreadStateExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/ImagingOpExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/ImagingOpExceptionServlet.java
index acebfd9c..3d2dff40 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/ImagingOpExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/ImagingOpExceptionServlet.java
@@ -7,13 +7,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/imoe" })
-public class ImagingOpExceptionServlet extends HttpServlet {
+public class ImagingOpExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/IndexOutOfBoundsExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/IndexOutOfBoundsExceptionServlet.java
index 195e693e..2b3fc5db 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/IndexOutOfBoundsExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/IndexOutOfBoundsExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ioobe" })
-public class IndexOutOfBoundsExceptionServlet extends HttpServlet {
+public class IndexOutOfBoundsExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/InputMismatchExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/InputMismatchExceptionServlet.java
index 5812ef58..e4ec616c 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/InputMismatchExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/InputMismatchExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ime" })
-public class InputMismatchExceptionServlet extends HttpServlet {
+public class InputMismatchExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/MalformedParameterizedTypeExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/MalformedParameterizedTypeExceptionServlet.java
index 11b6d38d..ae70ca17 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/MalformedParameterizedTypeExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/MalformedParameterizedTypeExceptionServlet.java
@@ -6,15 +6,16 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/mpte" })
-public class MalformedParameterizedTypeExceptionServlet extends HttpServlet {
+public class MalformedParameterizedTypeExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/MissingResourceExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/MissingResourceExceptionServlet.java
index d09a1cf4..9868512f 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/MissingResourceExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/MissingResourceExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/mre" })
-public class MissingResourceExceptionServlet extends HttpServlet {
+public class MissingResourceExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/NegativeArraySizeExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/NegativeArraySizeExceptionServlet.java
index 7a2e1560..783964ab 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/NegativeArraySizeExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/NegativeArraySizeExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/nase" })
-public class NegativeArraySizeExceptionServlet extends HttpServlet {
+public class NegativeArraySizeExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/NoSuchElementExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/NoSuchElementExceptionServlet.java
index aa78b95c..21cfed56 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/NoSuchElementExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/NoSuchElementExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/nsee" })
-public class NoSuchElementExceptionServlet extends HttpServlet {
+public class NoSuchElementExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/NullPointerExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/NullPointerExceptionServlet.java
index e2fcfd3c..ffd1937a 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/NullPointerExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/NullPointerExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/npe" })
-public class NullPointerExceptionServlet extends HttpServlet {
+public class NullPointerExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/NumberFormatExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/NumberFormatExceptionServlet.java
index b493bd81..7ce3f452 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/NumberFormatExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/NumberFormatExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/nfe" })
-public class NumberFormatExceptionServlet extends HttpServlet {
+public class NumberFormatExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/SecurityExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/SecurityExceptionServlet.java
index bdd97514..051fb2cf 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/SecurityExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/SecurityExceptionServlet.java
@@ -4,13 +4,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/se" })
-public class SecurityExceptionServlet extends HttpServlet {
+public class SecurityExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedCharsetExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedCharsetExceptionServlet.java
index 2222b185..8e1a08b8 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedCharsetExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedCharsetExceptionServlet.java
@@ -5,13 +5,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/uce" })
-public class UnsupportedCharsetExceptionServlet extends HttpServlet {
+public class UnsupportedCharsetExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedOperationExceptionServlet.java b/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedOperationExceptionServlet.java
index f5e858a3..1797ebc3 100644
--- a/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedOperationExceptionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/exceptions/UnsupportedOperationExceptionServlet.java
@@ -7,13 +7,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/uoe" })
-public class UnsupportedOperationExceptionServlet extends HttpServlet {
+public class UnsupportedOperationExceptionServlet extends AbstractServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
diff --git a/src/main/java/org/t246osslab/easybuggy/performance/CreatingUnnecessaryObjectsServlet.java b/src/main/java/org/t246osslab/easybuggy/performance/CreatingUnnecessaryObjectsServlet.java
index 1dafc4f0..e4ca285c 100644
--- a/src/main/java/org/t246osslab/easybuggy/performance/CreatingUnnecessaryObjectsServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/performance/CreatingUnnecessaryObjectsServlet.java
@@ -5,21 +5,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.math.NumberUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/createobjects" })
-public class CreatingUnnecessaryObjectsServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(CreatingUnnecessaryObjectsServlet.class);
+public class CreatingUnnecessaryObjectsServlet extends AbstractServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
@@ -28,7 +22,7 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
int number = NumberUtils.toInt(strNumber, -1);
StringBuilder bodyHtml = new StringBuilder();
bodyHtml.append("");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.createobjects.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.createobjects.page", locale), bodyHtml.toString());
}
private Long calcSum1(int number) {
diff --git a/src/main/java/org/t246osslab/easybuggy/performance/SlowRegularExpressionServlet.java b/src/main/java/org/t246osslab/easybuggy/performance/SlowRegularExpressionServlet.java
index 05b2692c..bff753a5 100644
--- a/src/main/java/org/t246osslab/easybuggy/performance/SlowRegularExpressionServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/performance/SlowRegularExpressionServlet.java
@@ -8,21 +8,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/slowre" })
-public class SlowRegularExpressionServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(SlowRegularExpressionServlet.class);
+public class SlowRegularExpressionServlet extends AbstractServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
@@ -34,14 +28,14 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
StringBuilder bodyHtml = new StringBuilder();
bodyHtml.append("");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.slowregex.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.slowregex.page", locale), bodyHtml.toString());
} catch (Exception e) {
log.error("Exception occurs: ", e);
diff --git a/src/main/java/org/t246osslab/easybuggy/performance/StringPlusOperationServlet.java b/src/main/java/org/t246osslab/easybuggy/performance/StringPlusOperationServlet.java
index 0cae6bdc..40682487 100644
--- a/src/main/java/org/t246osslab/easybuggy/performance/StringPlusOperationServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/performance/StringPlusOperationServlet.java
@@ -7,22 +7,16 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.math.NumberUtils;
import org.owasp.esapi.ESAPI;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/strplusopr" })
-public class StringPlusOperationServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(StringPlusOperationServlet.class);
+public class StringPlusOperationServlet extends AbstractServlet {
private static final int MAX_LENGTH = 1000000;
private static final String[] ALL_NUMBERS = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
@@ -44,25 +38,25 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
StringBuilder bodyHtml = new StringBuilder();
bodyHtml.append("");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.strplusopr.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.strplusopr.page", locale), bodyHtml.toString());
} catch (Exception e) {
log.error("Exception occurs: ", e);
@@ -97,7 +90,7 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
private void appendCheckBox(String[] characters, Locale locale, StringBuilder bodyHtml, String[] allCharacters,
String label) {
- bodyHtml.append("" + MessageUtils.getMsg(label, locale) + "
");
+ bodyHtml.append("" + getMsg(label, locale) + "
");
bodyHtml.append("");
for (int i = 0; i < allCharacters.length; i++) {
bodyHtml.append(" 0) {
result = "
"
- + MessageUtils.getMsg("label.user.id", locale) + " "
- + MessageUtils.getMsg("label.name", locale) + " "
- + MessageUtils.getMsg("label.phone", locale) + " "
- + MessageUtils.getMsg("label.mail", locale) + " " + sb.toString() + "
";
+ + getMsg("label.user.id", locale) + ""
+ + getMsg("label.name", locale) + " "
+ + getMsg("label.phone", locale) + " "
+ + getMsg("label.mail", locale) + " " + sb.toString() + "";
}
} catch (Exception e) {
- result = MessageUtils.getErrMsg("msg.db.access.error.occur", locale);
+ result = getErrMsg("msg.db.access.error.occur", locale);
log.error("Exception occurs: ", e);
} finally {
/* A DB connection leaks because the following lines are commented out.
diff --git a/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet.java b/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet.java
index 7c696bb9..a1d03eea 100644
--- a/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet.java
@@ -8,20 +8,14 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/deadlock" })
-public class DeadlockServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(DeadlockServlet.class);
+public class DeadlockServlet extends AbstractServlet {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
@@ -42,7 +36,7 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] threadIds = bean.findDeadlockedThreads();
if (threadIds != null) {
- bodyHtml.append(MessageUtils.getMsg("msg.dead.lock.detected", locale));
+ bodyHtml.append(getMsg("msg.dead.lock.detected", locale));
bodyHtml.append(" ");
bodyHtml.append("");
ThreadInfo[] infos = bean.getThreadInfo(threadIds);
@@ -51,17 +45,15 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
}
bodyHtml.append("
");
} else {
- bodyHtml.append(MessageUtils.getMsg("msg.dead.lock.not.occur", locale));
+ bodyHtml.append(getMsg("msg.dead.lock.not.occur", locale));
bodyHtml.append(" ");
}
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.deadlock", locale));
+ bodyHtml.append(getInfoMsg("msg.note.deadlock", locale));
} catch (Exception e) {
log.error("Exception occurs: ", e);
- bodyHtml.append(
- MessageUtils.getErrMsg("msg.unknown.exception.occur", new String[] { e.getMessage() }, locale));
+ bodyHtml.append(getErrMsg("msg.unknown.exception.occur", new String[] { e.getMessage() }, locale));
} finally {
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.deadlock.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.deadlock.page", locale), bodyHtml.toString());
}
}
diff --git a/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet2.java b/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet2.java
index 4915f07d..f28116e3 100644
--- a/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet2.java
+++ b/src/main/java/org/t246osslab/easybuggy/troubles/DeadlockServlet2.java
@@ -12,23 +12,17 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.t246osslab.easybuggy.core.dao.DBClient;
import org.t246osslab.easybuggy.core.model.User;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
import org.t246osslab.easybuggy.core.utils.Closer;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/deadlock2" })
-public class DeadlockServlet2 extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(DeadlockServlet2.class);
+public class DeadlockServlet2 extends AbstractServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
@@ -62,11 +56,10 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
} catch (Exception e) {
log.error("Exception occurs: ", e);
bodyHtml.append(
- MessageUtils.getErrMsg("msg.unknown.exception.occur", new String[] { e.getMessage() }, locale));
+ getErrMsg("msg.unknown.exception.occur", new String[] { e.getMessage() }, locale));
bodyHtml.append(e.getLocalizedMessage());
} finally {
- HTTPResponseCreator.createSimpleResponse(req, res,
- MessageUtils.getMsg("title.xxe.page", locale), bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xxe.page", locale), bodyHtml.toString());
}
}
@@ -84,22 +77,22 @@ private void createHTMLUserTable(Locale locale, StringBuilder bodyHtml, ArrayLis
String updateResult) {
bodyHtml.append("");
- bodyHtml.append(MessageUtils.getMsg("msg.convert.grayscale", locale));
+ bodyHtml.append(getMsg("msg.convert.grayscale", locale));
bodyHtml.append(" ");
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getMsg("msg.select.upload.file", locale));
+ bodyHtml.append(getMsg("msg.select.upload.file", locale));
bodyHtml.append(" ");
- bodyHtml.append(" ");
+ bodyHtml.append(" ");
bodyHtml.append(" ");
if (req.getAttribute("errorMessage") != null) {
bodyHtml.append(req.getAttribute("errorMessage"));
}
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.unrestrictedextupload", locale));
+ bodyHtml.append(getInfoMsg("msg.note.unrestrictedextupload", locale));
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.unrestrictedextupload.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.unrestrictedextupload.page", locale), bodyHtml.toString());
}
@Override
@@ -75,21 +64,21 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
}
// Save the file
- Part filePart = null;
+ Part filePart;
try {
filePart = req.getPart("file");
} catch (Exception e) {
- req.setAttribute("errorMessage", MessageUtils.getErrMsg("msg.max.file.size.exceed", locale));
+ req.setAttribute("errorMessage", getErrMsg("msg.max.file.size.exceed", locale));
doGet(req, res);
return;
}
try {
- String fileName = getFileName(filePart);
+ String fileName = MultiPartFileUtils.getFileName(filePart);
if (StringUtils.isBlank(fileName)) {
doGet(req, res);
return;
}
- boolean isConverted = writeFile(savePath, filePart, fileName);
+ boolean isConverted = MultiPartFileUtils.writeFile(filePart, savePath, fileName);
if (!isConverted) {
isConverted = convert2GrayScale(new File(savePath + File.separator + fileName).getAbsolutePath());
@@ -97,54 +86,22 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
StringBuilder bodyHtml = new StringBuilder();
if (isConverted) {
- bodyHtml.append(MessageUtils.getMsg("msg.convert.grayscale.complete", locale));
+ bodyHtml.append(getMsg("msg.convert.grayscale.complete", locale));
bodyHtml.append(" ");
bodyHtml.append(" ");
bodyHtml.append(" ");
} else {
- bodyHtml.append(MessageUtils.getErrMsg("msg.convert.grayscale.fail", locale));
+ bodyHtml.append(getErrMsg("msg.convert.grayscale.fail", locale));
}
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.unrestrictedextupload.page", locale),
- bodyHtml.toString());
+ + getMsg("label.history.back", locale) + "\">");
+ responseToClient(req, res, getMsg("title.unrestrictedextupload.page", locale), bodyHtml.toString());
} catch (Exception e) {
log.error("Exception occurs: ", e);
}
}
- private boolean writeFile(String savePath, Part filePart, String fileName) throws IOException {
- boolean isConverted = false;
- OutputStream out = null;
- InputStream in = null;
- try {
- out = new FileOutputStream(savePath + File.separator + fileName);
- in = filePart.getInputStream();
- int read = 0;
- final byte[] bytes = new byte[1024];
- while ((read = in.read(bytes)) != -1) {
- out.write(bytes, 0, read);
- }
- } catch (FileNotFoundException e) {
- // Ignore because file already exists (converted and Windows locked the file)
- isConverted = true;
- } finally {
- Closer.close(out, in);
- }
- return isConverted;
- }
-
- // Get file name from content-disposition filename
- private String getFileName(final Part part) {
- for (String content : part.getHeader("content-disposition").split(";")) {
- if (content.trim().startsWith("filename")) {
- return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
- }
- }
- return null;
- }
-
// Convert color image into gray scale image.
private boolean convert2GrayScale(String fileName) throws IOException {
boolean isConverted = false;
diff --git a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/UnrestrictedSizeUploadServlet.java b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/UnrestrictedSizeUploadServlet.java
index 04651405..86e423cb 100644
--- a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/UnrestrictedSizeUploadServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/UnrestrictedSizeUploadServlet.java
@@ -3,11 +3,7 @@
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.util.Arrays;
import java.util.Locale;
@@ -15,49 +11,43 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.Closer;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
+import org.t246osslab.easybuggy.core.utils.MultiPartFileUtils;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/ursupload" })
@MultipartConfig
-public class UnrestrictedSizeUploadServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(UnrestrictedSizeUploadServlet.class);
+public class UnrestrictedSizeUploadServlet extends AbstractServlet {
// Name of the directory where uploaded files is saved
private static final String SAVE_DIR = "uploadFiles";
-
@Override
+
+ @Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Locale locale = req.getLocale();
StringBuilder bodyHtml = new StringBuilder();
bodyHtml.append("");
- bodyHtml.append(MessageUtils.getMsg("msg.reverse.color", locale));
+ bodyHtml.append(getMsg("msg.reverse.color", locale));
bodyHtml.append(" ");
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getMsg("msg.select.upload.file", locale));
+ bodyHtml.append(getMsg("msg.select.upload.file", locale));
bodyHtml.append(" ");
- bodyHtml.append(" ");
+ bodyHtml.append(" ");
bodyHtml.append(" ");
if (req.getAttribute("errorMessage") != null) {
bodyHtml.append(req.getAttribute("errorMessage"));
}
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.unrestrictedsizeupload", locale));
+ bodyHtml.append(getInfoMsg("msg.note.unrestrictedsizeupload", locale));
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.unrestrictedsizeupload.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.unrestrictedsizeupload.page", locale), bodyHtml.toString());
}
@Override
@@ -78,16 +68,16 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
try {
// Save the file
final Part filePart = req.getPart("file");
- String fileName = getFileName(filePart);
+ String fileName = MultiPartFileUtils.getFileName(filePart);
if (StringUtils.isBlank(fileName)) {
doGet(req, res);
return;
} else if (!isImageFile(fileName)) {
- req.setAttribute("errorMessage", MessageUtils.getErrMsg("msg.not.image.file", locale));
+ req.setAttribute("errorMessage", getErrMsg("msg.not.image.file", locale));
doGet(req, res);
return;
}
- boolean isConverted = writeFile(savePath, filePart, fileName);
+ boolean isConverted = MultiPartFileUtils.writeFile(filePart, savePath, fileName);
// Reverse the color of the upload image
if (!isConverted) {
@@ -96,59 +86,27 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
StringBuilder bodyHtml = new StringBuilder();
if (isConverted) {
- bodyHtml.append(MessageUtils.getMsg("msg.reverse.color.complete", locale));
+ bodyHtml.append(getMsg("msg.reverse.color.complete", locale));
bodyHtml.append(" ");
bodyHtml.append(" ");
bodyHtml.append(" ");
} else {
- bodyHtml.append(MessageUtils.getErrMsg("msg.reverse.color.fail", locale));
+ bodyHtml.append(getErrMsg("msg.reverse.color.fail", locale));
}
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.unrestrictedsizeupload.page", locale),
- bodyHtml.toString());
+ + getMsg("label.history.back", locale) + "\">");
+ responseToClient(req, res, getMsg("title.unrestrictedsizeupload.page", locale), bodyHtml.toString());
} catch (Exception e) {
log.error("Exception occurs: ", e);
}
}
- private boolean writeFile(String savePath, final Part filePart, String fileName) throws IOException {
- boolean isConverted = false;
- OutputStream out = null;
- InputStream in = null;
- try {
- out = new FileOutputStream(savePath + File.separator + fileName);
- in = filePart.getInputStream();
- int read = 0;
- final byte[] bytes = new byte[1024];
- while ((read = in.read(bytes)) != -1) {
- out.write(bytes, 0, read);
- }
- } catch (FileNotFoundException e) {
- // Ignore because file already exists (converted)
- isConverted = true;
- } finally {
- Closer.close(out, in);
- }
- return isConverted;
- }
-
private boolean isImageFile(String fileName) {
return Arrays.asList("png", "gif", "jpg", "jpeg", "tif", "tiff", "bmp").contains(
FilenameUtils.getExtension(fileName));
}
- // Get file name from content-disposition filename
- private String getFileName(final Part part) {
- for (String content : part.getHeader("content-disposition").split(";")) {
- if (content.trim().startsWith("filename")) {
- return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
- }
- }
- return null;
- }
-
// Reverse the color of the image file
private boolean reverseColor(String fileName) throws IOException {
boolean isConverted = false;
diff --git a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/VerboseErrorMessageServlet.java b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/VerboseErrorMessageServlet.java
index 434b522f..4b513202 100644
--- a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/VerboseErrorMessageServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/VerboseErrorMessageServlet.java
@@ -16,8 +16,6 @@
import org.apache.directory.shared.ldap.message.AliasDerefMode;
import org.apache.directory.shared.ldap.name.LdapDN;
import org.owasp.esapi.ESAPI;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.t246osslab.easybuggy.core.dao.EmbeddedADS;
import org.t246osslab.easybuggy.core.model.User;
import org.t246osslab.easybuggy.core.servlets.DefaultLoginServlet;
@@ -26,8 +24,6 @@
@WebServlet(urlPatterns = { "/verbosemsg/login" })
public class VerboseErrorMessageServlet extends DefaultLoginServlet {
- private static final Logger log = LoggerFactory.getLogger(VerboseErrorMessageServlet.class);
-
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
req.setAttribute("login.page.note", "msg.note.verbose.errror.message");
@@ -51,18 +47,8 @@ public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOExc
session.setAttribute("authNMsg", "msg.low.alphnum8");
doGet(req, res);
} else if (authUser(userid, password)) {
- /* Reset account lock */
- User admin = userLoginHistory.get(userid);
- if (admin == null) {
- User newAdmin = new User();
- newAdmin.setUserId(userid);
- admin = userLoginHistory.putIfAbsent(userid, newAdmin);
- if (admin == null) {
- admin = newAdmin;
- }
- }
- admin.setLoginFailedCount(0);
- admin.setLastLoginFailedTime(null);
+ /* Reset account lock count */
+ resetAccountLock(userid);
session.setAttribute("authNMsg", "authenticated");
session.setAttribute("userid", userid);
@@ -76,17 +62,7 @@ public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOExc
}
} else {
/* account lock count +1 */
- User admin = userLoginHistory.get(userid);
- if (admin == null) {
- User newAdmin = new User();
- newAdmin.setUserId(userid);
- admin = userLoginHistory.putIfAbsent(userid, newAdmin);
- if (admin == null) {
- admin = newAdmin;
- }
- }
- admin.setLoginFailedCount(admin.getLoginFailedCount() + 1);
- admin.setLastLoginFailedTime(new Date());
+ incrementAccountLockNum(userid);
session.setAttribute("authNMsg", "msg.password.not.match");
doGet(req, res);
@@ -95,10 +71,10 @@ public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOExc
private boolean isExistUser(String username) {
- ExprNode filter = null;
+ ExprNode filter;
EntryFilteringCursor cursor = null;
try {
- filter = FilterParser.parse("(uid=" + ESAPI.encoder().encodeForLDAP(username.trim()) + ")");
+ filter = FilterParser.parse("(uid=" + encodeForLDAP(username.trim()) + ")");
cursor = EmbeddedADS.getAdminSession().search(new LdapDN("ou=people,dc=t246osslab,dc=org"),
SearchScope.SUBTREE, filter, AliasDerefMode.NEVER_DEREF_ALIASES, null);
if (cursor.available()) {
diff --git a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XEEandXXEServlet.java b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XEEandXXEServlet.java
index 1a8c2ffc..aca2ca09 100644
--- a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XEEandXXEServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XEEandXXEServlet.java
@@ -1,11 +1,7 @@
package org.t246osslab.easybuggy.vulnerabilities;
import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -15,7 +11,6 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@@ -26,13 +21,10 @@
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
-import org.owasp.esapi.ESAPI;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.t246osslab.easybuggy.core.dao.DBClient;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
import org.t246osslab.easybuggy.core.utils.Closer;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.utils.MultiPartFileUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
@@ -41,9 +33,7 @@
@WebServlet(urlPatterns = { "/xee", "/xxe" })
// 2MB, 10MB, 50MB
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, maxFileSize = 1024 * 1024 * 10, maxRequestSize = 1024 * 1024 * 50)
-public class XEEandXXEServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(XEEandXXEServlet.class);
+public class XEEandXXEServlet extends AbstractServlet {
// Name of the directory where uploaded files is saved
private static final String SAVE_DIR = "uploadFiles";
@@ -58,81 +48,73 @@ protected void doGet(HttpServletRequest req, HttpServletResponse res) throws Ser
StringBuilder bodyHtml = new StringBuilder();
if ("/xee".equals(req.getServletPath())) {
bodyHtml.append("");
- bodyHtml.append(MessageUtils.getMsg("msg.add.users.by.xml", locale));
+ bodyHtml.append(getMsg("msg.add.users.by.xml", locale));
} else {
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getMsg("msg.update.users.by.xml", locale));
+ bodyHtml.append(getMsg("msg.update.users.by.xml", locale));
}
bodyHtml.append(" ");
bodyHtml.append("");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
bodyHtml.append(TAB);
- bodyHtml.append(ESAPI.encoder().encodeForHTML(
- ""));
+ bodyHtml.append(encodeForHTML(""));
bodyHtml.append(" ");
bodyHtml.append(TAB);
- bodyHtml.append(ESAPI.encoder().encodeForHTML(
- ""));
+ bodyHtml.append(encodeForHTML(""));
bodyHtml.append(" ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML(" "));
+ bodyHtml.append(encodeForHTML(" "));
bodyHtml.append(" ");
bodyHtml.append(" ");
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getMsg("msg.select.upload.file", locale));
+ bodyHtml.append(getMsg("msg.select.upload.file", locale));
bodyHtml.append(" ");
- bodyHtml.append(" ");
+ bodyHtml.append(" ");
bodyHtml.append(" ");
if (req.getAttribute("errorMessage") != null) {
bodyHtml.append(req.getAttribute("errorMessage"));
}
if ("/xee".equals(req.getServletPath())) {
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.xee", locale));
+ bodyHtml.append(getInfoMsg("msg.note.xee", locale));
bodyHtml.append("");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("]>") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("")
- + " ");
- bodyHtml.append(TAB + ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(TAB + ESAPI.encoder().encodeForHTML(" ") + " ");
- bodyHtml.append(TAB + ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(TAB + TAB + ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(TAB + TAB + TAB + ESAPI.encoder().encodeForHTML("&x100; ") + " ");
- bodyHtml.append(TAB + TAB + ESAPI.encoder().encodeForHTML(" ") + " ");
- bodyHtml.append(TAB + ESAPI.encoder().encodeForHTML(" ") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML(" ") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("]>") + " ");
+ bodyHtml.append(encodeForHTML("")+ " ");
+ bodyHtml.append(TAB + encodeForHTML("") + " ");
+ bodyHtml.append(TAB + encodeForHTML(" ") + " ");
+ bodyHtml.append(TAB + encodeForHTML("") + " ");
+ bodyHtml.append(TAB + TAB + encodeForHTML("") + " ");
+ bodyHtml.append(TAB + TAB + TAB + encodeForHTML("&x100; ") + " ");
+ bodyHtml.append(TAB + TAB + encodeForHTML(" ") + " ");
+ bodyHtml.append(TAB + encodeForHTML(" ") + " ");
+ bodyHtml.append(encodeForHTML(" ") + " ");
bodyHtml.append(" ");
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.xee.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xee.page", locale), bodyHtml.toString());
} else {
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.xxe.step1", locale));
+ bodyHtml.append(getInfoMsg("msg.note.xxe.step1", locale));
bodyHtml.append("");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(
- ESAPI.encoder().encodeForHTML("\">") + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("%p2;"));
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("\">") + " ");
+ bodyHtml.append(encodeForHTML("%p2;"));
bodyHtml.append(" ");
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.xxe.step2", locale));
+ bodyHtml.append(getInfoMsg("msg.note.xxe.step2", locale));
bodyHtml.append("");
- bodyHtml.append(ESAPI.encoder().encodeForHTML("") + " ");
- bodyHtml.append(
- ESAPI.encoder().encodeForHTML("")
- + " ");
- bodyHtml.append(ESAPI.encoder().encodeForHTML(" "));
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML("") + " ");
+ bodyHtml.append(encodeForHTML(" "));
bodyHtml.append(" ");
bodyHtml.append("");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.xxe.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xxe.page", locale), bodyHtml.toString());
}
}
@@ -156,21 +138,21 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
try {
filePart = req.getPart("file");
} catch (Exception e) {
- req.setAttribute("errorMessage", MessageUtils.getMsg("msg.max.file.size.exceed", locale));
+ req.setAttribute("errorMessage", getMsg("msg.max.file.size.exceed", locale));
doGet(req, res);
return;
}
try {
- String fileName = getFileName(filePart);
+ String fileName = MultiPartFileUtils.getFileName(filePart);
if (StringUtils.isBlank(fileName)) {
doGet(req, res);
return;
} else if (!fileName.endsWith(".xml")) {
- req.setAttribute("errorMessage", MessageUtils.getErrMsg("msg.not.xml.file", locale));
+ req.setAttribute("errorMessage", getErrMsg("msg.not.xml.file", locale));
doGet(req, res);
return;
}
- writeFile(savePath, filePart, fileName);
+ MultiPartFileUtils.writeFile(filePart, savePath, fileName);
CustomHandler customHandler = new CustomHandler();
customHandler.setLocale(locale);
@@ -179,27 +161,25 @@ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Se
StringBuilder bodyHtml = new StringBuilder();
if (isRegistered && customHandler.isRegistered()) {
if ("/xee".equals(req.getServletPath())) {
- bodyHtml.append(MessageUtils.getMsg("msg.batch.registration.complete", locale));
+ bodyHtml.append(getMsg("msg.batch.registration.complete", locale));
} else {
- bodyHtml.append(MessageUtils.getMsg("msg.batch.update.complete", locale));
+ bodyHtml.append(getMsg("msg.batch.update.complete", locale));
}
bodyHtml.append(" ");
} else {
if ("/xee".equals(req.getServletPath())) {
- bodyHtml.append(MessageUtils.getErrMsg("msg.batch.registration.fail", locale));
+ bodyHtml.append(getErrMsg("msg.batch.registration.fail", locale));
} else {
- bodyHtml.append(MessageUtils.getErrMsg("msg.batch.update.fail", locale));
+ bodyHtml.append(getErrMsg("msg.batch.update.fail", locale));
}
}
bodyHtml.append(customHandler.getResult());
bodyHtml.append(" ");
+ + getMsg("label.history.back", locale) + "\">");
if ("/xee".equals(req.getServletPath())) {
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.xee.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xee.page", locale), bodyHtml.toString());
} else {
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.xxe.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xxe.page", locale), bodyHtml.toString());
}
} catch (Exception e) {
log.error("Exception occurs: ", e);
@@ -233,34 +213,6 @@ private boolean parseXML(HttpServletRequest req, String savePath, String fileNam
return isRegistered;
}
- private void writeFile(String savePath, Part filePart, String fileName) throws IOException {
- OutputStream out = null;
- InputStream in = null;
- try {
- out = new FileOutputStream(savePath + File.separator + fileName);
- in = filePart.getInputStream();
- int read = 0;
- final byte[] bytes = new byte[1024];
- while ((read = in.read(bytes)) != -1) {
- out.write(bytes, 0, read);
- }
- } catch (FileNotFoundException e) {
- // Ignore because file already exists
- } finally {
- Closer.close(out, in);
- }
- }
-
- // Get file name from content-disposition filename
- private String getFileName(final Part part) {
- for (String content : part.getHeader("content-disposition").split(";")) {
- if (content.trim().startsWith("filename")) {
- return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
- }
- }
- return null;
- }
-
public class CustomHandler extends DefaultHandler {
private StringBuilder result = new StringBuilder();
private boolean isRegistered = false;
@@ -275,21 +227,21 @@ public void startElement(String uri, String localName, String qName, Attributes
isUsersExist = true;
result.append("");
result.append("");
- result.append("" + MessageUtils.getMsg("label.user.id", locale) + " ");
- result.append("" + MessageUtils.getMsg("label.name", locale) + " ");
- result.append("" + MessageUtils.getMsg("label.password", locale) + " ");
- result.append("" + MessageUtils.getMsg("label.phone", locale) + " ");
- result.append("" + MessageUtils.getMsg("label.mail", locale) + " ");
+ result.append("" + getMsg("label.user.id", locale) + " ");
+ result.append("" + getMsg("label.name", locale) + " ");
+ result.append("" + getMsg("label.password", locale) + " ");
+ result.append("" + getMsg("label.phone", locale) + " ");
+ result.append("" + getMsg("label.mail", locale) + " ");
result.append(" ");
} else if (isUsersExist && "user".equals(qName)) {
String executeResult = upsertUser(attributes, locale);
result.append("");
- result.append("" + ESAPI.encoder().encodeForHTML(attributes.getValue("uid")) + " ");
+ result.append("" + encodeForHTML(attributes.getValue("uid")) + " ");
if (executeResult == null) {
- result.append("" + ESAPI.encoder().encodeForHTML(attributes.getValue("name")) + " ");
- result.append("" + ESAPI.encoder().encodeForHTML(attributes.getValue("password")) + " ");
- result.append("" + ESAPI.encoder().encodeForHTML(attributes.getValue("phone")) + " ");
- result.append("" + ESAPI.encoder().encodeForHTML(attributes.getValue("mail")) + " ");
+ result.append("" + encodeForHTML(attributes.getValue("name")) + " ");
+ result.append("" + encodeForHTML(attributes.getValue("password")) + " ");
+ result.append("" + encodeForHTML(attributes.getValue("phone")) + " ");
+ result.append("" + encodeForHTML(attributes.getValue("mail")) + " ");
} else {
result.append("" + executeResult + " ");
}
@@ -321,7 +273,7 @@ boolean isRegistered() {
return isRegistered;
}
- public String upsertUser(Attributes attributes, Locale locale) {
+ String upsertUser(Attributes attributes, Locale locale) {
PreparedStatement stmt = null;
PreparedStatement stmt2 = null;
@@ -338,11 +290,11 @@ public String upsertUser(Attributes attributes, Locale locale) {
rs = stmt.executeQuery();
if (rs.next()) {
if (isInsert) {
- return MessageUtils.getMsg("msg.user.already.exist", locale);
+ return getMsg("msg.user.already.exist", locale);
}
} else {
if (!isInsert) {
- return MessageUtils.getMsg("msg.user.not.exist", locale);
+ return getMsg("msg.user.not.exist", locale);
}
}
if (isInsert) {
@@ -355,7 +307,7 @@ public String upsertUser(Attributes attributes, Locale locale) {
stmt2.setString(6, attributes.getValue("phone"));
stmt2.setString(7, attributes.getValue("mail"));
if (stmt2.executeUpdate() != 1) {
- resultMessage = MessageUtils.getMsg("msg.user.already.exist", locale);
+ resultMessage = getMsg("msg.user.already.exist", locale);
}
} else {
stmt2 = conn
@@ -366,15 +318,15 @@ public String upsertUser(Attributes attributes, Locale locale) {
stmt2.setString(4, attributes.getValue("mail"));
stmt2.setString(5, attributes.getValue("uid"));
if (stmt2.executeUpdate() != 1) {
- resultMessage = MessageUtils.getMsg("msg.user.not.exist", locale);
+ resultMessage = getMsg("msg.user.not.exist", locale);
}
}
} catch (SQLException e) {
- resultMessage = MessageUtils.getMsg("msg.unknown.exception.occur", new String[] { e.getMessage() },
+ resultMessage = getMsg("msg.unknown.exception.occur", new String[] { e.getMessage() },
locale);
log.error("SQLException occurs: ", e);
} catch (Exception e) {
- resultMessage = MessageUtils.getMsg("msg.unknown.exception.occur", new String[] { e.getMessage() },
+ resultMessage = getMsg("msg.unknown.exception.occur", new String[] { e.getMessage() },
locale);
log.error("Exception occurs: ", e);
} finally {
diff --git a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XSSServlet.java b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XSSServlet.java
index d55c7471..8ca3acfa 100644
--- a/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XSSServlet.java
+++ b/src/main/java/org/t246osslab/easybuggy/vulnerabilities/XSSServlet.java
@@ -5,21 +5,15 @@
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.t246osslab.easybuggy.core.utils.HTTPResponseCreator;
-import org.t246osslab.easybuggy.core.utils.MessageUtils;
+import org.t246osslab.easybuggy.core.servlets.AbstractServlet;
@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/xss" })
-public class XSSServlet extends HttpServlet {
-
- private static final Logger log = LoggerFactory.getLogger(XSSServlet.class);
+public class XSSServlet extends AbstractServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
@@ -31,28 +25,27 @@ protected void service(HttpServletRequest req, HttpServletResponse res) throws S
StringBuilder bodyHtml = new StringBuilder();
bodyHtml.append("");
- bodyHtml.append(MessageUtils.getMsg("description.reverse.string", locale));
+ bodyHtml.append(getMsg("description.reverse.string", locale));
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getMsg("label.string", locale) + ": ");
+ bodyHtml.append(getMsg("label.string", locale) + ": ");
bodyHtml.append(" ");
bodyHtml.append(" ");
- bodyHtml.append(" ");
+ bodyHtml.append(" ");
bodyHtml.append(" ");
if (!StringUtils.isBlank(string)) {
// Reverse the given string
String reversedName = StringUtils.reverse(string);
- bodyHtml.append(MessageUtils.getMsg("label.reversed.string", locale) + " : "
+ bodyHtml.append(getMsg("label.reversed.string", locale) + " : "
+ reversedName);
} else {
- bodyHtml.append(MessageUtils.getMsg("msg.enter.string", locale));
+ bodyHtml.append(getMsg("msg.enter.string", locale));
}
bodyHtml.append(" ");
- bodyHtml.append(MessageUtils.getInfoMsg("msg.note.xss", locale));
+ bodyHtml.append(getInfoMsg("msg.note.xss", locale));
bodyHtml.append(" ");
- HTTPResponseCreator.createSimpleResponse(req, res, MessageUtils.getMsg("title.xss.page", locale),
- bodyHtml.toString());
+ responseToClient(req, res, getMsg("title.xss.page", locale), bodyHtml.toString());
} catch (Exception e) {
log.error("Exception occurs: ", e);
diff --git a/src/main/resources/indexpage_en.properties b/src/main/resources/indexpage_en.properties
index 1582eb77..8d495885 100644
--- a/src/main/resources/indexpage_en.properties
+++ b/src/main/resources/indexpage_en.properties
@@ -21,7 +21,7 @@ function.description.infinite.loop = Infinite loop occurs i
function.description.int.overflow = Integer overflow can occur.
function.description.jvm.crash.eav = JVM crashes if you click this link.
function.description.ldap.injection = There is an LDAP injection vulnerability in this page.
-function.description.loss.of.trailing.digits = Loss of trailing digits can occur.
+function.description.loss.of.trailing.digits = Loss of trailing digits can occur.
function.description.mail.header.injection = There is a mail header injection vulnerability in this page.
function.description.memory.leak = Memory leak occurs in Java heap space every time you load this page.
function.description.memory.leak2 = Memory leak occurs in {0} every time you load this page.
diff --git a/src/main/webapp/dfi/includable.jsp b/src/main/webapp/dfi/includable.jsp
index f2e99772..a5851183 100644
--- a/src/main/webapp/dfi/includable.jsp
+++ b/src/main/webapp/dfi/includable.jsp
@@ -11,7 +11,7 @@
-
+
" />
@@ -27,15 +27,15 @@
-
+
-
+
-
+
diff --git a/src/main/webapp/dt/includable.jsp b/src/main/webapp/dt/includable.jsp
index 6c39d39b..ec87def9 100644
--- a/src/main/webapp/dt/includable.jsp
+++ b/src/main/webapp/dt/includable.jsp
@@ -11,7 +11,7 @@
-
+
@@ -23,11 +23,11 @@
-
+
-
+
IuJfZ2tcW1llDlfe_^Gmzq@$z5
z*4|#$%S&i_dYV^QII6l@5dJl{q2XRrQ&X89r=Ed9`}8!GoF;CPC80E$OTdzA9WOtB
z$oRO<@3FBq_$@Uxwn0#RwwI%Brg)wzggz9UbKq
z72%AHjjhg>{<-+y)19CXA36(DZ*FZ#`}>Q3H{gnhh$w4r#*aBjOm`pn^^2I349C~k
z_vie4Jlym5@86|LCq8}siaj_u$i~AH*=8!`=JpVN2Ju`A3km=JxqK@wZrgH~Aw-i2
zf+we-rk1m^Vt%c_7!et{UG&I^=J%?qk9BpF4<9}>rNH<#yuPt9
zGB<~p+>2H@^%|be-NU2Jt_pF8Zfz_4V{akZ3b8{o%;NVEh$mlpY;Q##j
zGu$A4a&Oq~uA{q`*Qe4_g8u&gRX1H-U9)mMQ(g+h{l9-tS!+~6$A>{AM`(i@*%2Hc
zk1z1(k(skIp?U!csk|m`M-CkMqeqVr)(8xgBqJwZau&ui%OtZ+kC=0e9J7@?WW=;hK}974=YMf=AvNlrNR9YKt)?|Ih{LFy
zQcWTU-`d>SkylZ{DMvFo74foo@#4tT-+e5DYvS1aN6Y$
z7M7N1U?w;tRC%8t<=`S}YHG%O9fvW+#ay^}cppE0M83YhCPYIHp=&iS2g6!eTdy0H
zN`lV|W0p-hbY6U7OAxga%ozFoTW)qu2#+il9qt)?GKVe3RU~us?_aqmPcW;itLJ~%
zV}r{NQJ|ut!aX7UP+s%*>M9d11}Y0H>+oBFS#HtJu?JYAEc>702r-K2aJ9W(UM;F%
zS@=eAd~&YLvc#Wle>1V>TBk_n>*+}b)_D5#sVzLEL98?yQ767|e5iT>qs~%aA2#@s
zub-b1%eeq@4OW{Lx;i;d^(MAaI!`Ox4Uy^}o>r!7=FM6SsUG9~`DF>@!{yRe%PZ`X
zZ-JP)9ypHU0e`ECi;F)tHPKjCz9$XHP-R)x$v&w4VKP4e6f1
zYMV><3^tySfGdkKp3+QPe{k-fc2!Idn7YVzPF9i~5dKeQ3igkSi<6U+X3vu-K8)@E
zM2KM$GAe&I
z4qaaJt$KlI)tMc_2h#a?d4uBdH3nXqnj$HD;#-WI;lg$({Rn^IDabP1_arNV!fV(DD3hc(WP
zwIWi+OurbP^n6|=%8JOepJAz*Cp6&b6C<rerViT{#X~i4LP(e
zs25XDvgUU;XoCZ8%5D5kf^BA+Q{Ar$vH~T2$RWi@OWyDq^#umcoS$?_r>3MNCMSm$
z>6S9Evt#qW$2BuE!@|Rpx3tU~CLax#=qoHGKB5{*#%SG)2NVWb(!tu>$9n(B~Bp5a$-^3#h%UpcJR@S6N196yLm
zd*By#9uuiobVlaz9@ku-t#+9Mkq=+K!noMNj3im^pp`KS@ON@f|BT3RP`k&*p8eW!
zBO~N|l!bfMLAx79N_vY{ErxBR!XGxmQtNutA^Y}UwohNGRv>ao0oHQFliw4Azp_@a
zn=xp-h>i{u7Jt3EBh+-RBmNg^Bo+>itfC^8jI6B7N;jTZz!im$kI$E{UqjRjItDX@
zh)76eu@0vyZJ5FY1O+2Le`c9&@FE~0B8rNSSFp8Z`!zZ`+(hU~7?}e_7EDYiPsGK=
zgXJ<}vCbXN>*-t-_`E@8
z_FS)P^#~WkPvoa&ew(E{b!~1xVaAG>ODF3d^HX+r|ocKm_GdB`1tq_4^IyddVYRl-BM%bFt&Fece<~x#F{U6Mdjq>
zm;Q_uMMXum_NVeJe7!twYQMM;Ddd|K$6Tv*Zuq;X#_l{AomIOe5%!~oDRh)oYV!fg
zc){Y==Fs?hhNIKdQ0vpZpd~p|cL(a?xUtDEzDTFF_f-!}X!QbQd!C~upLjVxEHzo0
zb`b2as|vB2BC**$m6>Wo!-~uBm>a0f_NA(
zo~r7Ap<7F{m#v*$`}#VIprD}o?`Q`1wb0QnTGfaKMa`c*7EJ}%nN6}~FYnJWc(|a5
zH29WH&R_|io|>AU?%98ayQo&hsG$w<9y8S^6UoGm-e$;9Y38+)#b#!#FDoe+&
zU%#4LDr;+_{7!f2MMS73N}hM*tE84SHeTt>)$F0?neCFUMHf0aVvw=Amc|F$$B0u=
zQfbjqBrW}B?Qn2tPq{wZ6O~-Nv3`?DDxj83HFHfD
z!*E|R;Psa;Y(@>9cuPx5KZb@R_Pv;D^cgyT{`^VOwG`@&2YCRI`P3D2JX{^e?=(N`
zArTTIre{Iry0iIv!hFn=7n$}q&5EUwtx%Ou#iyI;vt>!t>&;<$T>Ifc^5hj^0U@DK
zGYU>_?xds-l@YupsMlvb4a5%uaccYnVb1J$-SkAnsZK&hGhTfT;Fn-Y~r?`h2KAS(!mGldzKj6>4=~0xHW&
zwiqLMwMFEshCfDg$%kmYB8|Ss>6FfBjySyx2iQs&gM>N8&Yb2I9T)O_&D?B^W|l_&B$9n!_{RJ
zqk|SnlIK5akfFa!?6qX_^gjOcOiR|6FiXs5`JGkDAD>WfSzaNbC*Mdj)ybWa()M^T
zCste5om(b9s_{H=@{1kbaG}PGFx&5uydiRNaZyxOmU;P-Yj?gWmZ$j)#kFpBk18@U
zf;aWXugqn>_bzyi^Iel*L*e(HD`sUgJ2@{d^s@Q*`DM_&w*UN5=dAW4G_raFaVyo$
z=3IQUXF*7suT`kXFVB)p|M>CwPrql+o`vu4J9l<=(us*tvp@TJ5wHS4w5+^5I6psM
zHgw>!ZLpHirlFPKZK#t^`RHe_s0Oi_yzbxM$F?6nQBc?~GP%Y!@jt%n^5zj0-h*^J
z9Gs3yo8c?=-EWSfxtgO(XWJJZqg?E{^{r*krINulz-JtBm`syt2#w=z_Dq(gY?vS_V
zIAMPU8wZE1wKWU>!-twiMz6l{eS^mA)2B~>MMN@pRYUe0`395qQ;Z2C->#!!3+;vQ
zenwr$BxrtkuU!hgQ(Wnuiwjn}ElJoL46KJY`IBfWc$29Ut$DYon_<~ON;e#}zi+Xd
zWl@FPs>{cJ{nA?IrX|DtKC^?ks=K>DiBVn1lZ5*;hCJ>qVISFI5WvU6g7MFvKlqup
z4|)%w_4rs=*lY877&>!k)J8@}Q7fk!owhfB{J?S-p@A^_II->j=S{H=2Leiuj)v~;
z?$+2G?Si`l`v7e(^v)=i_%ua}m?k0H56~7&FwDN+Sso{zJ+a!KlV3c#vv?FeQ{F{m
z?tahMG*=pLJESz$v0QI|E!Bj9nHfDgI=c4NIlsj1m0M>|53M2@H__$~AEW?XbNOFV
zq&+AN%^j^S)XFLPh5TzKSH3aXXT}x=jR1oj4#Rn{bXP;z?{oAxqtA){2rx${I
zZ^UQ07g|tt{m8l3T7s0W4Qp2e30w>rldbe;>pfygb^9&(A)A@GyORP$N$g)!R8x~T
zFra#?%=}_YMO9VI^{NTj4+2_=&L+Q8L>jaeXb$P(>}TNMh&@s>X$kN*3AJ)`#P99x
zt@YfYf^0=ZMiv24_rsF^%a|STMWJm{obyppSgY&n7a#0xZL!MB%UA3359JgTk|+Y?
z<9mSthVb-_fk)?4Q5r8{6hV9z<&&vS}1rD~JvUFrS8@POkAyeqe@xe8sXZL$Y|tq{HlkxMd~m5<>PEIy^&!paowU5+
zC2Q(}fYBY#NODSRD=T^q4jj8GD%ZNJpSdP?Lg;d;s_p`pqNk@vM|qpv+Ek9DyI$JH
zTa=SA6uiR{M@Jfx{Og@v}Zwyp0tbO`}*
z+fS4%HS9IZDl21av)@G|;LT0j&aSSHU%&qONpS^E3wDgQ_um+zX$hb2>gobmCk?Th
zo11%btxgfA;9BzIha%*uPdPbA&~`%|vvqI?GbjcCg!_16uEEP+MjZlI?uQIZ^3uie
zHelcO%}us%Ivh~N-hB9gsP)8D-Zxiu6OX@s{YpqoETj0_hNPyv-N#?a26?fg)Dj2MsVVx^bLn2?Mndi$y7t0R7QLQ7R#EG
z`t@hg8o~c`bYfns<`Yn|lVX$Jy-UM^#wQ{Y)7B;pT_*)@1WCi7V|;KKFV<-{b=qr_
zHgHl?u1pFa@|FO=st^Kw&H*I)f1CPqeK%K0*IZ0#K#F4q?x
z+S=NG{T2kM@Zj&g=S4+D{_&Zaneuvi6cB5Kl$6m&NA4|rZkg&&qSOrzjcd|3e3+P+
z64BnY$o#9Q;73H}aD&@M{IID&`e&Eh8~;+WZlGdaRe`UBrY3rAa~NfAdYVD00PHB{
zd$g%dMXZkgi*{nmJ-4drQBFCMqcy6Lmqcx|mXpk^%4>+w$Za~u0hI4}?f>C<`->S}
z$bBEX4DiXTf-Hp7a&uhTYv={+9N^uM#g^-mj#)fEug6BwlFV*8n;W!k?@oK3Hf?#P
zVr47~ZE9Q)_kDBtQX%l4Q!-#<7Hk}x1g@Q~3Ql$o4r$FStq-F~7;a8nzTfBze=8jG
zIJ*^)|J{fyoC%-L_Ki~iXJ7lWdF??-(odRS!1*+bE^JWL_;)=dW;j8Cc&B$59wHN3
zmtMFuxj&W#+4WQ}9$25{KWF%q5|>C0N))qxBA&C3L?z1{4dX6ExgL>HP?egLUzR{J
zG|k9D%NWEcoMi!o4Q(zPH}}bTQ(fI-SI5GiGYhdi;^K205nH9y_U7gxdSS$EXR&-I
zr>7+3x(pxZdhY`_8^wvh=A|a5q8h+Kz4@)%XUYF#&Gmp9IvEB#di{?#yHEA?DSarz
zA|o&TDI3Y0sUv~k|0xjn=FOYdIV*eeXqw#yr4o0OJGHy7_EYSlG7g<*bc04jaJOT4
zD>eLeWo1zVE@u|*D_OQzzj$IJ`+(P&faTIFD^l5R>fz_i>A0F1o$|Nmw5D0jn0z;~
zuk)@jf9q4had+~IIc~*;0VxC|40KglF*B-~q+L35DAz~VJGJwdi@29KB-G^X{}uOK
z$6cbi&lcolH{zUrcKX-I`wiXycDQ;am9``QMySO_sm9{2Y9CK^ez!yf$EhT}qYqYe
z(KUWaE+N)Rvy}myc*%#`BU_7nrjBwn;L$8P3G{nvsK)Hpjs?qK>s7{HP*7k`+=4ACCjqBD~*H`^DCRI;AbwhW^BhC
zc@HZ8`_EfU$cG2o5nxGSiW0zX5S?p*{`!ix+K@_oI*PdM1L^(KlNL|@3FyP@y_Zy6
zxkZ7v7V8talN}szh420JGmrkD-#5By?dsT8$smqP$wlJ~G3UYMgGo>S{2nVCmGG~@vlm|dwP_9$uLCB=`2G|-HJ_#vMSYK=yCb+
z1dlgtqAR19Jz@f0hk{=WMnqWpY=qXVwuLtXu4S
zN#z&YcKohYTq`!5p5%fv7^g;kh}%4m{qCy~Aq26zO(Kr{^Ivvw^DS#ZZt$k*oSwEn
zy7i^m-1G4ci9p(w_o-zS6~4K{F2dA#WZyq`PjHEGhqZmp^w$52UQ2qruvOQ`hzFj!
zQr9yqdE$<8uK8;nw=iq9%TuQ3d_V9qY3Uah#aK%aw1{Z}-cc|8<^`{>7Vb%%Sul_5K)K20Xt$55OBZYm>>bi#UI;9
zL(?=&@mrVHzCSbJWend7&W_eaIyA|buQ1JAeKGv4lopj4Ti->5jCRRT7oujCJvTmB
zE~Wd$iZeU?(q2!?d)AWnQRXC0S&u)4wLn?!NfV4@V7vx(pY`Hbtq;D#i`pJn<+D2o
zTykjf9vxeEUe~x>IN-}r>LwY67!$KqZFVz3^+Ej}>fr&^WV%ytfSD>L%gHkSgKp!X
z!(P8dkyoOUXY&la!!;BCt}J-d7tU+&iyVC$BVP8qor(y@%Q`rGOZ__N68`*}$lT73
z-34dN?h&P^^Un06Y~Dn+81IACJM?h?I$QFcHL}G1#qczHFWJ9)h#R`PYH9xFTqWe~
zyLUtkK-#czavnV%{_}_ZzPPX45Myul&bWx8x;jhwKoi-QFks?J2d;s?8ct2}26ldY
zVuJ7SW1o;Svw}#%OH|g*%wp14CJ(F)R7S?;;@*vQh!P7{|J}S-X8OH`#;5_s2&N)d
zM2qaXi^iEpzvslEUfcvCzgo1Aq*2FE`C6*jKjYY+7~K$5Y(u_CEhc_9^W?-6G46f!
z>PnA$#<=!nrKwinR&>wHskFy6v^T)avD_XZ1tSo8!lrA>m`g>ZqW{p#a
zzYJ(j=bZ|V5_M<0XoBNe_u86@97nhgoFCk{%+TC|JtQ%l4&Hf_d{z_9e{x3>`Fau4
zIA4&uhbZX{)^e@#I`nwP+?A>7MP~|npq3dY_i0p41l~jLf
z);9;_i}%IRgWcJ>%F?ce8UGfSm57Bs15Zyu=>J2UTCP(Foz2a2CtS2tVV3;MNu{`d
z?Vy}@SdCv^=IK)sFrtYGEg2aZiUGCc{9i*yHyJI`OO^7GXEFCJ#0?B*_{2pCSO=xt
zQ6cFHbeNjC+@V=_bQhQ~%jcsBd3;qKgOn}
zF8gv7Y9jPLx+$o5gM9I?EZ#-|IORCtMciB8G{_i48?AaLznUb
zFoDSsa*`?5Sy>;<=$sxHJ{|gF(){Xu;-6$zjaP3|V36*-J}O{@p7VlJ`HQrg1(w5c!D`-kLM7#=xhC*>V4v~66*aOW#N{~
zY{CfCqL7-IaR3aL*K@0r!;2K6{>;gMc=*@$nUZHFlgenw|7~3^x|g#Wa7d0}S2N*)
zfsGobA9g6DTh`i;#r}MXb@4BOUe&8L|H1}lpEc1BsT|FE3~Y*8(35X5Yqvb24zCF(
z{EO~P{=zCvkv&;^1Vf~MvQ?(blA%S530bOMf6;mMZ}CTVX)rDN8N|D0weD>spSC^{
zI}u@FWJKkEKhQrWu1?FZHflN0T4g`+DkcRmu~MCqs_JWv7GGoItcd}#_p0k_6_7C|
zC-w3Q3jFjV0W%oS{f97>$2Qr);o-*-+eTuRhC?(Ma(7b2y?z~LuycKSkA_AbIwPoq
zZ<3N^`d;iVwCp`&(bm*ldZth*^tfouPRa8E_~WRUm}w!G!)XvIC~+o88CuT{uz0H+
zmp>c`)_V;Gz=#Q6VmEa`noJA!b0N&)Lw5mQy>)AuK7N~?J0XPQ4zjKX&2oEA&m$_y
z8#c7a0%wWi4HlEm@k$(L+>7o3byT?9ywz?~UbI=(zPy{A>V~T+&mH5%Rd!AT
zsh&V=vp$P|Wq1kV?-zF_nHE|O_Yda6b4UWPhtjZ}xp|XvI!9029_@8D2!EnhUDlv4
zQ41Zs5&y7o?FA#`>rN~cuZkfA;rjtg=p}0A(PM9wN0aSNVq}{z{$M|&a`Y@Hm?*_ppi|?9~%|5e@{ac>-hNCxN8;wgYj;O%*P;A7DmTUWA%)-
z=7Je86+w+tkW~bRFUb}cOq~Du^YT!p=;Z8dC-kjYb$_#V_=SWbdlG0@fFppO)ADt&
zc70{W4~T=PZ5m3-Esv(q&`|JomgSWd`oRxx`YcaaLMkdMu(p)(NQv_fKIY{yl~!bp
zDw1Wf1GIs_2!^3~(6jV8!~R7KlPo^^iw6^1To{u7AqUjYSv;Gxh9Og^eGK}<5p}zR
zQ0EJh$=O@f(+kqHqrjlD0*hr{VRTc?>n8_<7u~p$5tXHX25!E1He|k)qxl^aNU?bt
zSpQIy=Z2NA8%5>9Il>aAXra+fwH8xja|`sH(APY3M_+zRWHk7E`0skV(;^vq?M}a`
z@zt28S6`3w-RHr)3k22c+#lf3CBKH77XBlRm%Jc4(_E+*3n-&HsyvOBNvIV=OI^n)
zo5n;M-u-HLg;lalsP&o)_nF@}-RIPkxlnN~Jq2GSV5}O;h}rcs%lp_p$Et!5p!Wmz^CpOrU=B_DX{WL&+5;G}8H62wn){0E>X22iP=fd`#}=^>T`T
z5ZnR$6ikgB=jy`~6A51@By>0klJpOnJkRO1WC){xIUd+Ox1azMXn<7%5I1RRX~_^v
z!;wp%FE>Ow?XYy7pZma7-VAYVrNIyg(`ebtnu3zD4R``b+CQf#_58DD1aTZ2UadbP
zVraSc$qLwF(2zcp!1d$$n-t3QEJ0b*8iEOG2S_x&hDN;`5=W^+$`C
zFuBKd@hrF>|Bxv(;GiURo(V<>(voM$Ms>G$g!al6W;1Y1lOz_Dti^68AF^JIWQXnz
zpuilyh_mnMy|YD3=fh@4c3pqJhPAz?wZ_J%$w#TC9J%5fUN3`{rmDkMB#@K;abU?-
zIlq%{KcCAEf{|p6n}5U8o~N&ON_oW}KYssvs@Iagg_*B`K867#LvJ!NR4!Z@85qD=
zn>Ft8406#yNl8inX=#Q0{P|yQJ6BaRVD30Q$5b8@1wFkq-FtH|)=^{;WnqaJNN#pn
z!BBYeL|Ri6ji-z9lzs3Nx=od*22Wwk$ZgX68k69DVrm&vFpE{hY4w!Sd!H9gAgN$`
z@Ssg-;Z^AO?*e+oI{YRIG0*P1o0#B$FbcFs$QgrV!t^B?PF~rK>%}!#Mkah{_T+LI
zcX!u_;K>LlSYXU9Gi!7t8Zk=y7oSSykL3ML7SZ7!YV&w7a2*>%&)OK7m>~ao@0lJ2
zlK-tnHCN|OMQUeuaB&?@b17Q8Df8JbigSdvbMcnxHcZqTaTN|lLH1GkvfSsJAj_89
z{@nbp^Y&M?Fr_RLuiAspBTmIKY2!1ok!viv9u7Y~X&-V)SU{dgDPI{^ul5b2$ZA9_
z@nH?!vKDNsX++|(N+Sut*jVv`8bR+rKqw3{oSf|D7XM6gY00Yv7;vksKdBsB@C~@X
zp)`Os+KieFOmdWP$XkywyDG>$diwfpKu4#frh-EwS5D!^DTG3)W)Kh{g?e8bcq{SU
zV5ixo=kH$!^J^uY8L&trh7K_DZ)&sTc%dhduyUz!oI8jSQkLVcnwfGCEIl*T(McIj
z|DcXwSep7?0Cn?kr)GgzW^ZTbSQ+ivvvXg0W@cvNiMznBs-$w$a}ADCj*pGWV?7iQ
z5HM{TdngZx6#!P*_wS@-6os{7*d-4!jdXYE4d=HU=FTyl)<3)q&s0cA>|9Uk$+xaX
z`nR9!)_}xWc-!BSLG6c}p&=3SNvI6%w@X_EkPsrR6`bHX1RogP2-EUf!VVj5?_Atu
z`&Rn}qHNUMl7H~Jjoi51yYUisx)u_4x)mC}5xuRkS@62;SegHNOJlV1wD!eqeLM`{
zhb{xxAD_l%hdwMslHBqBAaQ>vQW6dL04dfRbhOyhQ1oET(*yPo2?480C{|b4+{Z1!
zN|*UPuCESCdcLZjQJw`zn&Yhu&U}3&d8AkAk}X9s-Fua6{&x~5=i$wQ|K3__D-rymS{E)?8Iv
zvoJ9&W;ivst@Wq6obEnPGMd4Q?Fs>g)2QD4j&6yOw2{#V-JR^bX)dDoEfv%;(}j3%
zzx^B-Q2kc2D?kSDtMn|V!S5ELt1tgMVzTSq4eZD@XSYxgkwUfQ6wFg5<3q;_SPTRs8hZ!EwG##OoC){;MsUXkjY@=ZY}~fypQDugS
znf|TgMX2z^#;4*RrzweoDgd$CGTiW=Z$ldjc^f!0;ESXc^njJmt*xanC>}38Yt!Tv
z6!hH0arE`2A|Yv}dgE7aGIHZce#|x}cr(s;EUXef*^n%BLl?eulBF9X4%C#bKzb0G
z|$WYGBC_7n7BoHD(LDD&N5L#I8Wn&yt0<{L%_)EUE;)AQ?Z#eSC`RP_ab
z*1N#{?AjHGVl!K?`9Mi-cz<F}I|HltOPx`W~O0gWdwwcS;fX
zY$lyoIZp`}tZUK9t{^1^U(alJt`TX73G6aJtJ`{f@W(Ka7KEfkl$1)}I;5so^it%Z
zIVFlwQ&l}05#fEWYHTHaL&xk7Wct6OtR(gaha6HwW9_?5a&?cww~(S4kfqE){%HZosVjjPwUdLP%Wv
zTCT(qdhkR-0whEKj826qjNA7rx@&kESO3m?Oi6FCYF4PbOXH(M&EHvASTI>oQ&QGB
zwZGjsM_t>3Q6M21nZkD>R@SC>5mZ!E`v`^{5fL>D0o$iyNf*_Yg;|}#!fv)z2Fv`k
z%sS-=&8VV^N+=M`E-rky7@_13zG|}rQQl@N;QI!_Kbx7+8yFfkodD(~B_qo%E*`WA
zl$H)&xIRBWhr^J#JUlo!nOgv5t^8-~ubg<@CRb!eSMs#{?%)I>HxIvm+3ol_wda=g
z;R7}3l`sAd4-G|3Ij~%U6j|eld2@3UNo^G5r=k;lofF74qZlm5BkDzM?WS(}6|Z6#+nZoHl!m#D
zrc37j7pFIKj_dlnx;9qQ@AHEV-beS6-(t`YNm7cC1cdzg-f&+?KlASXM%G)x$MK<4
z4jBCv!pb@amso|o9|A5U^mb%xh1M6VOM~`G>GDOm2c4Q?dKWBb8-0?0AMRXF0q^xb
z(JO89&xA>!nmgI)4amIl0DtDWS+}@>V9GPuP~_sOzL$oECSY#0=~5$Ac7-#
zO2LB#IYdrdo79q@5;4uDaUKWPuQS3gOkNu=HUtR;Od(}K<7a(JdB>HTPe35-%^MKAT8XIK0B`Yd)%H@ZPhykhkXPiyR)LhWWQ*wNLk8;`9L=f7vq
zcP3~`B$jVR>EuAm2Kq&;5JKne`BQYq0zAizyUWu|onuN-_bQ)c(OEsF&8-4o5aMR%hSCT_{96)a(L=yrx{3-
zKrRnb^UmdE20%dsT>nX?Qrx@Oadzh2x{QBm^*&))LPd5qq4GA*@!%{raA83${`QXD
z=q|(aoL
zldtu$q-6KrM*v3d*>8VDS6&qtG$k!_iB~-fq{{MQ*OHpy&_Cx%>v9
z4OjgSBRiMP&fh=t?X+UYHtJ&y#Fm8I2RXWN*hKg=B9*U&AZ1JMWn^Ud{k^`Koxh%4
zf~3{r=m2yWdy##@DoahCNhE&(;n<@`0mDyMY+4}d)zsn$Tpk(jlctiA5{ryE>Yk6F_SBQLSz^Il)=_b+P<|i%Z*}2*np%lk
z14&s%qaWVQNfBgVQc^VP%VY&CfEO)?FA>V^r-0iqDf#azek*Eep~VhIv8$Tq$Y`8^
z@URTrb(5BED?i!T*tqnlVXm28VX^1+4a!gjdLZ;d!u{o(grlpvdi;We2Yfd##LJX)=KxwP0u8wh;7K*j}OezVfa>@bODqTNC-o>RnHT-RA>c&LV+%S!V
zZHuIrx1`WxR#wbsk31BgZCEg!_oL3PYD8riRqo91GS?bNUV1fjMDFMoYX8SZ${KU2
z)Q%5CSWng!nH(H=5ael@Fqpp}<9#(TF#$aeMs!A#osfQ^HdwO?gFT=!{osGk&wz#FTw&2SGjcT5nk;I35jVH%yTr1l%E?Uwp5rktGGP#vM&;0~QqM
zgoMbk!$T6oR#~=>eOq?RBx`(I5Vh+6I1L3Z2HRWqFJn}%Spt1b1*dYFBNZ&j`QJ59
zSqAF=MOa(kA@H)YqT)x32EX9jTrp-MEhTLg6_rFn#L2*}j3PrGf+PQvS~cbHrLa&M
zumLGHI;d=vh&*6y33Y$!WF|W^Gw$nGb~e%+?aUfiGVR=hj#*={ss;b1ZmdvdKbK
z)g-+2CqIpN{qhefofWadEs
z!&(LA*H*NDDHfnxCm|t$tsGveI98p?=X!dGB^%@BSJ5FMDBwOhU%vdX=iuZN%e?N&
z|Iy#yVSA7oFlWgE^U$#DT=BgJt}z_{>FIsnJBPSRXlf}dBfNX}E=U|js)T8W5A$4F
zK7Crz7STqN4jQuy@3lnGz5l;3XLKuPVjHo#!prN-z&8`xTHzqIl%^XEegqe8br8f9
z3qN=!Ll`#kRg5bp*MvD!=ss-P$Z6IT7w^PzAVusF)e4*RC&o7+vD}ObsUN&>btMLl
z2e2lrx-1Is%55)9Pqzbo5PhT%3s0`Du8CP$@k2xE(6_>f90(sY?C^FQ_w^TG?o%Vf
zdJtuS$^|l)oRbp|C4sN;$kbFc@C_5=3__sAg@YvN>K%T>6l-Z~yBSxnSbZ^cl2@hS
z|05B!0ylVXU)jBU*#+vpl#~>8dD3doe*oxRU3#CM&cJ2TkU)ZlSV;h!Bs#{Q4FpGC
ze!kCG9d<|%jJtx~en>zq3|TH)0XDH0cOAB~9-2%jAvUjm|NiYCsgU^ypgttO#PoFE
z<<#T4uKj&p82-U>Sb9drLR74!{ccdeK~^BY>e(GM$&R66Q4s%`^1qkTywBAsr6BsZ
z%TXxJi~@2d!=pzYCLC%&5iMaS)r-a{1i^z!XU-1oH_
zbg!w!HkKOAVKoSj0d&ehr$zSh&>*(Q60w|GEZ}L>jbtAHY-zJuSCE!Qj){#O{#}n)
zU{hA^dqZpl=kler^ofbdf_-Iud<-OCCRWxKonL}fao~!6qAQUN;6J97Q?NebQ4-qs
z7uiy=#~-D6L3j5`O&UB6P6x3P#FV0|qZ0uOWvI-(|3_o;_fX5|`E&6T*+qAeCeA?+
z`hzht>n^+k0wj!^X9M@&hQSJ#rM0z8!6;&V$Ft$usG%PeGng^eS!A#}1{HZ#i0Jc(
z?NvOk_cpJ%xZ1#CL<9yPmCT0NbpvCtg#;-6y@?oT{E*$RY@EJXDQae2@)Qz)@G$ej
zy&^xK86M_SUf!xyeqGHK>NKcn>bmRtB5@L5FzeIwUS1RUbWMm}$_3pe+7k*@@
zJEN72jcn1_GF>=x!(9Bug)hX4RKchZQEivGw7NRJtDD=%^mGi=dFVYsjgzLzvbwe=
zU8tQ~Q9%qFRS-dm#44cjgsemF8>kiM05VHhK>4Uum@{IFf4w^cS^{+~ef?$Xf(8-X4cP8i>lu(NbDEp8W;Y-P3f;!W29h;u
z!v=rN_wPA*d10OQsi~Wo)J?atSA
zMthpz4`5Odfi>?fW+%h_-G_sXjE{x5?qvQ0n};B4iiwG7Jrsk9b0a4ytpC*+#iyrJ
zIXF6+`}(GfefJv{m5_*sB@bEVHMnUg`N4nw*ug}{+26Razf%TbO=6@cnWd@l
z{u01K6U4^mpFc7$UOWK&n3$5HV1A=hbQdlSS7clhhF0UJtw3H$1r+%gFJ2(3g1r*R
z_u$YWk3fr;^B)_QG(d#Xbk$-Vzh>5rOhI7qOw08^aE*)6VbAfOhe##`1%;HM;XSx-
zprwN00HPd)U@M8PZ1MFAXNj|iFp+6HO{MY4giC`8-PX}D0=6`roc8Q%A~x376}OVx
zOk2Tzr9}*E6r#KV9SONDY0nDo7aICI
zy`G+)3|w4sS2Ih_bfTgeiD!UDwY0Q;&dkI@>{(h`COR~XZh@RBLbsyFL|?_nr!JNF
z0yGAQ=*!5!i8=UQ0X13s*)t+@t)ekDj>A_^KqUzO`lIDR-)L6he{A?~XNQM}pMY_p
zq(Qnx+y^<2aSpUAq-#DO`_^1t<6-d>;yn3hKM)ODO{qZ2jfMaIt(|lPG1n1G&SNT=
zQQp}2_feKN$Z~^!pf!(}>ZhQ!_4M=%GsSyMZU{Yk^d>$LFjj@qrDubMOyJ|Q`CP_g
zmwd-oJkz_CsD%4s!fCqRS%UvGDe$0N`^~LWdPl{4qEf8E)Qhj8mDQ
zRE{d?Zgp9i)J+QM8htt-XUH%7i7KTNj9grUpk=1Rf+bx@+}Pz9aSDv!?d8)z1ZYqL
zDJsLA>c<=d3M|AOjL*V;?CaOKNoPRlBf?QZK>_PUi}$~f#x!shMatg+(Vw9@GSqSw
z*Ay1s0r4nQWLOz{;^|pE@nslr$?EEA;tKQ_h^bnXk!u48u-{K~@Zz$wvqL0AKr|Cq
zZvnmEW&Zdb_ctMYKsZc=zh-Bz`eGy@HNAm_Be;QII89zp3$+zBG@d{T93PKo@lqcZ
zFfcGs%$N(lX`c6}AQNAr)h1Jn*WAZtNWLEkhASm(c@G2^wz
zP}@MW+yOIIsNesa_8GtuGU9oE6hIP!xsTp`swUUf!nTwKh@U+&$zw;^#Eu#O1sImaFd
zkaDCUVx6LQSpCYYZvjw2bA$3}_`yy5)^wT7_V3R*&$FVJMT)=`7X
z6p}E2`Tq*Fjl=xN_{0JemsOy&=oB5RHhY669@JUz6PNY8bfZYE0C9$hg#3b
zy$jp8Afx6J6^#Y8A&)MA>aedmMP^k7u!z}YKnZKAF!?a8GJv1J`82Y5SYx42hAX+Ua$Kc)Tr*A<*!U;vZ7XT0M$G||?m|fT6A|2E)Sj0nQ3{6r^U0uvNBXv8a
z2Qg4?EB=EW1IRUqo~~F2HrZqJjFSw0Nt-3DuUo@0xza#AR?bh-4u^8b2x4-vVG9qB
zyMQv_reQqQ4N??X;#hTk450)2>`>ca<3%d|Bik^JD#HaFL*D1lNjk&VHj{3Zn
zQ?I@~FzP|?uV8w}Ht1MVT-*gz3JeXv6QJvh7O9alh5~_EA4IywWy4+JX63n3dUW2mdC(ev>UDSR5?$V$t~!q3;*vUm>Di$?E%DB#IozI>reSuuuw
z8-WpO8vzqSsp^3JgBL;ry}fN9@P=BD_~8R?xD0Z!PAn{rBPy!}fGxza0tE_3xi6NG
zm31FhMG-g_ROX;v(&2!p0d+kLy(*kG^UBMKpx$-z-<2nVi3s=;Vrpq-_EGnPb_}aB
z&ps^kvAt79Fxx=4LL5VYiIs7`1!SC>nr!(5`UEgs&X`^Aj|GtMLG}Z%)o#iwRgnTs
z6(CkX4q%Xf&G3E&*e-Yj&l$f$r*x(?F9nPlEa$;WH(vb8k8+!_?Hh$0Knn0;0$5Li
zE7`1z*jE`K3QtmG)4!}a3R>Do<$Q*`wD<4poYZE(zoA3H>IKGR?^1qYc9v;8+I@a*
z{FlC|nOU&j0w@cR2|kHnBf$9R7GlH)i=W!Mx{Q*Nv;gOTL=D)Bg*ON26v_MeJOI3t}coB)wQ))nd%#NSN=kK0E$sC!Su|G
zzep2=0*nu$pQNj@K+|IC;D8JJ=s*i~ecY*lV?fjgcs~Q63I8OW*w|PQe#`jzi3-P~
z_E#WqK2+{<_J#%orUyWep4z`=Rj4dk`t6$>QFUT`d@km3
zl7Wf*es)zCKhPVX_v=I-8W@lRGR0&$DP%@DpBP&9NETH
zgK7>A4xrFKe%Hwby&Z@EL%=iOGwSI5ghK`~E*#J+V>obKHY5nBW&2KO&`oB@mwfpm
z1+Oi5Q}WI%4K=p=)c907a0c4dq{OMF1?x)09>=WL*Cs(&ns{Tr6dxb|G<#=cVL_v!
zu}3okm>U*u040Jty1M?&xRBSF9*PSKd*`_k5D@t3N83EwDXFS@S6d1YxTujns)htC
zZd~3Ds0+NXg}5L1nuY#@cl~Ru>8FQH5im+m$I8fR`6YBbIdd`Qw=h#zseF
zIr|~U6T2nB?g_nWoPyh`P!_m`!YBIR-MOju(RNsm>0LfOI{HvpMBRDb25ADko);wT
zu-pY8w~;tF4B{M-UTR;0$soba8|SB2Mv$6-P*U&tb9sON>%ux(@E1tvP(dYA5VFM(
zNcR9<=>ZTFa2M+T4>{!~V}j&fckXsfCjkT?Xn>bHznmHwk*?^0-n~a=
z)hA2O2f*$V$4PQDWT>!jk(9VB3WCAF0)m1eW)#pefI$E0o-RHERv-i-ZUu+kK^ozu8?Mu=N>RojmYq33MNNm4UGg{WIMV=pDfGQ2@GOVnpuDUIc__*bRyox
zQWz_0=TbLf%cS(~)1NIG3>ZK_<0jLm@abP`))->tA1?&Vc_(pbXow^kG2DVgqBQF$
z$)%u43NvweES0bFvl{36?7!btOhz*EKvUaGqIP&s3|(Oy%oauiH{C7Xc*0lNdAQ7}j4`t4T@3z%4*m3g7u(sw=lE
zh7<%FMWVe>sQNtzb$nr$k`xFzf6V?0Sn6h!!9r|z1D&5nN`sFH)nCagS~CA$?=|o{
z;yT?9KwjzV>w^cbQvbSD>6!tc@%Zs$*89>x_y+-voizQV$v7}?()NF^!H^<$&1Xw+
zNcufNxp{tZd8w(Rv!3tE_^4ACsy}BvJTSeQ`P0Ii+mqcAAx$o9)cvbllclb@y=NJM
z)jD$0|4ER3G?xyIz>*JN7E+wA6L#5fcV#JHt^V}zxyJIlw8cUE*rt<)8{luvHL~D!
zFs!uM95E;e7a$YlCz_uByyT^SsRL@q=VLndBp!HA|FxX^HJae0Y@0I
z6#3yab9e(bqoA>X7Z_x1TnqTGHC4}WS?XKgp6l`7y3M20ui{W9^mu!Fo6?+pevu2!
zxHt7p{(JR;Md5hyyA36=u63&Z5n-=9wvVZfeKVOKMw&$_d_o=-7#7T4tL${aRU4&K
zA{MR2;n`q6EHmVOn*Qa?hyAk@0DH-!J?43zM*-#Jqzy&li8LRyuV>9FXq+9%Q#
z6|j6-cyXbHwI77K4l97izSpanvu^*y2%tPSaST-8)|UW{%KqjK{cZ8gPOd?5#bg;_jb_=o0Lw#b3s=(u}$C4PbwcgVvClwu~nEzcyP<4grbxLKg{v){|hn#
z&Hd-|IW$d!D2lKw>+G|Ue-uR#o8N3%7TbyTJnxTvFG>jcMT(+86h)9_8I?+fr9|)d
zdpM2*j^j|T*UuV!kmorp%R;qUMXgrDcsypUK7+vk)oK;pZue^s+aZK}tm7OJj^p6E
zF59JjeSL+hswkJsP!t8WZ6k^zoHAqMXSUldR;v|)Ab_sxkR%D^av8R5voe0UT*5F6
zJU%|cG|h`I?+GElu_Q@wJn14y(wkE#aU5ej9z#`Cv|243TUz@4K78NDbUMX+K1Z6S
z|GH2e4hL+vTO>(>mzNg=L4e6*0>dzHj4{)79h#p6BmwfIb`!$nzZg{T^`~!}onymIYN+
z*>G>yb?Mz8A>^{H*K34f2+#A->-C_jDilS5uIn&O6RlPYnx>)MZbMNNa2$tDr-N3j
z1;a2P2*R7+sj3RoG~xR`q9~&2V}y|3S5Xw$?RM;wrYX`i#bU9*Y&Js>1XwHPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T9z5nW|Rd1_jcG5=r`Ta(k?e6KWuC99Oc|%o)G71S0AV7cs
z63+e~AV7cs?|TG<7$87^09kZ8lQ|xbOFEs-{w0!3Ce7ceR7%3(u=yU1M$NwJ>gvX0
zBaw*2VlneQK!5=6PjqNPg#7mG*<=3Sy?eJL5((jUECF`y+STj}g+gX~_wL=zaS&lc
zLxc3_(L?s_+h+(8LWD3O#Xf!dm~Fj#_cq%C1PJi{K!+nlh-~fJwX$>PPN}V}Z6vQ=
zy?U8Xmo8lliE&$&FhJgh;v8h7B9cIo^BkJ+q(R4jnqw92cm^00BA|+ASeMLMSu{
z4pVse@Zr+GfB#03gUHwq@u3j;A0q45ub=s!-*7DZAUo?H@dgd+O^C4hJ6q-*9#CJK*vYBBSeU9*|KHke+cl1BaSe>
zzyk*k$nxdO4GChxcI(#7kRPfK;)1X$0jh&*p*&HOT#xS%CZs%a}u|7QrkI3(uHEYcOs6mt<=4pEY1WjNE!p5ga
znIXXyD^?hj8eb!%ZcXn10RnUkv?(D%Adm}YD1j2l@!fadH9k7FS)XBh1%$nE<3`!E
zX_G1Igb5SOcJ7M+5Gs=BbbtT>ItJQ=5b@2u{r1~N{o#8VrIs#TYW#%|A%uu&43R*BBSwtK9$9&0
z8fqm|yF)T{TO|{(mr&w>ZcJtOI>>}V5~}JUpAie!(-4Oh_gPAs(FKXAlZYDAq-!x|@<=HwpI{DbZU6Fw%%xxbP0*0)8%G5rvk){jYz(T~ZH@utaWRZty#67>?9
zFiWb={kQDC;<0YsI&-h6VS+-K&I?A6Cx%ufs>O@KH2=eXwf2*
zEPdQ@$CCJCTX6G7_2$9{4gvZX1%$|*seC=L8Ff7D-95!GowWl`Y;pmr=4}yStiKv{PWM7phG3d
zFui-7q~5qqKmRbMai(^wgsOWe`PC>Xsv=Z!3=f=OL|@ThjKF;E)-SuEbf5%JI_V_i
zGI;5wmyCOC~Op)$aKiXZjG
z7hg1r8Dd01<6jLBAVAxr;)ICmA(Bik-r~iJO%UM&ANWAY3m_n0(`#Oq2q7jLB-CS|{-KJo7$J;8>^?w$Tlv{B)D1*PJrP(s<&;xQ8WICX
zfB*s778N5zEN^^LP;(!m2h;e-G|44eXnv>CL<+wvlgh;2w
z71UPwU21(T1coFAL|bvf|I3nWz2OV5$t^v)y>NaTo<
zC3f*mMr5`oNWWo_fgDL)VsVJpTo59)@h!>J?UaxXPAq~UsbsdkyfvXs#s;6*r^jSe
zf#aeeLLV7@rbNb0HAi+vkY~$Wb!H*)ow@7QJ>+&1(Y4&&i#hBJcqHqy0#bnXhmr}A
zSr#N3V=AL&NUO2y0Tv6)~VwrY=;P035jF*&Ichu-3><@L3l-@-q6Ow2+Bh}I%-P5%am83Spw1mgakkr-{l3H-LgsSo{@6W83
z>QCHeI(1us;0iv(V~#n-yxRpOf?u&EkXrVH#Gn3|UUZjnFNA7(igfEI;l3j!bl4FR
zK770+-@IMYTi-GJA-hnQUJ{w|NmbD&Nx0Ww$;9_ddhKhHeCu9GZ(3xCG2DN=R9*Zt
zJyy@xNkB6FgAYDvNRD=j%ESMQg6Dr$GJ-5o`0R)Lc%{S_zVHP@ez=oZzLJ$stQzyn6bl(KqDx^9Q0mOQM=+1SvVZqhso%6h`lfcskoane
z^dBXe{zpoD_79w;ygbC)2(5}t{Vu7w_Bm%Q#5MvQhYy2{t!q}_t|U_Ly(aPdzGi&4
z;Q`|%dej9H9yCcrRb4ncLnoyJQ2efIbg-f>RClXc96jv|5#et%tPGSQ@9H`8%roWObI;8l5uhzmbWnxSjTb)AK{1tiM{y}+h-sRB`!Qpt
z(W5VsbeDcIzv~&Y^N0`1gc(=K#3`rC$PvS3_}~FDbYNc@F?^Uz
zIQj%R`s^zuIsROE^RQX6uXeu*95u(g^><9X93Y|{>Z8Pi`PYV^vteqXzM1Dt!gdMc
zR!*e%te3=NKbBD6(Nc5ye@o5BZdH=IO2UIDHKekP~0Sye7*rnN700cVnOCJ3&p;gvlOJ4K5iCmZ8qUr_nCmo-i@+r-7;A+
z=rS2SWu}R2cd1e{FMF69Y>VlgjTt>kjy-LLtQv5RY^_sMuJ>S-#Cgarl~glPP31OJ
zhZfu)L`cVB0o}LWdMmr9JkagZq&2DHuDSZ}5*~S)wt_>|d1~=PB6~I&AEHTW*MTH9
z{krU4e`I#7HuV=8d1`h`#|9)tjwr--%{ABLRO$E>@u#EsEU{g5(M9HeKj0I_%*OoY
zHw0%$UklLoD2fmXq~I&TgkzpE^OZ|MX2&W?GmC`OmV9KG1&1_9OxDzQk+CC(N$;M8
zE7Iy%M2?;`QMSg0$<9=b3Abpg&F=L8AKBp(a+>e03EtR;`evCh)Ci^(N~Bz{&SR+G
zNQs^KmF$*7kx}#4EU6~=%e0Ba>m@RFx=C`+g>?N+vm{&eb*Bq
zc@&!Gmyt*&Da&M}44-hU^yr>jz0uJ85RFD;^oSv{e)Lt^#UVQ%LZpEb5a`{0-g^Qe
zlF~uPM2X{=FBhTe?nWKvOJPcHSYT41h%%E-!y*^4GryeOn**^fQZ@A(5+30!1l$=w
zpo4`;^5LC#-Z5`pMCsu-v{N$kfxg5C0)-fDs#SotN5O;$3G%8<9wNRi%;r)+N6XZ2
zca#UxuNj1uyf&qJNOj+#(zkb00^YlKuSrb-L;=6_r7z{23*5D)S_TduCu;}HkVuN9
z!J5MO7Q6LTN!fm0GLIh-GYyjrr2;W>&*gyU*Blbh|34G;H_$;Mdd%e#>YiKifUpu`
zWKwP=)e&J;Up_qg=%bA*IWZvP>S!)^ls1Z)%()>(R!CB0T#?KQZyh%oct|`^p>UOl?)-?LqkqskHaN0KFF2x1L|
zSk3SzfFQN=3k%A&AW#P68Wsxbnb$7R`52IR7La30A@SNj4yr>^a*jH$Mb?Gv3?SfQ
z`vFQ17Y74aK0N;T<0b&ZTz{S;FIo!-vHhSRLd18)v^-QI4FJ=*SeSgb-a{nRZs#NF?|tuk^5rjo*{m^0W5ef0Is^d-Kc8aX
zfkS0?_ah|aPOYIFMj`fZb|y4gVak03g>2Ro1(A@r$RX*1Vz}Eh3?wgOrTYj^lopnt$dM
z08XRws?M;aWv!aak+IWc*kD$^c0h^(ii!8OF!c%Zon%)W;M1p1H|9$&1zVrU$nyJs
zE|a%BB*|#j?APNV=;)MBNbHoBApq)e&YU@oOM4NJ;vF-EzJ`@|v0#!xh?rccic0&P
zlJowm3h`Eb97>4E0}?&vLlQgd+U(xSA(L#7^n0(G7lV=N6sqYVq2VV=*yX28Z&~il
zjYhfG^pwc3I_U*xkw!=C11I<(JUe2p97cz
zOete&uVRs5M#@_40L(~<#3WSRQ$hnKn9546dQlrbfe?MrI&wM>+Vx#
zHS32G9$ozXH3!W5#~ypEamp5;Az|X9Dhg>RC`9{$DoiyJg)ybeMS9CJ=S5ulj7YD^
zKu|PdRnWX>i^X{jDdmC=Buw#(o%ip~Oa7Zda_QreeCZGRAZiUUnt9UrloeHaj>wp^
z3@In|V_eAEW~#}T>^ssNW083IPm+A~Z$`~VC(M%Q>DNel-F&m%tdw-jWfGn79le+A
z4?Hkrx_pkLcf2d2mO=F;KQj?{3lwtl$)8GkvyyGYK9hx6ow9ik>V1|np2bkcH~18HqoJdhH{^!~i%SeTH*Ue$4ideB>jhT@fT=JLg8he)z*5&Yr;meDK5*
zPZ;9lJd}^)Aw}-(f(tG%iR{c^1DprZ;-0e&DH9B(O#Gf4PdDjOHue)tB-fc^I5%Ra
zr4jizMfSTdAVC%}r6S2eWT~oRL4KN9y;>VSZJY%cGCSYX|LY}u#1si1rY0=BY&uC?
z`OqOoOy>GbwWNCvRV8(Bv}dWYuYdjP#%#unhiEXJnO{vs&Ye5gRG=Tx)Ydo1fz_``
zpMA?DL*M{Fh^j84XIyLkuOw<~>*UENpJ*gQb6?pH51aBA^42|+2n`5D$#Yncp$`cuuvd7IxB+{gmC-qw;LZXiV(8Ea^bo0H^e|n
z4!_|U@;w(A{QmHVKbZDGW&uQZ`Q?`%(w-lF_+g_uxd!bC^V=_Z9CG^m-~Vp<4a5lv
z(x=Zk=Nw~IK|mbC2U6!4EEs(8oYw*(WD27tDWdBLB*>2b#`&Lm>M29efMXa0uDa?f
z^EZIx@3`X*W93mN%-X@~apSJL?lRUW_l}~*8k#k0R(5a8BCijT&dP(M0+GL^EbV1f
zz~0S<|D#-MayQaaP`_`Fno3X0
z&fR+&$q;Z~G(twjLKQb1j=>01gx_)BG^n!BwYNmizFw-Y{F5gLXtY&JBy4vg&!mBTkjb$b+QJY%TXo(@<}yzE6GXQ}W4Ae$xDp
zV#HGU*vCF5pZ@fx%}P)xqi3FZMt=9Z-x(E^3#c^61frwwk^AdS^hTiII)QZQ5BT^|
zdR{;*T#NR@hjw_`WtW)`12KUhND&g|np}@|g&O0#1>}p_4>Lx17End{wJ$V-R>C}4O-1S&n>sFo8+ZNPQg9YS=&
z5+kZn2{W}}p`^Dhm(by3C3?b@67E07m~A~nN_d-^zR(>%34s*A!$U10;d#yH4}bW>
zMpN1kTQ+Tw{sV?crbsTtV&KrSL?^L^rAOhR0C%i*&V`A;d%fA5*}FyJ4_>GD
z@vf@HY6(x&-+ERyVrpS>{y!b%tLif{{3H`acLQQgzWsW4v`+}hnuHHL@Idy6gTM;l{X{59`W(+1U$YmeH3-fQ
zvM4?`fdNDTYL;?x9RFW($t8#Q7%_v%jpTf^P0Hyu>#-8Cy4cS-C>w;z%jDc(5eztk
z<50*11Fd3(C@C|)uPt+-WrL~Zg5V;{9JP(u6hzIVi@IsK@u1ZZC
zw|#JjK)2h)9WYN)YvxJvy;mhPXp%&Z{fJZ#94ozJaapHjaKn~`_mI$NY$^*Q3aX2T
z;>GU0wG!I1R=W4-BALU6o6c{5A8cslW(w5q-XZmO{fpG>S}8}SmdVL=&tL#*S9cyV
z4;bH}+iy|`XiWSD^P6-d6h|eHcu5r^3YkCDbY_L|Q0$-rDhH|MPfFtT+qCdHm@*=0
zT~}XnlagZ7^pw;)&q#XtQ-;h;{$rmJ67i6g0qrO||D9P+1cK6P@-wY4di+&pQQ_Em
z|0&V&XJ>zK5Q(RLq5nF=UZ_UZ@hP8eYn_Y=n%N
ze4=brLQHCzykPXa@x~iXqi7Cm)~%P(dtWm#f^heN2MJL-U}VU#4k46@y7~iB|L~8b
z$IiEfWwYW^Eu$Ki$qDr@NJA>4Wb8zjt=Uj4cn;P@P>Fm*vp{Tinx280q>)Lv7bYkM
zn71ij7KZr?@g(XcqH2pw12f+Z;&RvX|bC5eN>eyK_%nH?ZO(2
ziP=9gZ)wDrNpJ+;p%>|Gt0cX7kwdr)fT~W-LLMHZ7T)KSLH{vr@`#g-e-a=Ja9P;F
zn2wF_tWe-`vcGlOyEE&{0zx3qmt!CV%u{cUB7|gpef*xkAs#O{FOM>DEfgPW)C+<;{GQ{u9zx3c1`$>SNbEjbKYoEFtRJ|B
z5z1SvcCDr`3F;L9YCpC1HAA-e
zgz+23jycp!O1^og64nZ%Qh6SfBRb{k>|O`ytt-r8wva$%@`a{;IS#T)Z(Sx0_g*W>
zrH^HgZVEJE@`c|z&zrUwua)S@pK^A(p=D$tV&17^More?bdf9RD%M=4^FuNy#6n?J
z7vMfP4}N+(u;HhNoal3q4=HZeXJ-L{l2O4ikPB_!JB=3e7v*Wm1ad)XaXmL6Ac8Us
z&eS{SgM_T&rEI)Xn7+k+%Is(6qUtD
zwghq#B9%(24dxjY)*RvZfyG>nU#b*nuno@K!bK<)0GQun`Kl3v>vs4`S#qvdae
zcHDTliwr*XGU?Z^_<_X@lpzhvF8EN6*_=rx%&Qs9fM67yDuE*_7tKp8RFlm_@|BYG
z{H(O?eXT%x^V^b~f2SUoUCK?%5S@6?5pR)v<2IAt10o|%mDsEwnSs`jB7}ROR^pHU
zrzG?^FH(!{m-PDVf+9+Kp`j=E`aTm+{zNa7tqZM_@bHtgZ8)Yq1cfh+y0^-#ko1}6
z07==tg}DqNKq`=@R~@nszoR85NCR?#h}^jI&O1%}u*X1hUQ?ODdzmEnY?1K;m84P)
zlEME(RJ+e;J-2?xXV!O=_S>c-RxvPU@*`>{?{>^&J+ZSx8wcl4V4_d|p45yv)U+uD
zbO3y&{Ljc*GHSOP<>e?dEu@;0(F(mB3ROn>i}A%_GP4r5%NJ)sASHx<(WsX!aZbM2
z*_lOZ^^1~T_l87|zcRZ;i#+-aHIcuqhofF}P}6%rH71|`y$P&XK$xldcj=k&W9v0Y
zI3IoJb3n-wT{fi2^Ha;lJBQn@YD1@o$ckOy#64w`bMQfp*>j>mEg|3n@}^bczr;G=
z7>>smO#sIYe07x5k|h1dZ=qU93M-HlE&y4PY6E#%xK$rqaP-lKF8s^1S?a>NfG9fy
zwLLFj{yq1|H6S^!&lQEtd8}&W94Jh$ifj$!Bt%RD@}9_{DrK23!232Fawvll8v!wj
z4CyX1GP71Tu2`UQ|8-frVUyJFKOkv(pklv{e4Dpyl{e-ul$CG2A_KS0laa|)5*x4b
zTa_UBZ<&TVlc$C{m5lvnQkw)EV-(D5}jA;Y90!^n*9O4lQ&Iom4$
zo(m&4jSB@|DxCb#japbqW*GHT4IEj>3rJ5R1+@{KzT@fcs8
z9-Gk)6Y4oo!abWFmw4{K4H+_Uxxq4K(KG%niOONanxxvGmQYC$j3p1Z30w%sQRKH4oXe6P&k@%Y
z
zShN_@qzu;VXMlF6(m?VI1h(G%TnzW$f4}*iy?4m87*|9kk&_U~2V!)f@(9Bh4FVRb
zjw%bSRQ2drB6&%
zVeL*yu6@-kfA37^((`OyB$2Ua8OJ|`N|xQc_DF
zlkiYgHnc}pOJ}`HmU(j_@yHLHSKtzGF&i3GMK;ZSqvKoCmW~ZM6q6+YDUgQ;AO{GD
zeq~?I#-sv!e*X6+D`P72%pnZ`aiGL3`C$V8;~)Pp+uX;{M%;o1(!KT8TaCKqIICLu
zPLi~R4T1p91L?WXLzJ6$$Y6@2G$Cl}h2z|2xAj2+&f|?vla~px+DJO*fau*ywKd^O
zh&J5@lqy?IhQFD0QVDhFMo7CuNRpYbd0@l4C*`<42jtX&2{~NEkDD_K&3d&Luu(vZD+`
zGrl9;MmJR>l>pC#5tRmpPmzvN3Yv(bBzo%SBr<4{8L&+Kq4IhSbDoJJG4EzcubwMa)4nZ<2d|d{w_d4=
z@4s|U(>4_zahgMT0H3g`Oy)Kxp8b^)?zi;Rj&d~TukO(#KQXoV0rO7q@Q`CneHyaW
z_7EP^)OEnXV+n#ziyNsJg-D7GK?)QXs*H1y6KFxufo+rl!gObK;Jbu02(nm3$1(1{
zdE0Hb84*K%p!NF!%4lb}U`qe(Z+|lcg@4kTvYeB60rzDA!P#>FcUA;>lFT+ic~T}D
zdFMQs@YY-hxZG^LaZa}zfb<~}wIOj+_xj-+Bzn8A-J0+vL?T^8mCNxTGRorHX<48c
z9db-&B9e$VNMh>>Np4sqDK(435|4p-K2d^hJ(1EBC(JD!;cuLam&6C6vKas@KHyM8-Z|BQ2>^)e2;i!`IJ0`Or
z&T;epEYX?Yk<8ZRlG-p|m`)g;q|ehi`XG3|y3vrC-cMxQG>Jd(ZS#Lri7joD&H-eb
zP3K`QbNtDhBzD|KoVP4u(V$X$4{3HPqE$VGfJiPKAMmW`?95AcFC>e~a+8215hB4%
zWh2iJlh#d$5FASFx4-?ZQLvDqHE{vwAm~B#7A5xAzy8(yh8ZSIWUwYW#}hDd=R3Mn
zx;O^%gp>)OphOvvKmPHL8^5MK79u2B+kGE!iMfE%{-+VT
z8(^VGswy&(UHz?z*6QFzo#g_}6(3usez&CeY*d0;prrLv+5bP&B&li-UtraxzjO{(
zn5l6(2$}CnSm|}IOT#^1S9N%|Ss;O_f5zu$Oj&zel?k52Z~v5u3|F1`6(ux1|H|i#
zlI7UQh(lM1$*g-#|J8HB>*JS
zEy>Wl2O6>?p&JropH+|$ALi)qfB$g9_H;f65dZi6=EN%qvTxx!A0pT+JkNaYA49dYI
z3Nj@)j{0Sg@CK7w6TXBd!-Qq_h?=y%wh(r
zh}?C?>M8fnZ
zJ6FDH%uWmD|1yuAUs2Cm_nJ3D~E<
zNxpJ(V|ga1%e@xt%*_o^JZJm&I{Llp|MH|Vq|7>ES35!Hpc2w9-G_%K}#l7NK%_{Tq*U<|(_
z_msK!%xm^rr3jL->W}A3Faq)*Ld^S}0rQ2;^P(=YfVkN2o<@gN$GJGp5*kE_D#aYd
z{C5XTATe*?1s^8Aa}NUijpfK(ZOTjjA!a)JI1lMGs696zT5G{jZ_Lx?z8Daw3+j$@
zaBftmU($DLBBYgeuy(UR2IKIhkUV5$ZLvsiTPdk^Z|c)+PQ5g@zd-0i$qST-c9>B2
zz7p;;QaeD65@Jj;Aystvlu!qGP^&+$zw>KqCVP}2)u&__PpY{%<2va!*=M?0g+ari
zG190|2Q>Cl7T!4UhYL)k*@@07=xj+BEt{K{Ao8>CJu9yfCOL%_!hK@$fAgE)JR|_iZ?C`pdh@>}Rn}Hzg&fXFfXA-&
z$$r+9EM*c%rQl15jBv0$J_a6aTZO=jgEAJKA}25E4jQ~FMNC_XRBOjzq-F%n5<)I$
zhm6nuv7}e4>E>33Kvh<>OAm=&c!Nm);s=gWz#}6niLZr`9<b;1~oU
z7;hxn3rtbBpVH!|KmDmGGuI>F^4;%#H@n9l`1`!&Aqa#5Mv3yl{AG2YT)@W(;h|71
zI4=YbI0x++*8rs1R`4Z6BrQw%Apd#L#fHF>$&_*SHZ(Zd@_EtR{zepVTtVlu$7B_O
z#i7+;R;Z!;t0!ht0I$;*P^gfjd$;x4ui?B?Uns9}}j@;JgQ!H?lqdFM0
z7@ge>EkJ?LXC8m(dy;x@o>9dNs5M_wMO#LaetQR&1%6F{lEvIEWuct&ji%6+ub1Th-fs*P~vJ{PB>et&;38yy`2+~p;f7s6G
zQs{R46s@s6rr)DgHPR&(mJjZqE#oq4e915wipsM!XUjX)6QwGgI^;a=bNg+lPJG6q
zf>F+IJ3X{+5>Ne15)WT5iATOKiD!SE-O&_@H|{V&7H#kn>N`TJ&aC|VV_Flm39N-&
z;AL_6{Ah<9OOVHp3>mE5(+s^pC|N%y1jZr^ZZgEe#5ail@rE02$Zl;4(syiG@nfybq9@bJr4~7
z+3!6+1c+1Gy}g{lhG-rQlJnZc+W-zS`}deMAC?mf;a~JwSCM4w^a@pwRK55J?e07Ta8;QbC93Jj~N{cYeN85jHW@!fv-w
zJU4P}=i%ns?w1q_G3VO8b^A_9=LZqq{vJK@Agu_xwsDX)m%Q@`x06&Ec#%4#LU3y*3{+0^gmu{K){E*%BpGK
zkVu6VwP-7l&cgg;0x5oNfg1pbQxW@=53BUCIk?8p+U`~2LC
zCEQ%w%LV7Ot_7}OPLpFC13rkWcF-S^LV=?m&}%iTR&<7V9c+s
z`Pj|=D|2@+*p;TSn7pe@6CAaH6apWl$K+~~*
zpY3)!IuAG3c57A_vYq>|X0>~Jqxqa-0-(sr`{&A#1;@Aq;s*^}H
zF2l%!zsqeZ=i3g^;4Aanj*r4^DmS;C=}B&d#&!s+XYW3;amQXctL||bkyzoY44r85
z8S-w;B%Yab`Mz7v5U1=H$i(`1J5VX!1;5)vZ6&pSQO4@}QvRUXd6?+`1Px8w{W
z9!Sily%hq)6od$&0{Q@=s6AUWzJv$~G7_K^k-1*!+#GD$jrBoV^5K6=6uGwZzm?mC
zZl}T_y<)aUbUV5*oJz`QWAKF+`
z*^&h}j?HghXjCkyM2L%r!ia!l6*6Euj@;WJ4OFGqtY$mrF#ZqkcFbWvvzqOG
z<}+rp*^Zg4f1kYnc^Q^`H;0)Vk_EkIO3mc+B*KESE;AWbYopcf^Fw$}v^ux>%-?oj
zDZu~AbvP%k4NI~C-rryeFH&Gwh2|5V_=NdhEExj&6KODLEh|ox~z_lk^0?R^gKH`D_
zP#SVd6cik!#hgsiMT!CH2~vd|@FQ5C9)DYf$GPox$fA(#?&z)E4uR&{Zhd!b=WpF%
zqRBh9ZjxzrkIKlnzt50p^7A#*<(-;I5>6hFZP|1gdmhfub!-}qdpq~YvQO5ucW<|E
z9%DQ8i@&oJK*ac5@g)X1hyemr4mk-C)q(oJSzl~&HiU?Lr{e=i146*3=rx}?1~b{u
zd`4v!vmMpsXKpu|)y7OFnyhBBkI&Fax(><0UNfb7(xGNDrm0`Fn(c1$*^(ar`)#K#
z@XwYS2*FH-2qFBoTp1)lfX;@Tgh=PbG^5jE>J_~4{2
z72FSl0;-w8CqRGzl|fEIB(%=bQV=3(FOXI-Ab3Gq31mSB2AI!&=4~!>INx@+Ic&F6
zM(=jrVb&_#zGah4t$R#H#h3e=$yyaJbeYy@CU0?>w^reCKDXIxw|mWDzwLm(sRQ0w
zTdLm=pDv^fA(G(gU7Zi80IY>lF(kQ@qRulhu+0A4mf;nK_V_%q)q~
z(f!QoT-!OfpZN?SV?JXhbCa0K!xO7~=Oz1W}&$83hOspfbowh;(c^IBE=k6((vaz=wAB*=L&tCQ&yK
z1LVbdIVacPZ$6MO`!RdH+wJju_dDKi``%i|OrDa%Ob)SlX*wgX*PJRV!=t4^&1Bx)
z>vw){dH5ft)?E21Hwm%~0Mn;WFMEk}0x76=&gp(LTY#1YSr_E^l{1w!K>LSpVzvdd
zAW&xHGSL{Azlh2y6_}4CeM2O+VR_F-arl(IJrt2tqCt+`^@NO6Guf*Q&3k+!RkFDM
zxw1MoR${KCYd1JIL}!(rMRVIZ59*b{1VvW~(-yL2X(gsku|O;exYWRm1*A=9=fg8W
z)!Op&o%_K;p!_YNNO2)>Ee7EB3f2!~W)Kz%byDm^h1LeolyZ98a%+M1L%Z?zjgEl4
zgorXV+k`lTcyAhPZHMKdZpxC;NF?X%ak?J
ztQZ_fMQe|sE7LBpN^s4z#S}RN5ABp!7nI`~YAfU&LYT`;X91XJHd(tPAU@|t+5hH!
zCa2I#hWs6!`mY^|3~B7-HcCW~ey5Zfyl%pkqwNl6|EC_~v!0Ip5Kl!!o6^Iwgi`s4rG9)Vns}e#)
zO?O1(B}9|}9f5g`bVL+mM?n0E8zuGjBOUn5K>9M8;tQiO
z(LmZOu>BKrZcs9uEmGCx5HjTNs+r$4Z)odi;2EIOc?OuYl?bS~eS(;SWD-D5eq_tw
zh*CnGLYn1*`vLAC6N`^R&ZH%^6i~$w?&+tW-mFg)!p4=rqN@bO3Rx|tt$^AlJ+7_D
z5KylS*bKBC70nVN4FQFKc>y`H`b~QUWSCs~sJ}AQza29<_e*cuGidM-6|bN~1&~%$
zNuVxphUfF;p^h+%IL-}-6jQetFm2KOwl{0S(wSOPU07=e6F492%F~pE|CyoG(q?=)
z;2kFnk}XZzv_t&N1o*tbROb10#9)d=CQTQEEh$Ggea}~ixT4{L#QwalQ%h1cG?X}6QbcB@KIyJE?Kg~5H9!0dA;xH
zu)s9Le8pEr(mq6NS7M=U^4<`x&2gw%R43P{;Vay
zt3s(~{K>qgfV$wh5oqFm?BK<{!V#>N-B!`d98
zlY|E!ExcHs6dK1&4moCW2UUic$aGZlIf;0Z&q*h#B_u#H>Y8LWcbA
z!yo>zNx-KgS=eA4WhY2OXGL9l&22iTO?<~k$7?I6PW2CV(RuH==N@w`fgmgv$_^+G
zgok>jJSY`NmaL#v-ME$Kym|8saS`mo{Ny--S(H1Ms-@o9&v`kP
z`(U78AO*}gW6+|m*#{T|ATF!YsVfF8_Oq-%E(M64_P|S^s25Cfj)xSvmb)(4&q~=H
zSsj9c2$7p)WTavlDHuK4DnS)urU8%!gkzkM5UHM4;s}pCRjM!jr9`J(Et&eAdUQ6L
zJZ`%4<7UA9p@KLsor@8iM$nc(+1RKdQO;b-sZ`L3>9986G#7A{&pt+56+ecg_cib8qwkt41l07qlCGhf3mD
z$^|Jgh@isgH|&SJ7$7JIga;||oo7Kk^S8}gdX$N4Q5oFCXoHc8f`7K}o;F)o3M@PZhmWD*<
zq(T{~sMOX3jhPXQ5uL`(h=gK-95JD8zwI`&jb!WCDW8$*bN^jpXMI(o6EDb~Avd@$
z^5GZ}Q5u|=`=e1{eqbulSX&!3YRbaM3mGz6m%3zFF3=%q%yhzBgh<`f5$FJr7S3}>
zf=+6c2_L=#NB}Z`1ZXRCMmjCzg$V~Spqv2rXM;H?B8U!^;{}5rbwDSk9_YNE|NQ3-
zu|Q-D8mL0bh`PhPGb+0Xh?}M`Wbqf$?D!vmgGZ0nku+E7;DRyCgF4e2GrZ{URIy5#U?F
z%)y-Vp4WbO;P}HJUpjYdfldYi()sB;mCo&g#ON$^5=#_*Kz%`QJa?22oe<(dDF8YS
z9Tr6baX~25r%m5saN!!Z{Int4(I8vemL(f}XAHh>P)@6YP&t6_JTH!?16vgaq0&jY
zo-H5yDG%l3+>jY<3AJZ)AUPi&tOA?w$$rR&zqwxs1~tvKyitBD7OaAYlprIB3PQB%
z&mH*SZ=Nr83K3epdP3LI;2%#l>+z3^8~rhjVi~arNLXpWJ%1b1O^N`8ETBqL%q?_
zAt1Y-@>9?F$mpClI6%jxV{v{+4`T3|UYrvWqf_!MEO^#*e%ggK>loaar9s=kgr?&{
zMwG=~lQQr;DU+LMxIT3b>?{k~x;+=qgu3vH#8ZzDBIn~6?g{c^Fry8jVmTK?YXO;Y
z48O&E=l8ZwX=m)G&hkZ$Z5kZ?5pZwR5k6D=x6}{UhqO2!b;da%L;gn9QWw+>0*5xv
z^P?4|UAFb3Rl){lBv)LyMva5!gsG9f$@>XKg9a@p!;I03I3*k`W%C&y`nR
zDOX%^g>nAUnb^m1JZv5;WS0;4W>5}vY<^1vpi%LPL|)a1kA#t(?d<3JG=Q{a}1ru
z-HG{|XUTC8ll6}QIv;gQq?r!pm$tz(Lajg?C^0~tKs@#tq1^7e>n_t_X_o-k3Tnp^
z805$?n18e*2m!LB449F0daeyoay?)NU4D!Egy+EZyx<oolv*dy!*A;CnF&Zg+|CRIFmUKjgQ}RK1>-p
zFULc&mK-r3X=r{OqY|J|)4@?X3_gt1wu4p@3?9}zgA8c+_^}{klm{J)M$dD0-z&dC
z$w8JV44#QqK5V0nPb#mglJJK
zJTuw`&x>+$4CjQ5CKq>VDD)28j9#6U=!gtSOp&-Lsn8|8*Xd2ZAteS|v3T|im5F7-?K
zZQp^+s3(r4t|%)?mS=_)h+3uYP|1{&^HNW!XWAy^!{5mB<@wtIrZXV#;tsjMgT%Q?
zgprN}L6*C$l@~N<0v$Xs8YHUF`ayC5#lXX~st^B%jheZEPYk8Ub{;ss5gJS`(BSY*
zT2iDutT>a;lqnT-BFGvg!lQu@Z3k;fKn^Gt8b2M4j_R#9FQ^YXQX$~nxdu({lj{}&
zuE}|Fohu(8PH#Oz7ThOoCKrk+U#WnUAt`$u^8e^pSVGO+EA0{30muvQebYB`JzIQ?
z_<%3E=%OZmL93)GORhnoGoYkihI(QI#Ux=w;UQK!>I~8H5P5ivcFmC?U}U6G*#>};
zvnGWF=R--_27y_Sj|>5-5mU~BMnRCHCBQ&~D&?A}Z|=LL$q>-UQDLYNzBfmPpinXd
z`8stmWWzN}Aw%F-j|__-U|dTx&6c))LM&ZT&r!0-XU>z~ZC)PZ?3)0XjeM$uYBq_DK7}w};=6cGi-hU!nZyx8(9-
z9pIWORe^T~ltqY)Y&dR-R#BOJNBUO+C?y&MADqC20{L$n7K+YmF7P+!W2z)@qgm9N4*l5aGU4>IyY$JSOfGQKDmM@l?GPN#TQ>}24NH_zUt=O2b~>d
z5h9>c@h6ht%t%MXiIBfnnH39bDq>2IPgMvYEm93EArgV}5*Paz71>W23ng0|+#FBi
z<^M`GTGTZ;YBWm9h7Si{D5M=AKuZJBfdBFRPJ|X^6Cxmgk4mLu<69(UfbUjOl>*2W
zf`cRojues*4Vgf2{D$8`d|oFo`yg@l^RbDz&4IKAOY*n{Z2CkwK%Ej5hX5%jK`Imi
zsSyDJ1ZaI!gb;yEEG24%KM`d|dP}KbjeZV6H;2C@P2yLV`Tlk9x$UChBWtKgZ#e=DN9npAOTW
z^Af;-#8GM}U8^uT45lFP_#oW{4-gASEJi
z_#Gi~h>JW%uFHOilL%lr=@6Wc#8=cWj1dhUm5IHvybCR-41q6!^62;0r
zTa(#Nzz+~0K>I<96Cz+*AJftx1oHPFMTh}Yv7F#Udj}>mK1xz)P=loI@L{TBkXjQU
zK>I_h5F)@V#eW7NqK=rVM#>95G^VIka^^={1G2|&iqgb~iXtX26Vn;99#cF(fB@|e
ztwx9dGnXI+rZcO|5Ya_JvECr*C#Cup+Y6{le4KVoJxpT0qYBAeL@5Rc5TN~{RSD4o
zb%<{fk{~q)f+W(5f8=oVt0mvWM0Qbf{1}1WV0PP=bLWmXw8wg}D
zqlCOgmi$675{Q5p+18%tSmFjCa?A(9BjpEk7;6C%J=h6M4yK{CwZ
zAdQBg1QBY;2j#_r4{bHqmlPi&<(T`V_t>)Vo$ai$1397y$z2Q(AV9}MyC6h2P>lE&
z$u}f0f!RrvmSk*vbj)kExqqGB#HsVfj5
z;M2Q;n
zL7ieYLx!A>pbnqFHy9v5=SGJkL^mKWOlrsr6==;}h!As`{irx=R&y-G$#D=JzroD5
zzvCE`CC8u=QIVDOO$G=Mpnao56QUQ^7ia;|0Ze4}@jpZd@mU`se_I6aF$oah{f$mV
zhyelw2v80x_D+=m0RjZ*=m-cgK!5-N3`G7vMmZszzhx7600000NkvXXu0mjfacsbG
diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp
index 23527b9c..beee1614 100644
--- a/src/main/webapp/index.jsp
+++ b/src/main/webapp/index.jsp
@@ -1,7 +1,7 @@
<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
-<%@ page import="org.t246osslab.easybuggy.core.utils.MessageUtils" %>
+<%@ page import="java.util.ResourceBundle" %>
@@ -9,11 +9,12 @@
<%
session.removeAttribute("dlpinit");
- String permName = MessageUtils.getMsg("label.metaspace", request.getLocale());
+ ResourceBundle rb = ResourceBundle.getBundle("messages", request.getLocale());
+ String permName = rb.getString("label.metaspace");
String permNameInErrorMsg = permName;
String javaVersion = System.getProperty("java.version");
if (javaVersion.startsWith("1.6") || javaVersion.startsWith("1.7")) {
- permName = MessageUtils.getMsg("label.permgen.space", request.getLocale());
+ permName = rb.getString("label.permgen.space");
permNameInErrorMsg = "PermGen space";
}
String mode = System.getProperty("easybuggy.mode");
@@ -22,15 +23,19 @@
-EasyBuggy
-
-
+ EasyBuggy
+
+
+
-
+
@@ -214,26 +219,26 @@
- :
- :
- :
- :
+ :
- :
@@ -271,11 +276,6 @@
key="function.name.slow.unnecessary.object.creation" />
:
-
diff --git a/src/main/webapp/uid/clientinfo.jsp b/src/main/webapp/uid/clientinfo.jsp
index 12670eef..7879728e 100644
--- a/src/main/webapp/uid/clientinfo.jsp
+++ b/src/main/webapp/uid/clientinfo.jsp
@@ -11,7 +11,7 @@
-
+
@@ -23,11 +23,11 @@
-
+
-
+
diff --git a/src/main/webapp/uid/serverinfo.jsp b/src/main/webapp/uid/serverinfo.jsp
index 4b575b92..001eefed 100644
--- a/src/main/webapp/uid/serverinfo.jsp
+++ b/src/main/webapp/uid/serverinfo.jsp
@@ -11,7 +11,7 @@
-
+
@@ -24,11 +24,11 @@
: <%=session.getAttribute("userid")%>
-
+
-
+
<%
request.setAttribute("systemProperties", java.lang.System.getProperties());
%>