From 7141b59dc24a8dd7ea5ecc609a13ed74e6c36cf3 Mon Sep 17 00:00:00 2001
From: Rava Maulana <ravamaulana14@gmail.com>
Date: Sun, 12 Nov 2023 00:09:58 +0700
Subject: [PATCH] feat: added logging

---
 docker-compose.yaml                           |  2 +-
 pom.xml                                       |  6 ++
 .../soapserver/handlers/LoggingHandler.java   | 56 ++++++++++++++-----
 src/main/java/soapserver/models/Log.java      |  6 +-
 .../repositories/LoggingRepostitory.java      |  6 +-
 .../repositories/SubscriptionRepository.java  |  3 +-
 6 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/docker-compose.yaml b/docker-compose.yaml
index 7a00f4f..ebb7c30 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -13,7 +13,7 @@ services:
   soap-service-db:
     image: mysql:latest
     ports:
-      - "3307:3306"
+      - 3307:3306
     env_file: .env
     hostname: tubes-soap-db
 volumes:
diff --git a/pom.xml b/pom.xml
index 4764cad..71a9a50 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,6 +54,12 @@
             <artifactId>hibernate-core</artifactId>
             <version>5.6.0.Final</version>
         </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>4.0.1</version>
+            <scope>provided</scope>
+        </dependency>
         <!-- <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
diff --git a/src/main/java/soapserver/handlers/LoggingHandler.java b/src/main/java/soapserver/handlers/LoggingHandler.java
index aa86310..4251719 100644
--- a/src/main/java/soapserver/handlers/LoggingHandler.java
+++ b/src/main/java/soapserver/handlers/LoggingHandler.java
@@ -1,15 +1,21 @@
 package soapserver.handlers;
 
-import java.util.Set;
+import java.io.ByteArrayOutputStream;
 import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.soap.SOAPMessage;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPHandler;
 import javax.xml.ws.handler.soap.SOAPMessageContext;
 
+import io.github.cdimascio.dotenv.Dotenv;
 import soapserver.repositories.LoggingRepostitory;
 
 public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
@@ -20,19 +26,43 @@ public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
   }
 
   public boolean handleMessage(SOAPMessageContext messageContext) {
-    boolean isOutbound = (boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+    try {
+      boolean isOutbound = (boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+
+      // Only intercepts inbound message
+      if (!isOutbound) {
+        SOAPMessage soapMessage = messageContext.getMessage();
+        SOAPBody soapBody = soapMessage.getSOAPBody();
+        SOAPHeader soapHeader = soapMessage.getSOAPHeader();
+
+        String method = soapBody.getChildNodes().item(1).getLocalName();
+
+        // API key validation
+        String key = soapHeader.getChildNodes().item(0).getTextContent();
+        if (!(key.equals(Dotenv.load().get("REST_SOAP_KEY")))) {
+          return false;
+        }
 
-    // Only intercepts inbound message
-    if (!isOutbound) {
-      @SuppressWarnings("unchecked")
-      Map<String, List<String>> requestHeaders = (Map<String, List<String>>) messageContext
-          .get(MessageContext.HTTP_REQUEST_HEADERS);
-      System.out.println(requestHeaders);
-      String host = requestHeaders.get("host").get(0);
+        // Get request description
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        soapMessage.writeTo(output);
+        String messageString = new String(output.toByteArray());
 
-      loggingRepostitory.addNewLog(host);
+        String description = messageString.substring(messageString.indexOf("<soap:Body>"));
+        description = description.substring(0, description.indexOf("</soap:Envelope>"));
+
+        // Get remote address
+        HttpServletRequest request = (HttpServletRequest) messageContext.get(MessageContext.SERVLET_REQUEST);
+        String origin = request.getRemoteAddr();
+
+        loggingRepostitory.addNewLog(origin, method, description);
+      }
+
+      return true;
+    } catch (Exception e) {
+      System.out.println(e.getMessage());
+      return false;
     }
-    return true;
   }
 
   public boolean handleFault(SOAPMessageContext messageContext) {
diff --git a/src/main/java/soapserver/models/Log.java b/src/main/java/soapserver/models/Log.java
index 7ec816a..9f89980 100644
--- a/src/main/java/soapserver/models/Log.java
+++ b/src/main/java/soapserver/models/Log.java
@@ -21,5 +21,9 @@ public class Log implements Serializable {
   private Timestamp time;
 
   @Id
-  private String host;
+  private String origin;
+
+  private String method;
+
+  private String description;
 }
diff --git a/src/main/java/soapserver/repositories/LoggingRepostitory.java b/src/main/java/soapserver/repositories/LoggingRepostitory.java
index 720c87e..96ded23 100644
--- a/src/main/java/soapserver/repositories/LoggingRepostitory.java
+++ b/src/main/java/soapserver/repositories/LoggingRepostitory.java
@@ -9,7 +9,7 @@ import soapserver.models.Log;
 import soapserver.utils.HibernateUtil;
 
 public class LoggingRepostitory {
-  public boolean addNewLog(String host) {
+  public boolean addNewLog(String origin, String method, String description) {
     try {
       SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
       Session session = sessionFactory.getCurrentSession();
@@ -17,8 +17,10 @@ public class LoggingRepostitory {
       session.beginTransaction();
 
       Log log = new Log();
-      log.setHost(host);
+      log.setOrigin(origin);
       log.setTime(new Timestamp(System.currentTimeMillis()));
+      log.setMethod(method);
+      log.setDescription(description);
       session.save(log);
 
       session.getTransaction().commit();
diff --git a/src/main/java/soapserver/repositories/SubscriptionRepository.java b/src/main/java/soapserver/repositories/SubscriptionRepository.java
index 2bf8f76..52ad9ed 100644
--- a/src/main/java/soapserver/repositories/SubscriptionRepository.java
+++ b/src/main/java/soapserver/repositories/SubscriptionRepository.java
@@ -68,10 +68,9 @@ public class SubscriptionRepository {
         return false;
       }
 
+      // Check expiration time
       Timestamp expirationDate = userSubscription.getExpiration_date();
       Timestamp currentTime = new Timestamp(System.currentTimeMillis());
-      System.out.println(expirationDate);
-      System.out.println(currentTime);
       if (expirationDate.compareTo(currentTime) < 0) {
         return false;
       }
-- 
GitLab