blob: ba8a81ee88433a05e045a6ae55abbe4431655143 [file] [log] [blame]
package de.ids_mannheim.korap.web;
import java.util.EnumSet;
import de.ids_mannheim.korap.constant.AuthenticationScheme;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
/**
* KustvaktResponseHandler includes exceptions regarding
* authorization.
*
* @author margaretha
*
*/
public class KustvaktResponseHandler extends CoreResponseHandler {
@Override
public WebApplicationException throwit (KustvaktException e) {
Response r;
// KustvaktException just wraps another exception
if (e.getStatusCode() == null && e.hasNotification()) {
r = Response.status(Response.Status.BAD_REQUEST)
.entity(e.getNotification()).build();
}
else if (e.getStatusCode() == StatusCodes.DB_UNIQUE_CONSTRAINT_FAILED) {
r = Response.status(Response.Status.CONFLICT)
.entity(e.getNotification()).build();
}
else if (e.getStatusCode() == StatusCodes.USER_REAUTHENTICATION_REQUIRED
|| e.getStatusCode() == StatusCodes.AUTHORIZATION_FAILED
|| e.getStatusCode() >= StatusCodes.AUTHENTICATION_FAILED) {
String notification = buildNotification(e.getStatusCode(),
e.getMessage(), e.getEntity());
r = createUnauthenticatedResponse(notification);
}
else if (e.hasNotification()) {
r = Response.status(getStatus(e.getStatusCode()))
.entity(e.getNotification()).build();
}
else {
String notification = buildNotification(e.getStatusCode(),
e.getMessage(), e.getEntity());
r = Response.status(getStatus(e.getStatusCode()))
.entity(notification).build();
}
return new WebApplicationException(r);
}
public Response createUnauthenticatedResponse (String notification) {
ResponseBuilder builder = Response.status(Response.Status.UNAUTHORIZED);
EnumSet<AuthenticationScheme> schemes = EnumSet
.allOf(AuthenticationScheme.class);
schemes.remove(AuthenticationScheme.API);
for (AuthenticationScheme s : schemes) {
builder = builder.header(HttpHeaders.WWW_AUTHENTICATE,
s.displayName() + " realm=\"Kustvakt\"");
}
return builder.entity(notification).build();
}
}