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/database/Database.java b/src/main/java/database/Database.java index 7fbc52ab3911b6f327d7ca93b1f332dabaa1875d..f3c3c2ba5e2803e33893ec8d312170cb86a012a9 100644 --- a/src/main/java/database/Database.java +++ b/src/main/java/database/Database.java @@ -3,6 +3,8 @@ package database; import java.sql.*; import java.util.Date; +import enums.Status; + public class Database { private String host = System.getenv("DB_HOST"); private String port = System.getenv("DB_PORT"); @@ -49,7 +51,10 @@ public class Database { } public void bind(int index, Object value) throws SQLException{ - if(value instanceof java.sql.Date){ + if(value instanceof java.sql.Timestamp){ + this.psmt.setTimestamp(index, (java.sql.Timestamp)value); + } + else if(value instanceof java.sql.Date){ this.psmt.setDate(index, (java.sql.Date)value); } else if(value instanceof java.util.Date){ @@ -64,6 +69,9 @@ public class Database { } else if(value instanceof Boolean){ this.psmt.setBoolean(index, (Boolean) value); + }else if(value instanceof Status){ + Status val = (Status) value; + this.psmt.setString(index, "'"+val.getStatusCode().toUpperCase()+"'"); } } diff --git a/src/main/java/handler/KeyHandler.java b/src/main/java/handler/KeyHandler.java index f43144ed3e6d49864745396f62d1f076de6adee3..d5794482e8b6ac50b8f9a8771700b61fcf5abc9e 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,7 +52,15 @@ public class KeyHandler implements SOAPHandler<SOAPMessageContext> { } } - private boolean authorize(SOAPMessageContext ctx){ + 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); + } + + public static boolean authorize(SOAPMessageContext ctx){ try{ @SuppressWarnings("unchecked") Map<String, List<?>> headers = (Map<String, List<?>>) ctx.get(MessageContext.HTTP_REQUEST_HEADERS); diff --git a/src/main/java/handler/LoggingHandler.java b/src/main/java/handler/LoggingHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..64e9a1bf5823d004ad59e7882bcaa03317e3ae26 --- /dev/null +++ b/src/main/java/handler/LoggingHandler.java @@ -0,0 +1,75 @@ +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 com.sun.net.httpserver.Headers; + + +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){ + insertLog(ctx); + return true; + } + + @Override + public boolean handleMessage(SOAPMessageContext ctx){ + insertLog(ctx); + return true; + } + + private void insertLog(SOAPMessageContext ctx){ + try { + StringBuilder description = new StringBuilder(); + + boolean outbound = (boolean) ctx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); + boolean authorized = KeyHandler.authorize(ctx); + if(outbound){ + if(authorized){ + description.append("Called "); + }else{ + description.append("Unauthorized tried to call "); + } + }else{ + description.append("Attempting 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/java/model/LoggingModel.java b/src/main/java/model/LoggingModel.java index 6951bb4b15e7a29e6f819a903bf346c0cb816457..46b9aaeec6b4a5f62dd90dc6da061c56a7576573 100644 --- a/src/main/java/model/LoggingModel.java +++ b/src/main/java/model/LoggingModel.java @@ -11,6 +11,7 @@ import object.Logging; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -52,7 +53,7 @@ public class LoggingModel { return listLogging; } - public String createLog(String description, String ip, String endpoint, Date requested_At) throws SQLException{ + public String createLog(String description, String ip, String endpoint, Timestamp requested_At) throws SQLException{ String query = "INSERT INTO " + this.table + " (description, ip, endpoint, requested_at)" + "VALUES ( ?, ?, ?, ?)"; @@ -61,7 +62,7 @@ public class LoggingModel { pstmt.setString(1, description); pstmt.setString(2, ip); pstmt.setString(3, endpoint); - pstmt.setDate(4, new java.sql.Date(requested_At.getTime())); + pstmt.setTimestamp(4, requested_At); int rowsAffected = pstmt.executeUpdate(); return rowsAffected + " rows affected"; diff --git a/src/main/java/model/SubscriptionModel.java b/src/main/java/model/SubscriptionModel.java index 0903d576379f4bd4548cc3f410f2f555d8c3b19b..8e03c2dcd81ae4fa131349dfcd6e16533560e098 100644 --- a/src/main/java/model/SubscriptionModel.java +++ b/src/main/java/model/SubscriptionModel.java @@ -22,7 +22,7 @@ public class SubscriptionModel { private Database db; private String table; private static SubscriptionModel instance; - + public static SubscriptionModel getInstance() { try { if (instance == null) { @@ -50,6 +50,33 @@ public class SubscriptionModel { return ls; } + public Status getSubscriptionStatus(int user_id) throws SQLException{ + String query = "SELECT * FROM "+this.table+" WHERE creator_id = ?"; + PreparedStatement pstmt = this.db.prepareStatement(query); + this.db.bind(user_id); + + ResultSet rs = pstmt.executeQuery(); + if(rs.next()){ + return Status.fromStatusCode(rs.getString("status")); + } + return null; + } + + public List<Subscription> getSubscriptionsByStatus(Status state) throws SQLException{ + List<Subscription> ls = new ArrayList<>(); + + String query = "SELECT * FROM "+this.table+" WHERE status = '"+state.getStatusCode().toUpperCase()+"'"; + PreparedStatement pstmt = this.db.prepareStatement(query); + ResultSet rs = pstmt.executeQuery(); + + while(rs.next()){ + Subscription sub = new Subscription(rs); + ls.add(sub); + } + + return ls; + } + public String requestSubscription(int user_id) throws SQLException{ String query = "INSERT INTO "+this.table+" (creator_id) VALUES (?)"; PreparedStatement pstmt = this.db.prepareStatement(query); @@ -68,4 +95,5 @@ public class SubscriptionModel { int rowsAffected = pstmt.executeUpdate(); return rowsAffected + " rows affected"; } + } diff --git a/src/main/java/service/BaseWS.java b/src/main/java/service/BaseWS.java deleted file mode 100644 index 79a974f290fbace92025da632b90c968123a280b..0000000000000000000000000000000000000000 --- a/src/main/java/service/BaseWS.java +++ /dev/null @@ -1,65 +0,0 @@ -package service; - -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebService; -import javax.annotation.Resource; -import javax.xml.ws.WebServiceContext; -import javax.xml.ws.handler.MessageContext; - -import com.sun.net.httpserver.Headers; -import com.sun.net.httpserver.HttpExchange; -import model.ApiKeysModel; -import model.LoggingModel; - -import java.sql.Timestamp; -import java.util.Date; -import java.util.List; -import java.util.Map; - - -public class BaseWS { - @Resource - WebServiceContext wsContext; - public boolean verifyApiKey() { - try { - - MessageContext messageContext = wsContext.getMessageContext(); - Map<String, List<String>> requestHeaders = (Map<String, List<String>>) messageContext.get(MessageContext.HTTP_REQUEST_HEADERS); - String api_key = getApiKeyFromHeaders(requestHeaders); - - boolean trueApi = ApiKeysModel.getInstance().verifyApiKey(api_key); - - return trueApi; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - private String getApiKeyFromHeaders(Map<String, List<String>> headers) { - List<String> apiKeyHeader = headers.get("API-Key"); - - if (apiKeyHeader != null && !apiKeyHeader.isEmpty()) { - return apiKeyHeader.get(0); - } else { - return null; - } - } - - public String insertLog(String description, String endpoint) { - try { - - MessageContext msgContext = wsContext.getMessageContext(); - HttpExchange exchange = (HttpExchange) msgContext.get("com.sun.xml.ws.http.exchange"); - Headers reqHeaders = exchange.getRequestHeaders(); - String ip = reqHeaders.getFirst("X-Forwarded-For"); - Timestamp ts = new Timestamp(System.currentTimeMillis()); - return LoggingModel.getInstance().createLog(description, ip, endpoint, ts); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - -} diff --git a/src/main/java/service/RequestFilmWS.java b/src/main/java/service/RequestFilmWS.java index f35fdcd1feb754270994f94d5d382e5b1c846960..cf9809f8df6a1971c1290225e63c985e3fcedac1 100644 --- a/src/main/java/service/RequestFilmWS.java +++ b/src/main/java/service/RequestFilmWS.java @@ -13,17 +13,12 @@ import java.util.List; @WebService(endpointInterface = "service.RequestFilmWS") @HandlerChain(file = "log_and_auth.xml") -public class RequestFilmWS extends BaseWS{ +public class RequestFilmWS{ @WebMethod public List<RequestFilm> getAllRequestFilms() { try { List<RequestFilm> result = RequestFilmModel.getInstance().getAllRequestFilm(); - if(result.isEmpty()){ - return null; - } else { - insertLog("Get All Request Film", "service.RequestFilmWS"); - return result; - } + return result; } catch (Exception e) { e.printStackTrace(); return null; @@ -34,12 +29,7 @@ public class RequestFilmWS extends BaseWS{ public List<RequestFilm> getAllRequestFilmById(@WebParam(name="user_id") int user_id){ try { List<RequestFilm> result = RequestFilmModel.getInstance().getAllRequestFilm(); - if(result.isEmpty()){ - return null; - } else { - insertLog("Get All Request Film", "service.RequestFilmWS"); - return result; - } + return result; } catch (Exception e){ e.printStackTrace(); return null; @@ -50,12 +40,7 @@ public class RequestFilmWS extends BaseWS{ public RequestFilm getRequestFilmByFilmId(@WebParam(name="requestFilm_id") int requestFilm_Id){ try { RequestFilm result = RequestFilmModel.getInstance().getRequestFilmByFilmId(requestFilm_Id); - if(result == null){ - return null; - } else { - insertLog("", "service.RequestFilmWS"); - return result; - } + return result; } catch (Exception e){ e.printStackTrace(); return null; diff --git a/src/main/java/service/RequestProcessingService.java b/src/main/java/service/RequestProcessingService.java deleted file mode 100644 index 4efbca664f3bffb2798d6ad162e45fc887ee0d91..0000000000000000000000000000000000000000 --- a/src/main/java/service/RequestProcessingService.java +++ /dev/null @@ -1,12 +0,0 @@ -package service; - -import javax.jws.WebMethod; -import javax.jws.WebParam; -import javax.jws.WebService; -import javax.xml.ws.WebServiceContext; - -interface RequestProcessingService { - public void acceptRequest(@WebParam Integer creator_id, @WebParam Integer request_id); - public void rejectRequest(@WebParam Integer creator_id, @WebParam Integer request_id); - public void request(@WebParam Integer creator_id, @WebParam Integer request_id); -} diff --git a/src/main/java/service/SubscriptionWS.java b/src/main/java/service/SubscriptionWS.java index 182f90ca2e7c09cd9e18bdc24057e222cdcc82fa..5a62899e7d3faf7bfcdce9bd6f6b5a1b4079a1f2 100644 --- a/src/main/java/service/SubscriptionWS.java +++ b/src/main/java/service/SubscriptionWS.java @@ -14,7 +14,7 @@ import java.util.List; @WebService(endpointInterface = "service.SubscriptionWS") @HandlerChain(file = "log_and_auth.xml") -public class SubscriptionWS extends BaseWS{ +public class SubscriptionWS{ @WebMethod public List<Subscription> getAllSubscription(){ try{ @@ -25,6 +25,26 @@ public class SubscriptionWS extends BaseWS{ } } + @WebMethod + public Status checkSubscriptionStatus(@WebParam(name="user_id") Integer user_id){ + try{ + return SubscriptionModel.getInstance().getSubscriptionStatus(user_id); + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + @WebMethod + public List<Subscription> getSubscriptionsByStatus(@WebParam(name="status") String status){ + try{ + return SubscriptionModel.getInstance().getSubscriptionsByStatus(Status.fromStatusCode(status)); + }catch(Exception e){ + e.printStackTrace(); + return null; + } + } + @WebMethod public String acceptRequest(@WebParam(name = "user_id") Integer user_id){ try{ @@ -52,4 +72,5 @@ public class SubscriptionWS extends BaseWS{ } return null; } + } \ No newline at end of file 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