Fix repository permission rest interface

This commit is contained in:
René Pfeuffer
2019-01-23 09:47:38 +01:00
parent 9b4fc5e3d8
commit 02b19e51ef
13 changed files with 119 additions and 126 deletions

View File

@@ -26,12 +26,11 @@ public class RepositoryPermissionCollectionToDtoMapper {
}
public HalRepresentation map(Repository repository) {
// List<RepositoryPermissionDto> repositoryPermissionDtoList = repository.getPermissions()
// .stream()
// .map(permission -> repositoryPermissionToRepositoryPermissionDtoMapper.map(permission, repository))
// .collect(toList());
// return new HalRepresentation(createLinks(repository), embedDtos(repositoryPermissionDtoList));
return new HalRepresentation(createLinks(repository));
List<RepositoryPermissionDto> repositoryPermissionDtoList = repository.getPermissions()
.stream()
.map(permission -> repositoryPermissionToRepositoryPermissionDtoMapper.map(permission, repository))
.collect(toList());
return new HalRepresentation(createLinks(repository), embedDtos(repositoryPermissionDtoList));
}
private Links createLinks(Repository repository) {

View File

@@ -10,6 +10,8 @@ import lombok.ToString;
import javax.validation.constraints.Pattern;
import java.util.Collection;
import static sonia.scm.api.v2.ValidationConstraints.USER_GROUP_PATTERN;
@Getter @Setter @ToString @NoArgsConstructor
@@ -20,16 +22,7 @@ public class RepositoryPermissionDto extends HalRepresentation {
@Pattern(regexp = USER_GROUP_PATTERN)
private String name;
/**
* the type can be replaced with a dto enum if the mapstruct 1.3.0 is stable
* the mapstruct has a Bug on mapping enums in the 1.2.0-Final Version
*
* see the bug fix: https://github.com/mapstruct/mapstruct/commit/460e87eef6eb71245b387fdb0509c726676a8e19
*
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String type;
private Collection<String> verbs;
private boolean groupPermission = false;
@@ -38,7 +31,6 @@ public class RepositoryPermissionDto extends HalRepresentation {
this.groupPermission = groupPermission;
}
@Override
@SuppressWarnings("squid:S1185") // We want to have this method available in this package
protected HalRepresentation add(Links links) {

View File

@@ -37,16 +37,19 @@ import static sonia.scm.api.v2.resources.RepositoryPermissionDto.GROUP_PREFIX;
@Slf4j
public class RepositoryPermissionRootResource {
private RepositoryPermissionDtoToRepositoryPermissionMapper dtoToModelMapper;
private RepositoryPermissionToRepositoryPermissionDtoMapper modelToDtoMapper;
private RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper;
private ResourceLinks resourceLinks;
private final RepositoryManager manager;
@Inject
public RepositoryPermissionRootResource(RepositoryPermissionDtoToRepositoryPermissionMapper dtoToModelMapper, RepositoryPermissionToRepositoryPermissionDtoMapper modelToDtoMapper, RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper, ResourceLinks resourceLinks, RepositoryManager manager) {
public RepositoryPermissionRootResource(
RepositoryPermissionDtoToRepositoryPermissionMapper dtoToModelMapper,
RepositoryPermissionToRepositoryPermissionDtoMapper modelToDtoMapper,
RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper,
ResourceLinks resourceLinks,
RepositoryManager manager) {
this.dtoToModelMapper = dtoToModelMapper;
this.modelToDtoMapper = modelToDtoMapper;
this.repositoryPermissionCollectionToDtoMapper = repositoryPermissionCollectionToDtoMapper;
@@ -54,7 +57,6 @@ public class RepositoryPermissionRootResource {
this.manager = manager;
}
/**
* Adds a new permission to the user or group managed by the repository
*
@@ -73,19 +75,17 @@ public class RepositoryPermissionRootResource {
@TypeHint(TypeHint.NO_CONTENT.class)
@Consumes(VndMediaType.PERMISSION)
@Path("")
public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name,@Valid RepositoryPermissionDto permission) {
public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name, @Valid RepositoryPermissionDto permission) {
log.info("try to add new permission: {}", permission);
Repository repository = load(namespace, name);
RepositoryPermissions.permissionWrite(repository).check();
checkPermissionAlreadyExists(permission, repository);
// TODO RP
// repository.addPermission(dtoToModelMapper.map(permission));
repository.addPermission(dtoToModelMapper.map(permission));
manager.modify(repository);
String urlPermissionName = modelToDtoMapper.getUrlPermissionName(permission);
return Response.created(URI.create(resourceLinks.repositoryPermission().self(namespace, name, urlPermissionName))).build();
}
/**
* Get the searched permission with permission name related to a repository
*
@@ -107,17 +107,15 @@ public class RepositoryPermissionRootResource {
Repository repository = load(namespace, name);
RepositoryPermissions.permissionRead(repository).check();
return Response.ok(
// TODO RP
// repository.getPermissions()
// .stream()
// .filter(filterPermission(permissionName))
// .map(permission -> modelToDtoMapper.map(permission, repository))
// .findFirst()
// .orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)))
repository.getPermissions()
.stream()
.filter(filterPermission(permissionName))
.map(permission -> modelToDtoMapper.map(permission, repository))
.findFirst()
.orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)))
).build();
}
/**
* Get all permissions related to a repository
*
@@ -141,7 +139,6 @@ public class RepositoryPermissionRootResource {
return Response.ok(repositoryPermissionCollectionToDtoMapper.map(repository)).build();
}
/**
* Update a permission to the user or group managed by the repository
* ignore the user input for groupPermission and take it from the path parameter (if the group prefix (@) exists it is a group permission)
@@ -175,13 +172,12 @@ public class RepositoryPermissionRootResource {
checkPermissionAlreadyExists(permission, repository);
}
// TODO RP
// RepositoryPermission existingPermission = repository.getPermissions()
// .stream()
// .filter(filterPermission(permissionName))
// .findFirst()
// .orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)));
// dtoToModelMapper.modify(existingPermission, permission);
RepositoryPermission existingPermission = repository.getPermissions()
.stream()
.filter(filterPermission(permissionName))
.findFirst()
.orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)));
dtoToModelMapper.modify(existingPermission, permission);
manager.modify(repository);
log.info("the permission with name: {} is updated.", permissionName);
return Response.noContent().build();
@@ -208,22 +204,20 @@ public class RepositoryPermissionRootResource {
log.info("try to delete the permission with name: {}.", permissionName);
Repository repository = load(namespace, name);
RepositoryPermissions.modify(repository).check();
// TODO RP
// repository.getPermissions()
// .stream()
// .filter(filterPermission(permissionName))
// .findFirst()
// .ifPresent(repository::removePermission)
// ;
repository.getPermissions()
.stream()
.filter(filterPermission(permissionName))
.findFirst()
.ifPresent(repository::removePermission);
manager.modify(repository);
log.info("the permission with name: {} is updated.", permissionName);
return Response.noContent().build();
}
Predicate<RepositoryPermission> filterPermission(String permissionName) {
return permission -> getPermissionName(permissionName).equals(permission.getName())
private Predicate<RepositoryPermission> filterPermission(String name) {
return permission -> getPermissionName(name).equals(permission.getName())
&&
permission.isGroupPermission() == isGroupPermission(permissionName);
permission.isGroupPermission() == isGroupPermission(name);
}
private String getPermissionName(String permissionName) {
@@ -236,7 +230,6 @@ public class RepositoryPermissionRootResource {
return permissionName.startsWith(GROUP_PREFIX);
}
/**
* check if the actual user is permitted to manage the repository permissions
* return the repository if the user is permitted
@@ -266,10 +259,9 @@ public class RepositoryPermissionRootResource {
}
private boolean isPermissionExist(RepositoryPermissionDto permission, Repository repository) {
return true;
// return repository.getPermissions()
// .stream()
// .anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission());
return repository.getPermissions()
.stream()
.anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission());
}
}

View File

@@ -63,7 +63,6 @@ import sonia.scm.user.UserPermissions;
import sonia.scm.util.Util;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
//~--- JDK imports ------------------------------------------------------------
@@ -199,12 +198,7 @@ public class DefaultAuthorizationCollector implements AuthorizationCollector
private void collectRepositoryPermissions(Builder<String> builder,
Repository repository, User user, GroupNames groups)
{
// TODO RP
Collection<RepositoryPermission> repositoryPermissions
= Collections.emptyList();
// = repository.getPermissions();
Collection<RepositoryPermission> repositoryPermissions = repository.getPermissions();
if (Util.isNotEmpty(repositoryPermissions))
{
@@ -214,7 +208,7 @@ public class DefaultAuthorizationCollector implements AuthorizationCollector
hasPermission = isUserPermitted(user, groups, permission);
if (hasPermission)
{
String perm = null; // TODO RP permission.getType().getPermissionPrefix().concat(repository.getId());
String perm = "repository:" + String.join(",", permission.getVerbs()) + ":" + repository.getId();
if (logger.isTraceEnabled())
{
logger.trace("add repository permission {} for user {} at repository {}",