-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Exception mapping and frontend preventing access to unauthorized page…
…s via URL
- Loading branch information
1 parent
48f0678
commit 858f8d7
Showing
25 changed files
with
715 additions
and
557 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 0 additions & 33 deletions
33
src/main/java/com/databasepreservation/common/api/exceptions/ApiException.java
This file was deleted.
Oops, something went wrong.
71 changes: 71 additions & 0 deletions
71
src/main/java/com/databasepreservation/common/api/exceptions/RESTException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/** | ||
* The contents of this file are subject to the license and copyright | ||
* detailed in the LICENSE file at the root of the source | ||
* tree and available online at | ||
* | ||
* https://github.com/keeps/dbptk-ui | ||
*/ | ||
package com.databasepreservation.common.api.exceptions; | ||
|
||
import com.databasepreservation.common.exceptions.AuthorizationException; | ||
import com.databasepreservation.common.exceptions.SavedSearchException; | ||
import com.google.gwt.http.client.Response; | ||
import org.roda.core.data.exceptions.*; | ||
|
||
import java.io.Serial; | ||
|
||
/** | ||
* @author António Lindo <[email protected]> | ||
*/ | ||
|
||
public class RESTException extends RuntimeException { | ||
@Serial | ||
private static final long serialVersionUID = 4667937307148805083L; | ||
|
||
private Throwable cause; | ||
|
||
public RESTException() { | ||
} | ||
|
||
public RESTException(Throwable cause) { | ||
super(); | ||
this.cause = cause; | ||
} | ||
|
||
private static String getCauseMessage(Throwable e) { | ||
StringBuilder message = new StringBuilder(); | ||
Throwable cause = e; | ||
|
||
while (cause != null) { | ||
message.append(" caused by ").append(cause.getClass().getSimpleName()).append(": "); | ||
if (cause.getMessage() != null) { | ||
message.append(cause.getMessage()); | ||
} | ||
cause = cause.getCause(); | ||
} | ||
return message.toString(); | ||
} | ||
|
||
@Override | ||
public synchronized Throwable getCause() { | ||
return cause; | ||
} | ||
|
||
public int getStatus() { | ||
if (cause instanceof AuthorizationDeniedException || cause instanceof AuthorizationException) { | ||
return Response.SC_UNAUTHORIZED; | ||
} else if (cause instanceof NotFoundException) { | ||
return Response.SC_NOT_FOUND; | ||
} else if (cause instanceof AlreadyExistsException) { | ||
return Response.SC_CONFLICT; | ||
} else if (cause instanceof SavedSearchException) { | ||
return Response.SC_BAD_REQUEST; | ||
} else if (cause instanceof GenericException) { | ||
return Response.SC_BAD_REQUEST; | ||
} else if (cause instanceof RequestNotValidException) { | ||
return Response.SC_BAD_REQUEST; | ||
} | ||
return Response.SC_INTERNAL_SERVER_ERROR; | ||
} | ||
|
||
} |
52 changes: 0 additions & 52 deletions
52
src/main/java/com/databasepreservation/common/api/exceptions/RestExceptionMapper.java
This file was deleted.
Oops, something went wrong.
70 changes: 70 additions & 0 deletions
70
...va/com/databasepreservation/common/api/exceptions/RestResponseEntityExceptionHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
package com.databasepreservation.common.api.exceptions; | ||
|
||
import java.io.IOException; | ||
import java.util.UUID; | ||
|
||
import com.databasepreservation.common.api.exceptions.model.ErrorResponseMessage; | ||
import com.databasepreservation.common.exceptions.AuthorizationException; | ||
import com.databasepreservation.common.exceptions.ViewerException; | ||
import org.roda.core.data.exceptions.AlreadyExistsException; | ||
import org.roda.core.data.exceptions.AuthenticationDeniedException; | ||
import org.roda.core.data.exceptions.AuthorizationDeniedException; | ||
import org.roda.core.data.exceptions.GenericException; | ||
import org.roda.core.data.exceptions.NotFoundException; | ||
import org.roda.core.data.exceptions.RequestNotValidException; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.http.HttpHeaders; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.ControllerAdvice; | ||
import org.springframework.web.bind.annotation.ExceptionHandler; | ||
import org.springframework.web.context.request.ServletWebRequest; | ||
import org.springframework.web.context.request.WebRequest; | ||
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; | ||
|
||
@ControllerAdvice | ||
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { | ||
|
||
@ExceptionHandler(value = {RESTException.class}) | ||
protected ResponseEntity<Object> handleRestException(RuntimeException ex, WebRequest request) { | ||
String message = "Internal server error"; | ||
String details = ""; | ||
Object objectDetails = null; | ||
HttpStatus httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; | ||
UUID errorID = UUID.randomUUID(); | ||
if (ex.getCause() instanceof AuthorizationDeniedException || ex.getCause() instanceof AuthorizationException) { | ||
message = "Forbidden"; | ||
details = ex.getCause().getMessage(); | ||
httpStatus = HttpStatus.FORBIDDEN; | ||
} else if (ex.getCause() instanceof AuthenticationDeniedException) { | ||
message = "Unauthorized access"; | ||
details = ex.getCause().getMessage(); | ||
httpStatus = HttpStatus.UNAUTHORIZED; | ||
} else if (ex.getCause() instanceof NotFoundException) { | ||
message = "Resource not found"; | ||
details = ex.getCause().getMessage(); | ||
httpStatus = HttpStatus.NOT_FOUND; | ||
} else if (ex.getCause() instanceof AlreadyExistsException) { | ||
message = "Resource already exists"; | ||
details = ex.getCause().getMessage(); | ||
httpStatus = HttpStatus.CONFLICT; | ||
} else if (ex.getCause() instanceof GenericException || ex.getCause() instanceof RequestNotValidException | ||
|| ex.getCause() instanceof IOException || ex.getCause() instanceof ViewerException) { | ||
message = "Request was not valid"; | ||
details = ex.getCause().getMessage(); | ||
httpStatus = HttpStatus.BAD_REQUEST; | ||
} | ||
|
||
String warn = "ERROR_ID: " + errorID + " - " + ex.getClass().getSimpleName() + ": " + ex.getCause().getMessage(); | ||
LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class).warn(warn); | ||
|
||
ErrorResponseMessage body = new ErrorResponseMessage(httpStatus.value(), errorID.toString(), message, details, | ||
((ServletWebRequest) request).getRequest().getRequestURI(), objectDetails); | ||
|
||
HttpHeaders responseHeaders = new HttpHeaders(); | ||
responseHeaders.setContentType(MediaType.APPLICATION_JSON); | ||
|
||
return handleExceptionInternal(ex, body, responseHeaders, httpStatus, request); | ||
} | ||
} |
70 changes: 70 additions & 0 deletions
70
src/main/java/com/databasepreservation/common/api/exceptions/model/ErrorResponseMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
package com.databasepreservation.common.api.exceptions.model; | ||
|
||
import java.io.Serial; | ||
import java.io.Serializable; | ||
import java.time.Instant; | ||
import java.time.temporal.ChronoUnit; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
|
||
public class ErrorResponseMessage implements Serializable { | ||
|
||
@Serial | ||
private static final long serialVersionUID = -2206131216992713872L; | ||
|
||
private final int status; | ||
private final String errorId; | ||
private final String message; | ||
private final String details; | ||
private final Instant timestamp; | ||
private final String instance; | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
private Object objectDetails; | ||
|
||
public ErrorResponseMessage(int status, String errorId, String message, String details, String instance) { | ||
this.status = status; | ||
this.errorId = errorId; | ||
this.message = message; | ||
this.details = details; | ||
this.timestamp = Instant.now().truncatedTo(ChronoUnit.MILLIS); | ||
this.instance = instance; | ||
} | ||
|
||
public ErrorResponseMessage(int status, String errorId, String message, String details, String instance, Object objectDetails) { | ||
this.status = status; | ||
this.errorId = errorId; | ||
this.message = message; | ||
this.details = details; | ||
this.timestamp = Instant.now().truncatedTo(ChronoUnit.MILLIS); | ||
this.instance = instance; | ||
this.objectDetails = objectDetails; | ||
} | ||
|
||
public int getStatus() { | ||
return status; | ||
} | ||
|
||
public String getErrorId() { | ||
return errorId; | ||
} | ||
|
||
public String getMessage() { | ||
return message; | ||
} | ||
|
||
public String getDetails() { | ||
return details; | ||
} | ||
|
||
public Instant getTimestamp() { | ||
return timestamp; | ||
} | ||
|
||
public String getInstance() { | ||
return instance; | ||
} | ||
|
||
public Object getObjectDetails() { | ||
return objectDetails; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.