+
+
Hello, pxUser
+

+
+
+
+
+
+
+

+
+
+
\ No newline at end of file
diff --git a/web-jakarta/src/main/resources/enforcer_config.json b/web-jakarta/src/main/resources/enforcer_config.json
new file mode 100644
index 00000000..1459a145
--- /dev/null
+++ b/web-jakarta/src/main/resources/enforcer_config.json
@@ -0,0 +1,5 @@
+{
+ "px_app_id": "PXJWbMQarF",
+ "px_auth_token": "",
+ "px_cookie_secret": ""
+}
\ No newline at end of file
diff --git a/web-jakarta/src/main/resources/log4j2.xml b/web-jakarta/src/main/resources/log4j2.xml
new file mode 100644
index 00000000..2a22c75e
--- /dev/null
+++ b/web-jakarta/src/main/resources/log4j2.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web-jakarta/src/main/resources/style.css b/web-jakarta/src/main/resources/style.css
new file mode 100644
index 00000000..e218f83a
--- /dev/null
+++ b/web-jakarta/src/main/resources/style.css
@@ -0,0 +1,115 @@
+body {
+ background-color: #848484;
+}
+
+.container {
+ margin-top:150px;
+}
+
+.box {
+ margin: 0 auto;
+ padding-top:20px;
+ text-align: center;
+ color: white;
+ width:350px;
+ background-color: black;
+ border-radius: 12px;
+ height: 350px;
+ box-shadow: 3px 3px 3px #ED1C24;
+}
+
+.login-box {
+ margin: 0 auto;
+ padding-top:20px;
+ text-align: center;
+ color: white;
+ background-color: black;
+ border-radius: 12px;
+ box-shadow: 3px 3px 3px #ED1C24;
+}
+
+#logout {
+ margin-top:120px;
+}
+
+#logout a {
+ color:black;
+ text-decoration: none;
+}
+
+.form-signin
+{
+ max-width: 330px;
+ padding: 15px;
+ margin: 0 auto;
+}
+.form-signin .form-signin-heading, .form-signin .checkbox
+{
+ margin-bottom: 10px;
+}
+.form-signin .checkbox
+{
+ font-weight: normal;
+}
+.form-signin .form-control
+{
+ position: relative;
+ font-size: 16px;
+ height: auto;
+ padding: 10px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.form-signin .form-control:focus
+{
+ z-index: 2;
+}
+.form-signin input[type="text"]
+{
+ margin-bottom: -1px;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.form-signin input[type="password"]
+{
+ margin-bottom: 10px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.account-wall
+{
+ margin-top: 20px;
+ padding: 40px 0px 20px 0px;
+ background-color: black;
+ -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
+ box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
+ border-radius: 12px;
+}
+.login-title
+{
+ color: white;
+ font-size: 18px;
+ font-weight: 400;
+ display: block;
+}
+.profile-img
+{
+ width: 96px;
+ height: 96px;
+ margin: 0 auto 10px;
+ display: block;
+ -moz-border-radius: 50%;
+ -webkit-border-radius: 50%;
+ border-radius: 50%;
+}
+.need-help
+{
+ margin-top: 10px;
+}
+.new-account
+{
+ display: block;
+ margin-top: 10px;
+}
\ No newline at end of file
diff --git a/web-jakarta/src/main/webapp/WEB-INF/web.xml b/web-jakarta/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..b378fa88
--- /dev/null
+++ b/web-jakarta/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/web/pom.xml b/web/pom.xml
index 6134691e..7139b319 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -8,9 +8,15 @@
com.web
web
1.0.0
+
war
+
+
+ 8
+ 8
+ 6.16.0
+
-
javax.servlet
javax.servlet-api
@@ -38,7 +44,6 @@
slf4j-log4j12
1.7.25
-
org.apache.logging.log4j
log4j-core
@@ -46,6 +51,8 @@
+
+ ROOT
maven-war-plugin
@@ -62,10 +69,5 @@
-
- 8
- 8
- 6.16.0
-
diff --git a/web/src/main/java/com/web/IndexServlet.java b/web/src/main/java/com/web/IndexServlet.java
index 205a3e3b..98670d15 100644
--- a/web/src/main/java/com/web/IndexServlet.java
+++ b/web/src/main/java/com/web/IndexServlet.java
@@ -7,7 +7,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
-@WebServlet("/")
+@WebServlet(urlPatterns = {"/", "/index"})
public class IndexServlet extends HttpServlet {
@Override
diff --git a/web/src/main/java/com/web/LogoutServlet.java b/web/src/main/java/com/web/LogoutServlet.java
index 2c525648..6cedafc4 100644
--- a/web/src/main/java/com/web/LogoutServlet.java
+++ b/web/src/main/java/com/web/LogoutServlet.java
@@ -11,6 +11,6 @@ public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
- response.sendRedirect("/index");
+ response.sendRedirect(request.getContextPath() + "/");
}
}
diff --git a/web/src/main/java/com/web/PXFilter.java b/web/src/main/java/com/web/PXFilter.java
index d9dc6508..2e05f319 100644
--- a/web/src/main/java/com/web/PXFilter.java
+++ b/web/src/main/java/com/web/PXFilter.java
@@ -13,10 +13,15 @@
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import static com.web.Utils.setDefaultPageAttributes;
@WebFilter("/*")
public class PXFilter implements Filter {
+ private static final Logger log = LoggerFactory.getLogger(PXFilter.class);
+
private PerimeterX pxFilter;
private Config config;
@@ -24,6 +29,12 @@ public void init(FilterConfig filterConfig) {
try {
config = new Config();
pxFilter = new PerimeterX(config.getPxConfiguration());
+ log.info(
+ "PerimeterX enforcer initialized; java.version={} java.specification.version={} java.vm.name={} java.vm.version={}",
+ System.getProperty("java.version"),
+ System.getProperty("java.specification.version"),
+ System.getProperty("java.vm.name"),
+ System.getProperty("java.vm.version"));
} catch (PXException e) {
e.printStackTrace();
@@ -40,7 +51,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
setDefaultPageAttributes((HttpServletRequest) request, config);
copyDataEnrichmentHeaderToResponse((HttpServletRequest) request, (HttpServletResponse) response);
- if (context != null && context.isRequestLowScore()) {
+ if (context == null || !context.isHandledResponse()) {
filterChain.doFilter(request, response);
}
diff --git a/web/src/main/java/com/web/Utils.java b/web/src/main/java/com/web/Utils.java
index 21458372..70252b32 100644
--- a/web/src/main/java/com/web/Utils.java
+++ b/web/src/main/java/com/web/Utils.java
@@ -6,7 +6,11 @@
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.Reader;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
@@ -15,7 +19,7 @@
public class Utils {
- public static Set
jsonArrayToSet(JSONArray jsonArray){
+ public static Set jsonArrayToSet(JSONArray jsonArray) {
Set stringsSet = new HashSet<>();
for (int i = 0; i < jsonArray.length(); i++) {
stringsSet.add(jsonArray.getString(i));
@@ -30,38 +34,65 @@ public static void setDefaultPageAttributes(HttpServletRequest request, Config c
}
private static String getAppId() {
- final String filePath = getEnforcerConfigPath();
try {
- return (String) Objects.requireNonNull(readJsonFile(filePath))
- .get(PX_APP_ID_FIELD);
- } catch (JsonParseException jpe) {
- throw new RuntimeException("Failed to extract App ID from file :: " + filePath + ".\n Exception :: " + jpe);
+ return getEnforcerConfig().getString(PX_APP_ID_FIELD);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to extract App ID from enforcer config", e);
}
}
private static String getSensorSrc(String appId, Config config) {
if (config.getPxConfiguration().isFirstPartyEnabled()) {
- return appId.replace(PX_PREFIX,"") + FIRST_PARTY_SENSOR_SUFFIX;
+ return appId.replace(PX_PREFIX, "") + FIRST_PARTY_SENSOR_SUFFIX;
}
- return String.format(THIRD_PARTY_SENSOR_URL_TEMPLATE,appId);
+ return String.format(THIRD_PARTY_SENSOR_URL_TEMPLATE, appId);
}
public static JSONObject getEnforcerConfig() {
- final String filePath = getEnforcerConfigPath();
- try {
- return readJsonFile(filePath);
- } catch (JsonParseException jpe) {
- throw new RuntimeException("Failed to extract config from file :: " + filePath + ".\n Exception :: " + jpe);
+ JSONObject fromClasspath = readEnforcerConfigFromClasspath();
+ if (fromClasspath != null) {
+ return fromClasspath;
+ }
+ String filePath = legacyFilesystemConfigPath();
+ JSONObject fromFile = readJsonFile(filePath);
+ if (fromFile != null) {
+ return fromFile;
}
+ throw new RuntimeException("Failed to load enforcer config '" + ENFORCER_CONFIG + JSON_SUFFIX
+ + "' from classpath or from path: " + filePath);
}
+ /**
+ * Best-effort path used by legacy IDE/exploded layouts (not reliable inside a {@code .war}).
+ */
public static String getEnforcerConfigPath() {
- return Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource(""))
- .getPath().replace(COMPILED_FILES_BASIC_PATH,"")
- + RESOURCES_RELATIVE_PATH + ENFORCER_CONFIG + JSON_SUFFIX;
+ return legacyFilesystemConfigPath();
+ }
+
+ private static JSONObject readEnforcerConfigFromClasspath() {
+ try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(ENFORCER_CONFIG + JSON_SUFFIX)) {
+ if (is == null) {
+ return null;
+ }
+ try (Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
+ return new JSONObject(new Gson().fromJson(reader, HashMap.class));
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private static String legacyFilesystemConfigPath() {
+ try {
+ return Objects.requireNonNull(Thread.currentThread().getContextClassLoader().getResource(""))
+ .getPath().replace(COMPILED_FILES_BASIC_PATH, "")
+ + RESOURCES_RELATIVE_PATH + ENFORCER_CONFIG + JSON_SUFFIX;
+ } catch (Exception e) {
+ return "(unknown)";
+ }
}
- private static JSONObject readJsonFile(String path){
+ private static JSONObject readJsonFile(String path) {
try {
Reader reader = Files.newBufferedReader(Paths.get(path));
return new JSONObject(new Gson().fromJson(reader, HashMap.class));
diff --git a/web/src/main/webapp/WEB-INF/web.xml b/web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..f8fe2aab
--- /dev/null
+++ b/web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+
+
+