diff --git a/docker-compose.yaml b/docker-compose.yaml index 7a00f4f057bcb9fbc1f0f671286b7ffe53eaabcf..ebb7c30e9c89bcde47299eebab0f75e82d148014 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 4764cad3781d46cd3f8d8f111abec51c07e30b74..71a9a502cc999e5c2e8faac2a57871826846f827 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 aa863108bce9f357b41531d6a747c04b85dd4a1f..42517199efb8444b5f50c482506524f305130a2d 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 7ec816a348c5bab30188072d1d6484c36d2ac3e9..9f89980b9cc150825b1707a4d815dcd4b19779c5 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 720c87ef94ae60df5249730d472544278363f7e8..96ded23c462f7114e469a6d2141a6d036c8721d5 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 2bf8f766e0eb2b03dafd9f7af85e8f88cbe2a8c3..52ad9ed82309bb8c61f9d0201dda1939f12c6b95 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; }