diff --git a/pom.xml b/pom.xml index 47da5ff69313689386b1243e0da327118ad57672..43f99f4d9bbbc0c32c507b2288a15c6b4ab9c828 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 f43144ed3e6d49864745396f62d1f076de6adee3..17c237f3f59b77c88b79c99f0b2e55cb32f96b0b 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 0000000000000000000000000000000000000000..a043b063fab33be62ced2028703466538a79a997 --- /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 8c5e3300ea8e886107489a1f3f9258281e94990b..58644d60d48c5ec039d9f5963971760eac6b0969 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