From 754ddfca67208ab6e41b55fd8b459813a9f4bb99 Mon Sep 17 00:00:00 2001
From: Rezapu Obed <obed.ubaidillah@gmail.com>
Date: Mon, 13 Nov 2023 19:49:05 +0700
Subject: [PATCH] feat(logging): add basic logging handler

---
 pom.xml                                   |  5 ++
 src/main/java/handler/KeyHandler.java     | 16 ++++--
 src/main/java/handler/LoggingHandler.java | 64 +++++++++++++++++++++++
 src/main/resources/log_and_auth.xml       |  5 ++
 4 files changed, 86 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/handler/LoggingHandler.java

diff --git a/pom.xml b/pom.xml
index 47da5ff..43f99f4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,11 @@
             <artifactId>jaxws-rt</artifactId>
             <version>2.3.6</version>
         </dependency>
+        <dependency>
+            <groupId>com.sun.net.httpserver</groupId>
+            <artifactId>http</artifactId>
+            <version>20070405</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
diff --git a/src/main/java/handler/KeyHandler.java b/src/main/java/handler/KeyHandler.java
index f43144e..17c237f 100644
--- a/src/main/java/handler/KeyHandler.java
+++ b/src/main/java/handler/KeyHandler.java
@@ -1,6 +1,7 @@
 package handler;
 
 import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPBody;
 import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFault;
 import javax.xml.ws.handler.MessageContext;
@@ -38,12 +39,11 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> {
         }
         else{
             boolean authorized = authorize(ctx);
+            ctx.put("Authorized", authorized);
             if(!authorize(ctx)){
                 try{
-                    SOAPFault soapFault = ctx.getMessage().getSOAPPart().getEnvelope().getBody().addFault();
-                    soapFault.setFaultCode(new QName("http://example.com/namespace", "Client", "env"));
-                    soapFault.setFaultString("Unauthorized access");
-                    throw new SOAPFaultException(soapFault);
+                    injectSOAPFault(ctx, "Client", "Unauthorized");
+                    throw new SOAPFaultException(ctx.getMessage().getSOAPBody().getFault());
                 }catch(SOAPException e){
                     e.printStackTrace();
                 }
@@ -52,6 +52,14 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> {
         }
     }
 
+    private void injectSOAPFault(SOAPMessageContext ctx, String faultCode, String faultString) throws SOAPException{
+        SOAPBody soapBody = ctx.getMessage().getSOAPBody();
+        soapBody.removeContents();
+        SOAPFault soapFault = soapBody.addFault();
+        soapFault.setFaultCode(faultCode);
+        soapFault.setFaultString(faultString);
+    }
+
     private boolean authorize(SOAPMessageContext ctx){
         try{
             @SuppressWarnings("unchecked")
diff --git a/src/main/java/handler/LoggingHandler.java b/src/main/java/handler/LoggingHandler.java
new file mode 100644
index 0000000..a043b06
--- /dev/null
+++ b/src/main/java/handler/LoggingHandler.java
@@ -0,0 +1,64 @@
+package handler;
+
+import java.net.URI;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import com.sun.net.httpserver.HttpExchange;
+
+import model.ApiKeysModel;
+import model.LoggingModel;
+
+public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
+    @Override
+    public Set<QName> getHeaders(){
+        return null;
+    }
+
+    @Override
+    public void close(MessageContext ctx){
+
+    }
+
+    @Override
+    public boolean handleFault(SOAPMessageContext ctx){
+        return true;
+    }
+
+    @Override
+    public boolean handleMessage(SOAPMessageContext ctx){
+        insertLog(ctx);
+        return true;
+    }
+
+    private void insertLog(SOAPMessageContext ctx){
+        try {
+            StringBuilder description = new StringBuilder();
+            // if((boolean) ctx.get("authorized")){
+            //     description.append("Called ");
+            // }else{
+            //     description.append("Unauthorized access tried to call ");
+            // }
+            
+            QName operation = (QName) ctx.get(MessageContext.WSDL_OPERATION);
+            description.append(operation.getLocalPart());
+
+            HttpExchange exchange = (HttpExchange) ctx.get("com.sun.xml.ws.http.exchange");
+
+            String ip = exchange.getRemoteAddress().getAddress().getHostAddress();
+            String endpoint = exchange.getRequestURI().toString();
+            Timestamp ts = new Timestamp(System.currentTimeMillis());
+
+            LoggingModel.getInstance().createLog(description.toString(), ip, endpoint, ts);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/resources/log_and_auth.xml b/src/main/resources/log_and_auth.xml
index 8c5e330..58644d6 100644
--- a/src/main/resources/log_and_auth.xml
+++ b/src/main/resources/log_and_auth.xml
@@ -5,4 +5,9 @@
       <handler-class>handler.KeyHandler</handler-class>
     </handler>
   </handler-chain>
+  <handler-chain>
+    <handler>
+      <handler-class>handler.LoggingHandler</handler-class>
+    </handler>
+  </handler-chain>
 </handler-chains>
\ No newline at end of file
-- 
GitLab