diff --git a/scm-core/src/main/java/sonia/scm/user/InvalidPasswordException.java b/scm-core/src/main/java/sonia/scm/user/InvalidPasswordException.java index 870430a1bb..11fb11bef5 100644 --- a/scm-core/src/main/java/sonia/scm/user/InvalidPasswordException.java +++ b/scm-core/src/main/java/sonia/scm/user/InvalidPasswordException.java @@ -1,8 +1,18 @@ package sonia.scm.user; -public class InvalidPasswordException extends RuntimeException { +import sonia.scm.ContextEntry; +import sonia.scm.ExceptionWithContext; - public InvalidPasswordException() { - super("The given Password does not match with the stored one."); +public class InvalidPasswordException extends ExceptionWithContext { + + private static final String CODE = "8YR7aawFW1"; + + public InvalidPasswordException(ContextEntry.ContextBuilder passwordChange) { + super(passwordChange.build(), "The given old password does not match with the stored one."); + } + + @Override + public String getCode() { + return CODE; } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InvalidPasswordExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InvalidPasswordExceptionMapper.java index 7c5364ba03..7a1d311a1c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InvalidPasswordExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InvalidPasswordExceptionMapper.java @@ -1,17 +1,17 @@ package sonia.scm.api.v2.resources; +import sonia.scm.api.rest.ContextualExceptionMapper; import sonia.scm.user.InvalidPasswordException; +import javax.inject.Inject; import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider -public class InvalidPasswordExceptionMapper implements ExceptionMapper { - @Override - public Response toResponse(InvalidPasswordException exception) { - return Response.status(Response.Status.BAD_REQUEST) - .entity(exception.getMessage()) - .build(); +public class InvalidPasswordExceptionMapper extends ContextualExceptionMapper { + + @Inject + public InvalidPasswordExceptionMapper(ExceptionWithContextToErrorDtoMapper mapper) { + super(InvalidPasswordException.class, Response.Status.BAD_REQUEST, mapper); } } diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index 807024c36b..41d2ed467f 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -39,6 +39,7 @@ import com.google.inject.Singleton; import org.apache.shiro.SecurityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.ContextEntry; import sonia.scm.EagerSingleton; import sonia.scm.HandlerEventType; import sonia.scm.ManagerDaoAdapter; @@ -402,7 +403,7 @@ public class DefaultUserManager extends AbstractUserManager User user = get((String) SecurityUtils.getSubject().getPrincipals().getPrimaryPrincipal()); if (!user.getPassword().equals(oldPassword)) { - throw new InvalidPasswordException(); + throw new InvalidPasswordException(ContextEntry.ContextBuilder.entity("passwordChange", "-").in(User.class, user.getName())); } user.setPassword(newPassword); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java index 9c34549d34..0d95d0a642 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java @@ -19,7 +19,7 @@ public class DispatcherMock { dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); dispatcher.getProviderFactory().registerProvider(InternalRepositoryExceptionMapper.class); dispatcher.getProviderFactory().registerProvider(ChangePasswordNotAllowedExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(InvalidPasswordExceptionMapper.class); + dispatcher.getProviderFactory().register(new InvalidPasswordExceptionMapper(mapper)); dispatcher.getProviderFactory().registerProvider(IllegalArgumentExceptionMapper.class); return dispatcher; }