#9208 add group permission prefix

This commit is contained in:
Mohamed Karray
2018-08-31 12:23:31 +02:00
parent beb8b95924
commit f0c9c11f2d

View File

@@ -5,7 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeader;
import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.StatusCodes;
import com.webcohesion.enunciate.metadata.rs.TypeHint; import com.webcohesion.enunciate.metadata.rs.TypeHint;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import sonia.scm.AlreadyExistsException; import sonia.scm.AlreadyExistsException;
import sonia.scm.NotFoundException; import sonia.scm.NotFoundException;
import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.NamespaceAndName;
@@ -28,10 +27,12 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.net.URI; import java.net.URI;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate;
@Slf4j @Slf4j
public class PermissionRootResource { public class PermissionRootResource {
private static final String GROUP_PREFIX = "@";
private PermissionDtoToPermissionMapper dtoToModelMapper; private PermissionDtoToPermissionMapper dtoToModelMapper;
private PermissionToPermissionDtoMapper modelToDtoMapper; private PermissionToPermissionDtoMapper modelToDtoMapper;
private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper; private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper;
@@ -101,7 +102,7 @@ public class PermissionRootResource {
return Response.ok( return Response.ok(
repository.getPermissions() repository.getPermissions()
.stream() .stream()
.filter(permission -> permissionName.equals(permission.getName())) .filter(filterPermission(permissionName))
.map(permission -> modelToDtoMapper.map(permission, repository)) .map(permission -> modelToDtoMapper.map(permission, repository))
.findFirst() .findFirst()
.orElseThrow(NotFoundException::new) .orElseThrow(NotFoundException::new)
@@ -158,9 +159,9 @@ public class PermissionRootResource {
RepositoryPermissions.permissionWrite(repository).check(); RepositoryPermissions.permissionWrite(repository).check();
Permission existingPermission = repository.getPermissions() Permission existingPermission = repository.getPermissions()
.stream() .stream()
.filter(perm -> StringUtils.isNotBlank(perm.getName()) && perm.getName().equals(permissionName)) .filter(filterPermission(permissionName))
.findFirst() .findFirst()
.orElseThrow(() -> new NotFoundException()); .orElseThrow(NotFoundException::new);
dtoToModelMapper.modify(existingPermission, permission); dtoToModelMapper.modify(existingPermission, permission);
manager.modify(repository); manager.modify(repository);
log.info("the permission with name: {} is updated.", permissionName); log.info("the permission with name: {} is updated.", permissionName);
@@ -186,11 +187,11 @@ public class PermissionRootResource {
@PathParam("name") String name, @PathParam("name") String name,
@PathParam("permission-name") String permissionName) throws NotFoundException { @PathParam("permission-name") String permissionName) throws NotFoundException {
log.info("try to delete the permission with name: {}.", permissionName); log.info("try to delete the permission with name: {}.", permissionName);
Repository repository = load(namespace, name); Repository repository = load(namespace, name);
RepositoryPermissions.modify(repository).check(); RepositoryPermissions.modify(repository).check();
repository.getPermissions() repository.getPermissions()
.stream() .stream()
.filter(perm -> StringUtils.isNotBlank(perm.getName()) && perm.getName().equals(permissionName)) .filter(filterPermission(permissionName))
.findFirst() .findFirst()
.ifPresent(p -> repository.getPermissions().remove(p)) .ifPresent(p -> repository.getPermissions().remove(p))
; ;
@@ -199,6 +200,16 @@ public class PermissionRootResource {
return Response.noContent().build(); return Response.noContent().build();
} }
Predicate<Permission> filterPermission(String permissionName) {
boolean isGroupPermission = permissionName.startsWith(GROUP_PREFIX);
return permission -> Optional.of(permissionName)
.filter(p -> !isGroupPermission)
.orElse(permissionName.substring(1))
.equals(permission.getName())
&&
permission.isGroupPermission() == isGroupPermission;
}
/** /**
* check if the actual user is permitted to manage the repository permissions * check if the actual user is permitted to manage the repository permissions
@@ -224,7 +235,7 @@ public class PermissionRootResource {
private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException { private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException {
boolean isPermissionAlreadyExist = repository.getPermissions() boolean isPermissionAlreadyExist = repository.getPermissions()
.stream() .stream()
.anyMatch(p -> p.getName().equals(permission.getName())); .anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission());
if (isPermissionAlreadyExist) { if (isPermissionAlreadyExist) {
throw new AlreadyExistsException(); throw new AlreadyExistsException();
} }