Merge with 2.0.0-m3

This commit is contained in:
René Pfeuffer
2019-03-12 09:29:28 +01:00
15 changed files with 175 additions and 43 deletions

View File

@@ -34,6 +34,8 @@ package sonia.scm.api.rest;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.shiro.authz.AuthorizationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//~--- JDK imports ------------------------------------------------------------
@@ -50,12 +52,17 @@ public class AuthorizationExceptionMapper
extends StatusExceptionMapper<AuthorizationException>
{
/**
* Constructs ...
*
*/
private static final Logger LOG = LoggerFactory.getLogger(AuthorizationExceptionMapper.class);
public AuthorizationExceptionMapper()
{
super(AuthorizationException.class, Response.Status.FORBIDDEN);
}
@Override
public Response toResponse(AuthorizationException exception) {
LOG.info("user is missing permission: {}", exception.getMessage());
LOG.trace("AuthorizationException:", exception);
return super.toResponse(exception);
}
}

View File

@@ -148,7 +148,8 @@ public class RepositoryResource {
return adapter.update(
loadBy(namespace, name),
existing -> processUpdate(repository, existing),
nameAndNamespaceStaysTheSame(namespace, name)
nameAndNamespaceStaysTheSame(namespace, name),
r -> r.getNamespaceAndName().logString()
);
}

View File

@@ -64,7 +64,9 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper<Reposit
linksBuilder.single(link("incomingDiff", resourceLinks.incoming().diff(repository.getNamespace(), repository.getName())));
}
if (repositoryService.isSupported(Command.MERGE)) {
linksBuilder.single(link("merge", resourceLinks.merge().merge(repository.getNamespace(), repository.getName())));
if (RepositoryPermissions.push(repository).isPermitted()) {
linksBuilder.single(link("merge", resourceLinks.merge().merge(repository.getNamespace(), repository.getName())));
}
linksBuilder.single(link("mergeDryRun", resourceLinks.merge().dryRun(repository.getNamespace(), repository.getName())));
}
}

View File

@@ -56,17 +56,21 @@ class SingleResourceManagerAdapter<MODEL_OBJECT extends ModelObject,
}
/**
* Update the model object for the given id according to the given function and returns a corresponding http response.
* This handles all corner cases, eg. no matching object for the id or missing privileges.
* Updates the model object provided by the reader according to the given function and returns a corresponding http
* response. This handles all corner cases, eg. no matching object for the id or missing privileges.
*/
Response update(Supplier<MODEL_OBJECT> reader, Function<MODEL_OBJECT, MODEL_OBJECT> applyChanges, Predicate<MODEL_OBJECT> hasSameKey) {
return update(reader, applyChanges, hasSameKey, ModelObject::getId);
}
Response update(Supplier<MODEL_OBJECT> reader, Function<MODEL_OBJECT, MODEL_OBJECT> applyChanges, Predicate<MODEL_OBJECT> hasSameKey, Function<MODEL_OBJECT, String> keyExtractor) {
MODEL_OBJECT existingModelObject = reader.get();
MODEL_OBJECT changedModelObject = applyChanges.apply(existingModelObject);
if (!hasSameKey.test(changedModelObject)) {
return Response.status(BAD_REQUEST).entity("illegal change of id").build();
}
else if (modelObjectWasModifiedConcurrently(existingModelObject, changedModelObject)) {
throw new ConcurrentModificationException(type, existingModelObject.getId());
throw new ConcurrentModificationException(type, keyExtractor.apply(existingModelObject));
}
return update(getId(existingModelObject), changedModelObject);
}