Rename Permission -> RepositoryPermission

This commit is contained in:
René Pfeuffer
2019-01-17 14:25:49 +01:00
parent ad65c8cd02
commit 783c425b1e
18 changed files with 133 additions and 131 deletions

View File

@@ -81,7 +81,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
private Long lastModified; private Long lastModified;
private String namespace; private String namespace;
private String name; private String name;
private final Set<Permission> permissions = new HashSet<>(); private final Set<RepositoryPermission> permissions = new HashSet<>();
@XmlElement(name = "public") @XmlElement(name = "public")
private boolean publicReadable = false; private boolean publicReadable = false;
private boolean archived = false; private boolean archived = false;
@@ -122,7 +122,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
* @param permissions permissions for specific users and groups. * @param permissions permissions for specific users and groups.
*/ */
public Repository(String id, String type, String namespace, String name, String contact, public Repository(String id, String type, String namespace, String name, String contact,
String description, Permission... permissions) { String description, RepositoryPermission... permissions) {
this.id = id; this.id = id;
this.type = type; this.type = type;
this.namespace = namespace; this.namespace = namespace;
@@ -201,7 +201,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
return new NamespaceAndName(getNamespace(), getName()); return new NamespaceAndName(getNamespace(), getName());
} }
public Collection<Permission> getPermissions() { public Collection<RepositoryPermission> getPermissions() {
return Collections.unmodifiableCollection(permissions); return Collections.unmodifiableCollection(permissions);
} }
@@ -297,16 +297,16 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per
this.name = name; this.name = name;
} }
public void setPermissions(Collection<Permission> permissions) { public void setPermissions(Collection<RepositoryPermission> permissions) {
this.permissions.clear(); this.permissions.clear();
this.permissions.addAll(permissions); this.permissions.addAll(permissions);
} }
public void addPermission(Permission newPermission) { public void addPermission(RepositoryPermission newPermission) {
this.permissions.add(newPermission); this.permissions.add(newPermission);
} }
public void removePermission(Permission permission) { public void removePermission(RepositoryPermission permission) {
this.permissions.remove(permission); this.permissions.remove(permission);
} }

View File

@@ -53,7 +53,7 @@ import java.io.Serializable;
*/ */
@XmlRootElement(name = "permissions") @XmlRootElement(name = "permissions")
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorType(XmlAccessType.FIELD)
public class Permission implements PermissionObject, Serializable public class RepositoryPermission implements PermissionObject, Serializable
{ {
private static final long serialVersionUID = -2915175031430884040L; private static final long serialVersionUID = -2915175031430884040L;
@@ -63,41 +63,41 @@ public class Permission implements PermissionObject, Serializable
private PermissionType type = PermissionType.READ; private PermissionType type = PermissionType.READ;
/** /**
* Constructs a new {@link Permission}. * Constructs a new {@link RepositoryPermission}.
* This constructor is used by JAXB. * This constructor is used by JAXB.
* *
*/ */
public Permission() {} public RepositoryPermission() {}
/** /**
* Constructs a new {@link Permission} with type = {@link PermissionType#READ} * Constructs a new {@link RepositoryPermission} with type = {@link PermissionType#READ}
* for the specified user. * for the specified user.
* *
* *
* @param name name of the user * @param name name of the user
*/ */
public Permission(String name) public RepositoryPermission(String name)
{ {
this(); this();
this.name = name; this.name = name;
} }
/** /**
* Constructs a new {@link Permission} with the specified type for * Constructs a new {@link RepositoryPermission} with the specified type for
* the given user. * the given user.
* *
* *
* @param name name of the user * @param name name of the user
* @param type type of the permission * @param type type of the permission
*/ */
public Permission(String name, PermissionType type) public RepositoryPermission(String name, PermissionType type)
{ {
this(name); this(name);
this.type = type; this.type = type;
} }
/** /**
* Constructs a new {@link Permission} with the specified type for * Constructs a new {@link RepositoryPermission} with the specified type for
* the given user or group. * the given user or group.
* *
* *
@@ -105,7 +105,7 @@ public class Permission implements PermissionObject, Serializable
* @param type type of the permission * @param type type of the permission
* @param groupPermission true if the permission is a permission for a group * @param groupPermission true if the permission is a permission for a group
*/ */
public Permission(String name, PermissionType type, boolean groupPermission) public RepositoryPermission(String name, PermissionType type, boolean groupPermission)
{ {
this(name, type); this(name, type);
this.groupPermission = groupPermission; this.groupPermission = groupPermission;
@@ -114,12 +114,12 @@ public class Permission implements PermissionObject, Serializable
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/** /**
* Returns true if the {@link Permission} is the same as the obj argument. * Returns true if the {@link RepositoryPermission} is the same as the obj argument.
* *
* *
* @param obj the reference object with which to compare * @param obj the reference object with which to compare
* *
* @return true if the {@link Permission} is the same as the obj argument * @return true if the {@link RepositoryPermission} is the same as the obj argument
*/ */
@Override @Override
public boolean equals(Object obj) public boolean equals(Object obj)
@@ -134,7 +134,7 @@ public class Permission implements PermissionObject, Serializable
return false; return false;
} }
final Permission other = (Permission) obj; final RepositoryPermission other = (RepositoryPermission) obj;
return Objects.equal(name, other.name) return Objects.equal(name, other.name)
&& Objects.equal(type, other.type) && Objects.equal(type, other.type)
@@ -142,10 +142,10 @@ public class Permission implements PermissionObject, Serializable
} }
/** /**
* Returns the hash code value for the {@link Permission}. * Returns the hash code value for the {@link RepositoryPermission}.
* *
* *
* @return the hash code value for the {@link Permission} * @return the hash code value for the {@link RepositoryPermission}
*/ */
@Override @Override
public int hashCode() public int hashCode()

View File

@@ -27,7 +27,7 @@ public class MapperModule extends AbstractModule {
bind(BranchToBranchDtoMapper.class).to(Mappers.getMapper(BranchToBranchDtoMapper.class).getClass()); bind(BranchToBranchDtoMapper.class).to(Mappers.getMapper(BranchToBranchDtoMapper.class).getClass());
bind(PermissionDtoToPermissionMapper.class).to(Mappers.getMapper(PermissionDtoToPermissionMapper.class).getClass()); bind(PermissionDtoToPermissionMapper.class).to(Mappers.getMapper(PermissionDtoToPermissionMapper.class).getClass());
bind(PermissionToPermissionDtoMapper.class).to(Mappers.getMapper(PermissionToPermissionDtoMapper.class).getClass()); bind(RepositoryPermissionToRepositoryPermissionDtoMapper.class).to(Mappers.getMapper(RepositoryPermissionToRepositoryPermissionDtoMapper.class).getClass());
bind(ChangesetToChangesetDtoMapper.class).to(Mappers.getMapper(ChangesetToChangesetDtoMapper.class).getClass()); bind(ChangesetToChangesetDtoMapper.class).to(Mappers.getMapper(ChangesetToChangesetDtoMapper.class).getClass());
bind(ChangesetToParentDtoMapper.class).to(Mappers.getMapper(ChangesetToParentDtoMapper.class).getClass()); bind(ChangesetToParentDtoMapper.class).to(Mappers.getMapper(ChangesetToParentDtoMapper.class).getClass());

View File

@@ -2,20 +2,20 @@ package sonia.scm.api.v2.resources;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget; import org.mapstruct.MappingTarget;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
@Mapper @Mapper
public abstract class PermissionDtoToPermissionMapper { public abstract class PermissionDtoToPermissionMapper {
public abstract Permission map(PermissionDto permissionDto); public abstract RepositoryPermission map(RepositoryPermissionDto permissionDto);
/** /**
* this method is needed to modify an existing permission object * this method is needed to modify an existing permission object
* *
* @param target the target permission * @param target the target permission
* @param permissionDto the source dto * @param repositoryPermissionDto the source dto
* @return the mapped target permission object * @return the mapped target permission object
*/ */
public abstract void modify(@MappingTarget Permission target, PermissionDto permissionDto); public abstract void modify(@MappingTarget RepositoryPermission target, RepositoryPermissionDto repositoryPermissionDto);
} }

View File

@@ -8,14 +8,13 @@ import lombok.extern.slf4j.Slf4j;
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;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.repository.RepositoryPermissions; import sonia.scm.repository.RepositoryPermissions;
import sonia.scm.web.VndMediaType; import sonia.scm.web.VndMediaType;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
@@ -33,24 +32,24 @@ import java.util.function.Predicate;
import static sonia.scm.AlreadyExistsException.alreadyExists; import static sonia.scm.AlreadyExistsException.alreadyExists;
import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.ContextEntry.ContextBuilder.entity;
import static sonia.scm.NotFoundException.notFound; import static sonia.scm.NotFoundException.notFound;
import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; import static sonia.scm.api.v2.resources.RepositoryPermissionDto.GROUP_PREFIX;
@Slf4j @Slf4j
public class PermissionRootResource { public class PermissionRootResource {
private PermissionDtoToPermissionMapper dtoToModelMapper; private PermissionDtoToPermissionMapper dtoToModelMapper;
private PermissionToPermissionDtoMapper modelToDtoMapper; private RepositoryPermissionToRepositoryPermissionDtoMapper modelToDtoMapper;
private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper; private RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper;
private ResourceLinks resourceLinks; private ResourceLinks resourceLinks;
private final RepositoryManager manager; private final RepositoryManager manager;
@Inject @Inject
public PermissionRootResource(PermissionDtoToPermissionMapper dtoToModelMapper, PermissionToPermissionDtoMapper modelToDtoMapper, PermissionCollectionToDtoMapper permissionCollectionToDtoMapper, ResourceLinks resourceLinks, RepositoryManager manager) { public PermissionRootResource(PermissionDtoToPermissionMapper dtoToModelMapper, RepositoryPermissionToRepositoryPermissionDtoMapper modelToDtoMapper, RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper, ResourceLinks resourceLinks, RepositoryManager manager) {
this.dtoToModelMapper = dtoToModelMapper; this.dtoToModelMapper = dtoToModelMapper;
this.modelToDtoMapper = modelToDtoMapper; this.modelToDtoMapper = modelToDtoMapper;
this.permissionCollectionToDtoMapper = permissionCollectionToDtoMapper; this.repositoryPermissionCollectionToDtoMapper = repositoryPermissionCollectionToDtoMapper;
this.resourceLinks = resourceLinks; this.resourceLinks = resourceLinks;
this.manager = manager; this.manager = manager;
} }
@@ -74,7 +73,7 @@ public class PermissionRootResource {
@TypeHint(TypeHint.NO_CONTENT.class) @TypeHint(TypeHint.NO_CONTENT.class)
@Consumes(VndMediaType.PERMISSION) @Consumes(VndMediaType.PERMISSION)
@Path("") @Path("")
public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name,@Valid PermissionDto permission) { public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name,@Valid RepositoryPermissionDto permission) {
log.info("try to add new permission: {}", permission); log.info("try to add new permission: {}", permission);
Repository repository = load(namespace, name); Repository repository = load(namespace, name);
RepositoryPermissions.permissionWrite(repository).check(); RepositoryPermissions.permissionWrite(repository).check();
@@ -101,7 +100,7 @@ public class PermissionRootResource {
@ResponseCode(code = 500, condition = "internal server error") @ResponseCode(code = 500, condition = "internal server error")
}) })
@Produces(VndMediaType.PERMISSION) @Produces(VndMediaType.PERMISSION)
@TypeHint(PermissionDto.class) @TypeHint(RepositoryPermissionDto.class)
@Path("{permission-name}") @Path("{permission-name}")
public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName) { public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName) {
Repository repository = load(namespace, name); Repository repository = load(namespace, name);
@@ -112,7 +111,7 @@ public class PermissionRootResource {
.filter(filterPermission(permissionName)) .filter(filterPermission(permissionName))
.map(permission -> modelToDtoMapper.map(permission, repository)) .map(permission -> modelToDtoMapper.map(permission, repository))
.findFirst() .findFirst()
.orElseThrow(() -> notFound(entity(Permission.class, namespace).in(Repository.class, namespace + "/" + name))) .orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)))
).build(); ).build();
} }
@@ -132,12 +131,12 @@ public class PermissionRootResource {
@ResponseCode(code = 500, condition = "internal server error") @ResponseCode(code = 500, condition = "internal server error")
}) })
@Produces(VndMediaType.PERMISSION) @Produces(VndMediaType.PERMISSION)
@TypeHint(PermissionDto.class) @TypeHint(RepositoryPermissionDto.class)
@Path("") @Path("")
public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) { public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) {
Repository repository = load(namespace, name); Repository repository = load(namespace, name);
RepositoryPermissions.permissionRead(repository).check(); RepositoryPermissions.permissionRead(repository).check();
return Response.ok(permissionCollectionToDtoMapper.map(repository)).build(); return Response.ok(repositoryPermissionCollectionToDtoMapper.map(repository)).build();
} }
@@ -161,23 +160,23 @@ public class PermissionRootResource {
public Response update(@PathParam("namespace") String namespace, public Response update(@PathParam("namespace") String namespace,
@PathParam("name") String name, @PathParam("name") String name,
@PathParam("permission-name") String permissionName, @PathParam("permission-name") String permissionName,
@Valid PermissionDto permission) { @Valid RepositoryPermissionDto permission) {
log.info("try to update the permission with name: {}. the modified permission is: {}", permissionName, permission); log.info("try to update the permission with name: {}. the modified permission is: {}", permissionName, permission);
Repository repository = load(namespace, name); Repository repository = load(namespace, name);
RepositoryPermissions.permissionWrite(repository).check(); RepositoryPermissions.permissionWrite(repository).check();
String extractedPermissionName = getPermissionName(permissionName); String extractedPermissionName = getPermissionName(permissionName);
if (!isPermissionExist(new PermissionDto(extractedPermissionName, isGroupPermission(permissionName)), repository)) { if (!isPermissionExist(new RepositoryPermissionDto(extractedPermissionName, isGroupPermission(permissionName)), repository)) {
throw notFound(entity(Permission.class, namespace).in(Repository.class, namespace + "/" + name)); throw notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name));
} }
permission.setGroupPermission(isGroupPermission(permissionName)); permission.setGroupPermission(isGroupPermission(permissionName));
if (!extractedPermissionName.equals(permission.getName())) { if (!extractedPermissionName.equals(permission.getName())) {
checkPermissionAlreadyExists(permission, repository); checkPermissionAlreadyExists(permission, repository);
} }
Permission existingPermission = repository.getPermissions() RepositoryPermission existingPermission = repository.getPermissions()
.stream() .stream()
.filter(filterPermission(permissionName)) .filter(filterPermission(permissionName))
.findFirst() .findFirst()
.orElseThrow(() -> notFound(entity(Permission.class, namespace).in(Repository.class, namespace + "/" + name))); .orElseThrow(() -> notFound(entity(RepositoryPermission.class, namespace).in(Repository.class, namespace + "/" + name)));
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);
@@ -216,7 +215,7 @@ public class PermissionRootResource {
return Response.noContent().build(); return Response.noContent().build();
} }
Predicate<Permission> filterPermission(String permissionName) { Predicate<RepositoryPermission> filterPermission(String permissionName) {
return permission -> getPermissionName(permissionName).equals(permission.getName()) return permission -> getPermissionName(permissionName).equals(permission.getName())
&& &&
permission.isGroupPermission() == isGroupPermission(permissionName); permission.isGroupPermission() == isGroupPermission(permissionName);
@@ -255,13 +254,13 @@ public class PermissionRootResource {
* @param repository the repository to be inspected * @param repository the repository to be inspected
* @throws AlreadyExistsException if the permission already exists in the repository * @throws AlreadyExistsException if the permission already exists in the repository
*/ */
private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) { private void checkPermissionAlreadyExists(RepositoryPermissionDto permission, Repository repository) {
if (isPermissionExist(permission, repository)) { if (isPermissionExist(permission, repository)) {
throw alreadyExists(entity("permission", permission.getName()).in(repository)); throw alreadyExists(entity("permission", permission.getName()).in(repository));
} }
} }
private boolean isPermissionExist(PermissionDto permission, Repository repository) { private boolean isPermissionExist(RepositoryPermissionDto permission, Repository repository) {
return repository.getPermissions() return repository.getPermissions()
.stream() .stream()
.anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission()); .anyMatch(p -> p.getName().equals(permission.getName()) && p.isGroupPermission() == permission.isGroupPermission());

View File

@@ -6,7 +6,7 @@ import com.webcohesion.enunciate.metadata.rs.ResponseHeaders;
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 org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
@@ -100,7 +100,7 @@ public class RepositoryCollectionResource {
private Repository createModelObjectFromDto(@Valid RepositoryDto repositoryDto) { private Repository createModelObjectFromDto(@Valid RepositoryDto repositoryDto) {
Repository repository = dtoToRepositoryMapper.map(repositoryDto, null); Repository repository = dtoToRepositoryMapper.map(repositoryDto, null);
repository.setPermissions(singletonList(new Permission(currentUser(), PermissionType.OWNER))); repository.setPermissions(singletonList(new RepositoryPermission(currentUser(), PermissionType.OWNER)));
return repository; return repository;
} }

View File

@@ -14,23 +14,23 @@ import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
public class PermissionCollectionToDtoMapper { public class RepositoryPermissionCollectionToDtoMapper {
private final ResourceLinks resourceLinks; private final ResourceLinks resourceLinks;
private final PermissionToPermissionDtoMapper permissionToPermissionDtoMapper; private final RepositoryPermissionToRepositoryPermissionDtoMapper repositoryPermissionToRepositoryPermissionDtoMapper;
@Inject @Inject
public PermissionCollectionToDtoMapper(PermissionToPermissionDtoMapper permissionToPermissionDtoMapper, ResourceLinks resourceLinks) { public RepositoryPermissionCollectionToDtoMapper(RepositoryPermissionToRepositoryPermissionDtoMapper repositoryPermissionToRepositoryPermissionDtoMapper, ResourceLinks resourceLinks) {
this.resourceLinks = resourceLinks; this.resourceLinks = resourceLinks;
this.permissionToPermissionDtoMapper = permissionToPermissionDtoMapper; this.repositoryPermissionToRepositoryPermissionDtoMapper = repositoryPermissionToRepositoryPermissionDtoMapper;
} }
public HalRepresentation map(Repository repository) { public HalRepresentation map(Repository repository) {
List<PermissionDto> permissionDtoList = repository.getPermissions() List<RepositoryPermissionDto> repositoryPermissionDtoList = repository.getPermissions()
.stream() .stream()
.map(permission -> permissionToPermissionDtoMapper.map(permission, repository)) .map(permission -> repositoryPermissionToRepositoryPermissionDtoMapper.map(permission, repository))
.collect(toList()); .collect(toList());
return new HalRepresentation(createLinks(repository), embedDtos(permissionDtoList)); return new HalRepresentation(createLinks(repository), embedDtos(repositoryPermissionDtoList));
} }
private Links createLinks(Repository repository) { private Links createLinks(Repository repository) {
@@ -43,9 +43,9 @@ public class PermissionCollectionToDtoMapper {
return linksBuilder.build(); return linksBuilder.build();
} }
private Embedded embedDtos(List<PermissionDto> permissionDtoList) { private Embedded embedDtos(List<RepositoryPermissionDto> repositoryPermissionDtoList) {
return embeddedBuilder() return embeddedBuilder()
.with("permissions", permissionDtoList) .with("permissions", repositoryPermissionDtoList)
.build(); .build();
} }
} }

View File

@@ -13,7 +13,7 @@ import javax.validation.constraints.Pattern;
import static sonia.scm.api.v2.ValidationConstraints.USER_GROUP_PATTERN; import static sonia.scm.api.v2.ValidationConstraints.USER_GROUP_PATTERN;
@Getter @Setter @ToString @NoArgsConstructor @Getter @Setter @ToString @NoArgsConstructor
public class PermissionDto extends HalRepresentation { public class RepositoryPermissionDto extends HalRepresentation {
public static final String GROUP_PREFIX = "@"; public static final String GROUP_PREFIX = "@";
@@ -33,7 +33,7 @@ public class PermissionDto extends HalRepresentation {
private boolean groupPermission = false; private boolean groupPermission = false;
public PermissionDto(String permissionName, boolean groupPermission) { public RepositoryPermissionDto(String permissionName, boolean groupPermission) {
name = permissionName; name = permissionName;
this.groupPermission = groupPermission; this.groupPermission = groupPermission;
} }

View File

@@ -7,7 +7,7 @@ import org.mapstruct.Context;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget; import org.mapstruct.MappingTarget;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryPermissions; import sonia.scm.repository.RepositoryPermissions;
@@ -16,16 +16,16 @@ import java.util.Optional;
import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo; import static de.otto.edison.hal.Links.linkingTo;
import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; import static sonia.scm.api.v2.resources.RepositoryPermissionDto.GROUP_PREFIX;
@Mapper @Mapper
public abstract class PermissionToPermissionDtoMapper { public abstract class RepositoryPermissionToRepositoryPermissionDtoMapper {
@Inject @Inject
private ResourceLinks resourceLinks; private ResourceLinks resourceLinks;
@Mapping(target = "attributes", ignore = true) // We do not map HAL attributes @Mapping(target = "attributes", ignore = true) // We do not map HAL attributes
public abstract PermissionDto map(Permission permission, @Context Repository repository); public abstract RepositoryPermissionDto map(RepositoryPermission permission, @Context Repository repository);
@BeforeMapping @BeforeMapping
@@ -40,7 +40,7 @@ public abstract class PermissionToPermissionDtoMapper {
* @param repository the repository * @param repository the repository
*/ */
@AfterMapping @AfterMapping
void appendLinks(@MappingTarget PermissionDto target, @Context Repository repository) { void appendLinks(@MappingTarget RepositoryPermissionDto target, @Context Repository repository) {
String permissionName = getUrlPermissionName(target); String permissionName = getUrlPermissionName(target);
Links.Builder linksBuilder = linkingTo() Links.Builder linksBuilder = linkingTo()
.self(resourceLinks.permission().self(repository.getNamespace(), repository.getName(), permissionName)); .self(resourceLinks.permission().self(repository.getNamespace(), repository.getName(), permissionName));
@@ -51,9 +51,9 @@ public abstract class PermissionToPermissionDtoMapper {
target.add(linksBuilder.build()); target.add(linksBuilder.build());
} }
public String getUrlPermissionName(PermissionDto permissionDto) { public String getUrlPermissionName(RepositoryPermissionDto repositoryPermissionDto) {
return Optional.of(permissionDto.getName()) return Optional.of(repositoryPermissionDto.getName())
.filter(p -> !permissionDto.isGroupPermission()) .filter(p -> !repositoryPermissionDto.isGroupPermission())
.orElse(GROUP_PREFIX + permissionDto.getName()); .orElse(GROUP_PREFIX + repositoryPermissionDto.getName());
} }
} }

View File

@@ -54,7 +54,7 @@ import sonia.scm.cache.CacheManager;
import sonia.scm.group.GroupNames; import sonia.scm.group.GroupNames;
import sonia.scm.group.GroupPermissions; import sonia.scm.group.GroupPermissions;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryDAO; import sonia.scm.repository.RepositoryDAO;
import sonia.scm.user.User; import sonia.scm.user.User;
@@ -62,7 +62,6 @@ import sonia.scm.user.UserPermissions;
import sonia.scm.util.Util; import sonia.scm.util.Util;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Set; import java.util.Set;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -199,13 +198,13 @@ public class DefaultAuthorizationCollector implements AuthorizationCollector
private void collectRepositoryPermissions(Builder<String> builder, private void collectRepositoryPermissions(Builder<String> builder,
Repository repository, User user, GroupNames groups) Repository repository, User user, GroupNames groups)
{ {
Collection<Permission> repositoryPermissions Collection<RepositoryPermission> repositoryPermissions
= repository.getPermissions(); = repository.getPermissions();
if (Util.isNotEmpty(repositoryPermissions)) if (Util.isNotEmpty(repositoryPermissions))
{ {
boolean hasPermission = false; boolean hasPermission = false;
for (sonia.scm.repository.Permission permission : repositoryPermissions) for (RepositoryPermission permission : repositoryPermissions)
{ {
hasPermission = isUserPermitted(user, groups, permission); hasPermission = isUserPermitted(user, groups, permission);
if (hasPermission) if (hasPermission)

View File

@@ -1,5 +1,6 @@
package sonia.scm.security; package sonia.scm.security;
import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -8,6 +9,7 @@ public class PermissionAssigner {
private final SecuritySystem securitySystem; private final SecuritySystem securitySystem;
@Inject
public PermissionAssigner(SecuritySystem securitySystem) { public PermissionAssigner(SecuritySystem securitySystem) {
this.securitySystem = securitySystem; this.securitySystem = securitySystem;
} }

View File

@@ -29,7 +29,7 @@ import org.junit.jupiter.api.TestFactory;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.NamespaceAndName;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
@@ -58,7 +58,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks; import static org.mockito.MockitoAnnotations.initMocks;
import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher;
import static sonia.scm.api.v2.resources.PermissionDto.GROUP_PREFIX; import static sonia.scm.api.v2.resources.RepositoryPermissionDto.GROUP_PREFIX;
@Slf4j @Slf4j
@SubjectAware( @SubjectAware(
@@ -77,14 +77,14 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
private static final String PATH_OF_ALL_PERMISSIONS = REPOSITORY_NAMESPACE + "/" + REPOSITORY_NAME + "/permissions/"; private static final String PATH_OF_ALL_PERMISSIONS = REPOSITORY_NAMESPACE + "/" + REPOSITORY_NAME + "/permissions/";
private static final String PATH_OF_ONE_PERMISSION = PATH_OF_ALL_PERMISSIONS + PERMISSION_NAME; private static final String PATH_OF_ONE_PERMISSION = PATH_OF_ALL_PERMISSIONS + PERMISSION_NAME;
private static final String PERMISSION_TEST_PAYLOAD = "{ \"name\" : \"permission_name\", \"type\" : \"READ\" }"; private static final String PERMISSION_TEST_PAYLOAD = "{ \"name\" : \"permission_name\", \"type\" : \"READ\" }";
private static final ArrayList<Permission> TEST_PERMISSIONS = Lists private static final ArrayList<RepositoryPermission> TEST_PERMISSIONS = Lists
.newArrayList( .newArrayList(
new Permission("user_write", PermissionType.WRITE, false), new RepositoryPermission("user_write", PermissionType.WRITE, false),
new Permission("user_read", PermissionType.READ, false), new RepositoryPermission("user_read", PermissionType.READ, false),
new Permission("user_owner", PermissionType.OWNER, false), new RepositoryPermission("user_owner", PermissionType.OWNER, false),
new Permission("group_read", PermissionType.READ, true), new RepositoryPermission("group_read", PermissionType.READ, true),
new Permission("group_write", PermissionType.WRITE, true), new RepositoryPermission("group_write", PermissionType.WRITE, true),
new Permission("group_owner", PermissionType.OWNER, true) new RepositoryPermission("group_owner", PermissionType.OWNER, true)
); );
private final ExpectedRequest requestGETAllPermissions = new ExpectedRequest() private final ExpectedRequest requestGETAllPermissions = new ExpectedRequest()
.description("GET all permissions") .description("GET all permissions")
@@ -121,12 +121,12 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri);
@InjectMocks @InjectMocks
private PermissionToPermissionDtoMapperImpl permissionToPermissionDtoMapper; private RepositoryPermissionToRepositoryPermissionDtoMapperImpl permissionToPermissionDtoMapper;
@InjectMocks @InjectMocks
private PermissionDtoToPermissionMapperImpl permissionDtoToPermissionMapper; private PermissionDtoToPermissionMapperImpl permissionDtoToPermissionMapper;
private PermissionCollectionToDtoMapper permissionCollectionToDtoMapper; private RepositoryPermissionCollectionToDtoMapper repositoryPermissionCollectionToDtoMapper;
private PermissionRootResource permissionRootResource; private PermissionRootResource permissionRootResource;
@@ -137,8 +137,8 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Before @Before
public void prepareEnvironment() { public void prepareEnvironment() {
initMocks(this); initMocks(this);
permissionCollectionToDtoMapper = new PermissionCollectionToDtoMapper(permissionToPermissionDtoMapper, resourceLinks); repositoryPermissionCollectionToDtoMapper = new RepositoryPermissionCollectionToDtoMapper(permissionToPermissionDtoMapper, resourceLinks);
permissionRootResource = new PermissionRootResource(permissionDtoToPermissionMapper, permissionToPermissionDtoMapper, permissionCollectionToDtoMapper, resourceLinks, repositoryManager); permissionRootResource = new PermissionRootResource(permissionDtoToPermissionMapper, permissionToPermissionDtoMapper, repositoryPermissionCollectionToDtoMapper, resourceLinks, repositoryManager);
super.permissionRootResource = Providers.of(permissionRootResource); super.permissionRootResource = Providers.of(permissionRootResource);
dispatcher = createDispatcher(getRepositoryRootResource()); dispatcher = createDispatcher(getRepositoryRootResource());
subjectThreadState.bind(); subjectThreadState.bind();
@@ -207,7 +207,7 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldGetPermissionByName() throws URISyntaxException { public void shouldGetPermissionByName() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_READ); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_READ);
Permission expectedPermission = TEST_PERMISSIONS.get(0); RepositoryPermission expectedPermission = TEST_PERMISSIONS.get(0);
assertExpectedRequest(requestGETPermission assertExpectedRequest(requestGETPermission
.expectedResponseStatus(200) .expectedResponseStatus(200)
.path(PATH_OF_ALL_PERMISSIONS + expectedPermission.getName()) .path(PATH_OF_ALL_PERMISSIONS + expectedPermission.getName())
@@ -215,8 +215,8 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
String body = response.getContentAsString(); String body = response.getContentAsString();
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
try { try {
PermissionDto actualPermissionDto = mapper.readValue(body, PermissionDto.class); RepositoryPermissionDto actualRepositoryPermissionDto = mapper.readValue(body, RepositoryPermissionDto.class);
assertThat(actualPermissionDto) assertThat(actualRepositoryPermissionDto)
.as("response payload match permission object model") .as("response payload match permission object model")
.isEqualToComparingFieldByFieldRecursively(getExpectedPermissionDto(expectedPermission, PERMISSION_READ)) .isEqualToComparingFieldByFieldRecursively(getExpectedPermissionDto(expectedPermission, PERMISSION_READ))
; ;
@@ -259,10 +259,10 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldGetCreatedPermissions() throws URISyntaxException { public void shouldGetCreatedPermissions() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE);
Permission newPermission = new Permission("new_group_perm", PermissionType.WRITE, true); RepositoryPermission newPermission = new RepositoryPermission("new_group_perm", PermissionType.WRITE, true);
ArrayList<Permission> permissions = Lists.newArrayList(TEST_PERMISSIONS); ArrayList<RepositoryPermission> permissions = Lists.newArrayList(TEST_PERMISSIONS);
permissions.add(newPermission); permissions.add(newPermission);
ImmutableList<Permission> expectedPermissions = ImmutableList.copyOf(permissions); ImmutableList<RepositoryPermission> expectedPermissions = ImmutableList.copyOf(permissions);
assertExpectedRequest(requestPOSTPermission assertExpectedRequest(requestPOSTPermission
.content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : true}") .content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : true}")
.expectedResponseStatus(201) .expectedResponseStatus(201)
@@ -276,7 +276,7 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldNotAddExistingPermission() throws URISyntaxException { public void shouldNotAddExistingPermission() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE);
Permission newPermission = TEST_PERMISSIONS.get(0); RepositoryPermission newPermission = TEST_PERMISSIONS.get(0);
assertExpectedRequest(requestPOSTPermission assertExpectedRequest(requestPOSTPermission
.content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : false}") .content("{\"name\" : \"" + newPermission.getName() + "\" , \"type\" : \"WRITE\" , \"groupPermission\" : false}")
.expectedResponseStatus(409) .expectedResponseStatus(409)
@@ -286,10 +286,10 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldGetUpdatedPermissions() throws URISyntaxException { public void shouldGetUpdatedPermissions() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_WRITE);
Permission modifiedPermission = TEST_PERMISSIONS.get(0); RepositoryPermission modifiedPermission = TEST_PERMISSIONS.get(0);
// modify the type to owner // modify the type to owner
modifiedPermission.setType(PermissionType.OWNER); modifiedPermission.setType(PermissionType.OWNER);
ImmutableList<Permission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS); ImmutableList<RepositoryPermission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS);
assertExpectedRequest(requestPUTPermission assertExpectedRequest(requestPUTPermission
.content("{\"name\" : \"" + modifiedPermission.getName() + "\" , \"type\" : \"OWNER\" , \"groupPermission\" : false}") .content("{\"name\" : \"" + modifiedPermission.getName() + "\" , \"type\" : \"OWNER\" , \"groupPermission\" : false}")
.path(PATH_OF_ALL_PERMISSIONS + modifiedPermission.getName()) .path(PATH_OF_ALL_PERMISSIONS + modifiedPermission.getName())
@@ -305,8 +305,8 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldDeletePermissions() throws URISyntaxException { public void shouldDeletePermissions() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_OWNER); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_OWNER);
Permission deletedPermission = TEST_PERMISSIONS.get(0); RepositoryPermission deletedPermission = TEST_PERMISSIONS.get(0);
ImmutableList<Permission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS.subList(1, TEST_PERMISSIONS.size())); ImmutableList<RepositoryPermission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS.subList(1, TEST_PERMISSIONS.size()));
assertExpectedRequest(requestDELETEPermission assertExpectedRequest(requestDELETEPermission
.path(PATH_OF_ALL_PERMISSIONS + deletedPermission.getName()) .path(PATH_OF_ALL_PERMISSIONS + deletedPermission.getName())
.expectedResponseStatus(204) .expectedResponseStatus(204)
@@ -320,8 +320,8 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
@Test @Test
public void deletingNotExistingPermissionShouldProcess() throws URISyntaxException { public void deletingNotExistingPermissionShouldProcess() throws URISyntaxException {
createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_OWNER); createUserWithRepositoryAndPermissions(TEST_PERMISSIONS, PERMISSION_OWNER);
Permission deletedPermission = TEST_PERMISSIONS.get(0); RepositoryPermission deletedPermission = TEST_PERMISSIONS.get(0);
ImmutableList<Permission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS.subList(1, TEST_PERMISSIONS.size())); ImmutableList<RepositoryPermission> expectedPermissions = ImmutableList.copyOf(TEST_PERMISSIONS.subList(1, TEST_PERMISSIONS.size()));
assertExpectedRequest(requestDELETEPermission assertExpectedRequest(requestDELETEPermission
.path(PATH_OF_ALL_PERMISSIONS + deletedPermission.getName()) .path(PATH_OF_ALL_PERMISSIONS + deletedPermission.getName())
.expectedResponseStatus(204) .expectedResponseStatus(204)
@@ -340,7 +340,7 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
assertGettingExpectedPermissions(expectedPermissions, PERMISSION_READ); assertGettingExpectedPermissions(expectedPermissions, PERMISSION_READ);
} }
private void assertGettingExpectedPermissions(ImmutableList<Permission> expectedPermissions, String userPermission) throws URISyntaxException { private void assertGettingExpectedPermissions(ImmutableList<RepositoryPermission> expectedPermissions, String userPermission) throws URISyntaxException {
assertExpectedRequest(requestGETAllPermissions assertExpectedRequest(requestGETAllPermissions
.expectedResponseStatus(200) .expectedResponseStatus(200)
.responseValidator((response) -> { .responseValidator((response) -> {
@@ -349,16 +349,16 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
try { try {
HalRepresentation halRepresentation = mapper.readValue(body, HalRepresentation.class); HalRepresentation halRepresentation = mapper.readValue(body, HalRepresentation.class);
List<HalRepresentation> actualPermissionDtos = halRepresentation.getEmbedded().getItemsBy("permissions", HalRepresentation.class); List<HalRepresentation> actualPermissionDtos = halRepresentation.getEmbedded().getItemsBy("permissions", HalRepresentation.class);
List<PermissionDto> permissionDtoStream = actualPermissionDtos.stream() List<RepositoryPermissionDto> repositoryPermissionDtoStream = actualPermissionDtos.stream()
.map(hal -> { .map(hal -> {
PermissionDto result = new PermissionDto(); RepositoryPermissionDto result = new RepositoryPermissionDto();
result.setName(hal.getAttribute("name").asText()); result.setName(hal.getAttribute("name").asText());
result.setType(hal.getAttribute("type").asText()); result.setType(hal.getAttribute("type").asText());
result.setGroupPermission(hal.getAttribute("groupPermission").asBoolean()); result.setGroupPermission(hal.getAttribute("groupPermission").asBoolean());
result.add(hal.getLinks()); result.add(hal.getLinks());
return result; return result;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
assertThat(permissionDtoStream) assertThat(repositoryPermissionDtoStream)
.as("response payload match permission object models") .as("response payload match permission object models")
.hasSize(expectedPermissions.size()) .hasSize(expectedPermissions.size())
.usingRecursiveFieldByFieldElementComparator() .usingRecursiveFieldByFieldElementComparator()
@@ -371,15 +371,15 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
); );
} }
private PermissionDto[] getExpectedPermissionDtos(ArrayList<Permission> permissions, String userPermission) { private RepositoryPermissionDto[] getExpectedPermissionDtos(ArrayList<RepositoryPermission> permissions, String userPermission) {
return permissions return permissions
.stream() .stream()
.map(p -> getExpectedPermissionDto(p, userPermission)) .map(p -> getExpectedPermissionDto(p, userPermission))
.toArray(PermissionDto[]::new); .toArray(RepositoryPermissionDto[]::new);
} }
private PermissionDto getExpectedPermissionDto(Permission permission, String userPermission) { private RepositoryPermissionDto getExpectedPermissionDto(RepositoryPermission permission, String userPermission) {
PermissionDto result = new PermissionDto(); RepositoryPermissionDto result = new RepositoryPermissionDto();
result.setName(permission.getName()); result.setName(permission.getName());
result.setGroupPermission(permission.isGroupPermission()); result.setGroupPermission(permission.isGroupPermission());
result.setType(permission.getType().name()); result.setType(permission.getType().name());
@@ -411,7 +411,7 @@ public class PermissionRootResourceTest extends RepositoryTestBase {
return mockRepository; return mockRepository;
} }
private void createUserWithRepositoryAndPermissions(ArrayList<Permission> permissions, String userPermission) { private void createUserWithRepositoryAndPermissions(ArrayList<RepositoryPermission> permissions, String userPermission) {
createUserWithRepository(userPermission).setPermissions(permissions); createUserWithRepository(userPermission).setPermissions(permissions);
} }

View File

@@ -7,7 +7,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
@@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@SubjectAware( @SubjectAware(
configuration = "classpath:sonia/scm/repository/shiro.ini" configuration = "classpath:sonia/scm/repository/shiro.ini"
) )
public class PermissionToPermissionDtoMapperTest { public class RepositoryPermissionToRepositoryRepositoryPermissionDtoMapperTest {
@Rule @Rule
public ShiroRule shiro = new ShiroRule(); public ShiroRule shiro = new ShiroRule();
@@ -30,31 +30,31 @@ public class PermissionToPermissionDtoMapperTest {
private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri); private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(baseUri);
@InjectMocks @InjectMocks
PermissionToPermissionDtoMapperImpl mapper; RepositoryPermissionToRepositoryPermissionDtoMapperImpl mapper;
@Test @Test
@SubjectAware(username = "trillian", password = "secret") @SubjectAware(username = "trillian", password = "secret")
public void shouldMapGroupPermissionCorrectly() { public void shouldMapGroupPermissionCorrectly() {
Repository repository = getDummyRepository(); Repository repository = getDummyRepository();
Permission permission = new Permission("42", PermissionType.OWNER, true); RepositoryPermission permission = new RepositoryPermission("42", PermissionType.OWNER, true);
PermissionDto permissionDto = mapper.map(permission, repository); RepositoryPermissionDto repositoryPermissionDto = mapper.map(permission, repository);
assertThat(permissionDto.getLinks().getLinkBy("self").isPresent()).isTrue(); assertThat(repositoryPermissionDto.getLinks().getLinkBy("self").isPresent()).isTrue();
assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).contains("@42"); assertThat(repositoryPermissionDto.getLinks().getLinkBy("self").get().getHref()).contains("@42");
} }
@Test @Test
@SubjectAware(username = "trillian", password = "secret") @SubjectAware(username = "trillian", password = "secret")
public void shouldMapNonGroupPermissionCorrectly() { public void shouldMapNonGroupPermissionCorrectly() {
Repository repository = getDummyRepository(); Repository repository = getDummyRepository();
Permission permission = new Permission("42", PermissionType.OWNER, false); RepositoryPermission permission = new RepositoryPermission("42", PermissionType.OWNER, false);
PermissionDto permissionDto = mapper.map(permission, repository); RepositoryPermissionDto repositoryPermissionDto = mapper.map(permission, repository);
assertThat(permissionDto.getLinks().getLinkBy("self").isPresent()).isTrue(); assertThat(repositoryPermissionDto.getLinks().getLinkBy("self").isPresent()).isTrue();
assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).contains("42"); assertThat(repositoryPermissionDto.getLinks().getLinkBy("self").get().getHref()).contains("42");
assertThat(permissionDto.getLinks().getLinkBy("self").get().getHref()).doesNotContain("@"); assertThat(repositoryPermissionDto.getLinks().getLinkBy("self").get().getHref()).doesNotContain("@");
} }
private Repository getDummyRepository() { private Repository getDummyRepository() {

View File

@@ -18,7 +18,7 @@ import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import sonia.scm.PageResult; import sonia.scm.PageResult;
import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.NamespaceAndName;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryIsNotArchivedException;
@@ -302,7 +302,7 @@ public class RepositoryRootResourceTest extends RepositoryTestBase {
@Test @Test
public void shouldNotOverwriteExistingPermissionsOnUpdate() throws Exception { public void shouldNotOverwriteExistingPermissionsOnUpdate() throws Exception {
Repository existingRepository = mockRepository("space", "repo"); Repository existingRepository = mockRepository("space", "repo");
existingRepository.setPermissions(singletonList(new Permission("user", PermissionType.READ))); existingRepository.setPermissions(singletonList(new RepositoryPermission("user", PermissionType.READ)));
URL url = Resources.getResource("sonia/scm/api/v2/repository-test-update.json"); URL url = Resources.getResource("sonia/scm/api/v2/repository-test-update.json");
byte[] repository = Resources.toByteArray(url); byte[] repository = Resources.toByteArray(url);

View File

@@ -10,7 +10,7 @@ import org.junit.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import sonia.scm.repository.HealthCheckFailure; import sonia.scm.repository.HealthCheckFailure;
import sonia.scm.repository.Permission; import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.api.Command; import sonia.scm.repository.api.Command;
@@ -238,7 +238,7 @@ public class RepositoryToRepositoryDtoMapperTest {
repository.setId("1"); repository.setId("1");
repository.setCreationDate(System.currentTimeMillis()); repository.setCreationDate(System.currentTimeMillis());
repository.setHealthCheckFailures(singletonList(new HealthCheckFailure("1", "summary", "url", "failure"))); repository.setHealthCheckFailures(singletonList(new HealthCheckFailure("1", "summary", "url", "failure")));
repository.setPermissions(singletonList(new Permission("permission", PermissionType.READ))); repository.setPermissions(singletonList(new RepositoryPermission("permission", PermissionType.READ)));
return repository; return repository;
} }

View File

@@ -184,7 +184,7 @@ private long calculateAverage(List<Long> times) {
private Repository createTestRepository(int number) { private Repository createTestRepository(int number) {
Repository repository = new Repository(keyGenerator.createKey(), REPOSITORY_TYPE, "namespace", "repo-" + number); Repository repository = new Repository(keyGenerator.createKey(), REPOSITORY_TYPE, "namespace", "repo-" + number);
repository.addPermission(new Permission("trillian", PermissionType.READ)); repository.addPermission(new RepositoryPermission("trillian", PermissionType.READ));
return repository; return repository;
} }

View File

@@ -43,6 +43,7 @@ import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryEvent; import sonia.scm.repository.RepositoryEvent;
import sonia.scm.repository.RepositoryModificationEvent; import sonia.scm.repository.RepositoryModificationEvent;
import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.RepositoryTestData; import sonia.scm.repository.RepositoryTestData;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserEvent; import sonia.scm.user.UserEvent;
@@ -173,10 +174,10 @@ public class AuthorizationChangedEventProducerTest {
{ {
Repository repositoryModified = RepositoryTestData.createHeartOfGold(); Repository repositoryModified = RepositoryTestData.createHeartOfGold();
repositoryModified.setName("test123"); repositoryModified.setName("test123");
repositoryModified.setPermissions(Lists.newArrayList(new sonia.scm.repository.Permission("test"))); repositoryModified.setPermissions(Lists.newArrayList(new RepositoryPermission("test")));
Repository repository = RepositoryTestData.createHeartOfGold(); Repository repository = RepositoryTestData.createHeartOfGold();
repository.setPermissions(Lists.newArrayList(new sonia.scm.repository.Permission("test"))); repository.setPermissions(Lists.newArrayList(new RepositoryPermission("test")));
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.BEFORE_CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.BEFORE_CREATE, repositoryModified, repository));
assertEventIsNotFired(); assertEventIsNotFired();
@@ -184,18 +185,18 @@ public class AuthorizationChangedEventProducerTest {
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository));
assertEventIsNotFired(); assertEventIsNotFired();
repositoryModified.setPermissions(Lists.newArrayList(new sonia.scm.repository.Permission("test"))); repositoryModified.setPermissions(Lists.newArrayList(new RepositoryPermission("test")));
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository));
assertEventIsNotFired(); assertEventIsNotFired();
repositoryModified.setPermissions(Lists.newArrayList(new sonia.scm.repository.Permission("test123"))); repositoryModified.setPermissions(Lists.newArrayList(new RepositoryPermission("test123")));
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository));
assertGlobalEventIsFired(); assertGlobalEventIsFired();
resetStoredEvent(); resetStoredEvent();
repositoryModified.setPermissions( repositoryModified.setPermissions(
Lists.newArrayList(new sonia.scm.repository.Permission("test", PermissionType.READ, true)) Lists.newArrayList(new RepositoryPermission("test", PermissionType.READ, true))
); );
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository));
assertGlobalEventIsFired(); assertGlobalEventIsFired();
@@ -203,7 +204,7 @@ public class AuthorizationChangedEventProducerTest {
resetStoredEvent(); resetStoredEvent();
repositoryModified.setPermissions( repositoryModified.setPermissions(
Lists.newArrayList(new sonia.scm.repository.Permission("test", PermissionType.WRITE)) Lists.newArrayList(new RepositoryPermission("test", PermissionType.WRITE))
); );
producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository)); producer.onEvent(new RepositoryModificationEvent(HandlerEventType.CREATE, repositoryModified, repository));
assertGlobalEventIsFired(); assertGlobalEventIsFired();

View File

@@ -52,6 +52,7 @@ import sonia.scm.group.GroupNames;
import sonia.scm.repository.PermissionType; import sonia.scm.repository.PermissionType;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryDAO; import sonia.scm.repository.RepositoryDAO;
import sonia.scm.repository.RepositoryPermission;
import sonia.scm.repository.RepositoryTestData; import sonia.scm.repository.RepositoryTestData;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserTestData; import sonia.scm.user.UserTestData;
@@ -192,10 +193,10 @@ public class DefaultAuthorizationCollectorTest {
authenticate(UserTestData.createTrillian(), group); authenticate(UserTestData.createTrillian(), group);
Repository heartOfGold = RepositoryTestData.createHeartOfGold(); Repository heartOfGold = RepositoryTestData.createHeartOfGold();
heartOfGold.setId("one"); heartOfGold.setId("one");
heartOfGold.setPermissions(Lists.newArrayList(new sonia.scm.repository.Permission("trillian"))); heartOfGold.setPermissions(Lists.newArrayList(new RepositoryPermission("trillian")));
Repository puzzle42 = RepositoryTestData.create42Puzzle(); Repository puzzle42 = RepositoryTestData.create42Puzzle();
puzzle42.setId("two"); puzzle42.setId("two");
sonia.scm.repository.Permission permission = new sonia.scm.repository.Permission(group, PermissionType.WRITE, true); RepositoryPermission permission = new RepositoryPermission(group, PermissionType.WRITE, true);
puzzle42.setPermissions(Lists.newArrayList(permission)); puzzle42.setPermissions(Lists.newArrayList(permission));
when(repositoryDAO.getAll()).thenReturn(Lists.newArrayList(heartOfGold, puzzle42)); when(repositoryDAO.getAll()).thenReturn(Lists.newArrayList(heartOfGold, puzzle42));