From f366c00b7db16b46206bba0223008956f89c5781 Mon Sep 17 00:00:00 2001
From: razzanYoni <13521087@mahasiswa.itb.ac.id>
Date: Mon, 13 Nov 2023 10:17:30 +0700
Subject: [PATCH] feat : add validate request

---
 .env.example                                  |  3 +-
 .../org/tonality/service/BaseWebService.java  | 39 +++++++++++++++++++
 .../org/tonality/service/Subscription.java    | 11 +++++-
 3 files changed, 51 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/org/tonality/service/BaseWebService.java

diff --git a/.env.example b/.env.example
index 436b0a3..8a5410b 100644
--- a/.env.example
+++ b/.env.example
@@ -1,3 +1,4 @@
 DATABASE_URL=jdbc:mysql://{host??}:{port??}/{database_name??}
 DATABASE_USERNAME=
-DATABASE_PASSWORD=
\ No newline at end of file
+DATABASE_PASSWORD=
+API_KEY=
\ No newline at end of file
diff --git a/src/main/java/org/tonality/service/BaseWebService.java b/src/main/java/org/tonality/service/BaseWebService.java
new file mode 100644
index 0000000..0ac4669
--- /dev/null
+++ b/src/main/java/org/tonality/service/BaseWebService.java
@@ -0,0 +1,39 @@
+package org.tonality.service;
+
+import javax.annotation.Resource;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpExchange;
+
+// https://stackoverflow.com/questions/12727989/jax-ws-getting-client-ip/13693024#13693024
+public abstract class BaseWebService {
+    @Resource
+    protected javax.xml.ws.WebServiceContext context;
+
+    protected final String httpExchangeKey = "com.sun.xml.internal.ws.http.exchange";
+
+    protected String getClientIp() {
+        MessageContext messageContext = context.getMessageContext();
+        HttpExchange exchange = (HttpExchange) messageContext.get(httpExchangeKey);
+        return exchange.getRemoteAddress().getAddress().getHostAddress();
+    }
+
+    protected String getClientApiKey() {
+        MessageContext messageContext = context.getMessageContext();
+        HttpExchange exchange = (HttpExchange) messageContext.get(httpExchangeKey);
+        return exchange.getRequestHeaders().getFirst("X-API-KEY");
+    }
+
+    protected boolean isRequestValid() {
+        return getClientApiKey() != null && getClientApiKey().equals(System.getenv("API_KEY"));
+    }
+
+    protected void logRequest() throws Exception {
+        if (!isRequestValid()) throw new Exception("Invalid request");
+        // TODO : implement logging to database
+        System.out.println("Client IP: " + getClientIp());
+        System.out.println("Client API Key: " + getClientApiKey());
+    }
+}
diff --git a/src/main/java/org/tonality/service/Subscription.java b/src/main/java/org/tonality/service/Subscription.java
index 7063209..ead0701 100644
--- a/src/main/java/org/tonality/service/Subscription.java
+++ b/src/main/java/org/tonality/service/Subscription.java
@@ -7,10 +7,11 @@ import javax.jws.WebService;
 import java.util.List;
 
 @WebService(endpointInterface = "org.tonality.service.ISubscription")
-public class Subscription implements ISubscription {
+public class Subscription extends BaseWebService implements ISubscription {
     @Override
     public org.tonality.model.Subscription createSubscription(long userId, String username, long albumId, String albumName, String artist) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().createSubscription(userId, username, albumId, albumName, artist);
         } catch (Exception e) {
             e.printStackTrace();
@@ -21,6 +22,7 @@ public class Subscription implements ISubscription {
     @Override
     public org.tonality.model.Subscription updateSubscription(long userId, long albumId, SubscriptionStatus status) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().updateSubscription(userId, albumId, status);
         } catch (Exception e) {
             e.printStackTrace();
@@ -31,6 +33,7 @@ public class Subscription implements ISubscription {
     @Override
     public org.tonality.model.Subscription getSubscription(long userId, long albumId) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().getById(new SubscriptionId(userId, albumId));
         } catch (Exception e) {
             e.printStackTrace();
@@ -41,6 +44,7 @@ public class Subscription implements ISubscription {
     @Override
     public List<org.tonality.model.Subscription> searchSubscription(SubscriptionStatus status, String searchInput, String orderBy, int page, int size) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().searchSubscriptions(status, searchInput, orderBy, page, size);
         } catch (Exception e) {
             e.printStackTrace();
@@ -51,6 +55,7 @@ public class Subscription implements ISubscription {
     @Override
     public List<org.tonality.model.Subscription> getSubscriptionsByStatus(SubscriptionStatus status, String orderBy, int page, int size) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().getSubscriptionByStatus(status, orderBy, page, size);
         } catch (Exception e) {
             e.printStackTrace();
@@ -61,6 +66,7 @@ public class Subscription implements ISubscription {
     @Override
     public List<org.tonality.model.Subscription> getSubscriptionsByUserId(long userId, int page, int size) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().getSubscriptionsByUserId(userId, page, size);
         } catch (Exception e) {
             e.printStackTrace();
@@ -71,6 +77,7 @@ public class Subscription implements ISubscription {
     @Override
     public boolean deleteSubscription(long userId, long albumId) {
         try {
+            logRequest();
             if (!org.tonality.repository.Subscription.getInstance().deleteById(new org.tonality.model.SubscriptionId(userId, albumId))) {
                 throw new Exception("Failed to delete subscription");
             }
@@ -84,6 +91,7 @@ public class Subscription implements ISubscription {
     @Override
     public boolean deleteSubscriptionsByUserId(long userId) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().deleteSubscriptionsByUserId(userId);
         } catch (Exception e) {
             e.printStackTrace();
@@ -94,6 +102,7 @@ public class Subscription implements ISubscription {
     @Override
     public boolean deleteSubscriptionsByAlbumId(long albumId) {
         try {
+            logRequest();
             return org.tonality.repository.Subscription.getInstance().deleteSubscriptionsByAlbumId(albumId);
         } catch (Exception e) {
             e.printStackTrace();
-- 
GitLab