Skip to content

Commit d7dc766

Browse files
committed
fix: ensure project exists and is accessible when creating resource #4005
1 parent 1aa8ee7 commit d7dc766

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

opal-core-ws/src/main/java/org/obiba/opal/web/project/resource/ProjectResourceReferenceResource.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.obiba.magma.security.Authorizer;
1515
import org.obiba.magma.security.shiro.ShiroAuthorizer;
1616
import org.obiba.opal.core.domain.ResourceReference;
17+
import org.obiba.opal.core.service.NoSuchProjectException;
18+
import org.obiba.opal.core.service.ProjectService;
1719
import org.obiba.opal.core.service.ResourceReferenceService;
1820
import org.obiba.opal.r.service.RServerManagerService;
1921
import org.obiba.opal.spi.r.RServerException;
@@ -37,14 +39,18 @@ public class ProjectResourceReferenceResource implements BaseResource {
3739

3840
private final RServerManagerService rServerManagerService;
3941

42+
private final ProjectService projectService;
43+
4044
@Autowired
41-
public ProjectResourceReferenceResource(ResourceReferenceService resourceReferenceService, RServerManagerService rServerManagerService) {
45+
public ProjectResourceReferenceResource(ResourceReferenceService resourceReferenceService, RServerManagerService rServerManagerService, ProjectService projectService) {
4246
this.resourceReferenceService = resourceReferenceService;
4347
this.rServerManagerService = rServerManagerService;
48+
this.projectService = projectService;
4449
}
4550

4651
@GET
4752
public Projects.ResourceReferenceDto get(@PathParam("project") String project, @PathParam("name") String name) {
53+
checkProject(project);
4854
ResourceReference reference = resourceReferenceService.getResourceReference(project, name);
4955
return Dtos.asDto(reference, resourceReferenceService.createResource(reference), isEditable(project, name));
5056
}
@@ -54,6 +60,7 @@ public Response update(@PathParam("project") String project, @PathParam("name")
5460
// check same project
5561
if (!project.equals(referenceDto.getProject()))
5662
throw new IllegalArgumentException("Expecting a resource of project: " + project);
63+
checkProject(project);
5764
// check it is not a creation
5865
ResourceReference originalReference = resourceReferenceService.getResourceReference(project, name);
5966
ResourceReference updatedReference = Dtos.fromDto(referenceDto);
@@ -70,6 +77,7 @@ public Response update(@PathParam("project") String project, @PathParam("name")
7077
@PUT
7178
@Path("_test")
7279
public Response test(@PathParam("project") String project, @PathParam("name") String name) throws RServerException {
80+
checkProject(project);
7381
ResourceAssignROperation rop = resourceReferenceService.asAssignOperation(project, name, "rsrc");
7482
// test in the R server where the resource provider is defined
7583
rServerManagerService.getRServerWithPackages(rop.getRequiredPackages()).execute(rop);
@@ -78,6 +86,7 @@ public Response test(@PathParam("project") String project, @PathParam("name") St
7886

7987
@DELETE
8088
public Response delete(@PathParam("project") String project, @PathParam("name") String name) {
89+
checkProject(project);
8190
resourceReferenceService.delete(project, name);
8291
return Response.noContent().build();
8392
}
@@ -86,4 +95,16 @@ private boolean isEditable(String project, String name) {
8695
return authorizer.isPermitted("rest:/project/" + project + "/resource/" + name + ":PUT");
8796
}
8897

98+
private boolean isReadable(String project) {
99+
return authorizer.isPermitted("rest:/project/" + project + ":GET");
100+
}
101+
102+
/**
103+
* Ensure project exists and is readable.
104+
*
105+
* @param name
106+
*/
107+
private void checkProject(String name) {
108+
if (!projectService.hasProject(name) || !isReadable(name)) throw new NoSuchProjectException(name);
109+
}
89110
}

opal-core-ws/src/main/java/org/obiba/opal/web/project/resource/ProjectResourceReferencesResource.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.obiba.magma.security.Authorizer;
1515
import org.obiba.magma.security.shiro.ShiroAuthorizer;
1616
import org.obiba.opal.core.domain.ResourceReference;
17+
import org.obiba.opal.core.service.NoSuchProjectException;
18+
import org.obiba.opal.core.service.ProjectService;
1719
import org.obiba.opal.core.service.ResourceReferenceService;
1820
import org.obiba.opal.web.BaseResource;
1921
import org.obiba.opal.web.model.Projects;
@@ -29,7 +31,6 @@
2931
import java.util.Comparator;
3032
import java.util.List;
3133
import java.util.stream.Collectors;
32-
import java.util.stream.StreamSupport;
3334

3435
@Component
3536
@Path("/project/{name}/resources")
@@ -39,13 +40,17 @@ public class ProjectResourceReferencesResource implements BaseResource {
3940

4041
private final ResourceReferenceService resourceReferenceService;
4142

43+
private final ProjectService projectService;
44+
4245
@Autowired
43-
public ProjectResourceReferencesResource(ResourceReferenceService resourceReferenceService) {
46+
public ProjectResourceReferencesResource(ResourceReferenceService resourceReferenceService, ProjectService projectService) {
4447
this.resourceReferenceService = resourceReferenceService;
48+
this.projectService = projectService;
4549
}
4650

4751
@GET
4852
public List<Projects.ResourceReferenceDto> list(@PathParam("name") String name, @QueryParam("safe") @DefaultValue("true") Boolean safe) {
53+
checkProject(name);
4954
return resourceReferenceService.getResourceReferences(name).stream()
5055
.sorted(Comparator.comparing(ResourceReference::getName))
5156
.map(ref -> Dtos.asDto(ref, resourceReferenceService.createResource(ref), !safe && isEditable(name, ref.getName())))
@@ -56,6 +61,7 @@ public List<Projects.ResourceReferenceDto> list(@PathParam("name") String name,
5661
public Response createResourceReference(@Context UriInfo uriInfo, @PathParam("name") String name, Projects.ResourceReferenceDto referenceDto) {
5762
if (!name.equals(referenceDto.getProject()))
5863
throw new IllegalArgumentException("Expected project name: " + name);
64+
checkProject(referenceDto.getProject());
5965

6066
ResourceReference reference = Dtos.fromDto(referenceDto);
6167
resourceReferenceService.save(reference);
@@ -65,6 +71,7 @@ public Response createResourceReference(@Context UriInfo uriInfo, @PathParam("na
6571

6672
@DELETE
6773
public Response deleteAll(@PathParam("name") String name, @QueryParam("names") List<String> names) {
74+
checkProject(name);
6875
if (names != null && !names.isEmpty())
6976
names.forEach(n -> resourceReferenceService.delete(name, n));
7077
else
@@ -75,4 +82,17 @@ public Response deleteAll(@PathParam("name") String name, @QueryParam("names") L
7582
private boolean isEditable(String project, String name) {
7683
return authorizer.isPermitted("rest:/project/" + project + "/resource/" + name + ":PUT");
7784
}
85+
86+
private boolean isReadable(String project) {
87+
return authorizer.isPermitted("rest:/project/" + project + ":GET");
88+
}
89+
90+
/**
91+
* Ensure project exists and is readable.
92+
*
93+
* @param name
94+
*/
95+
private void checkProject(String name) {
96+
if (!projectService.hasProject(name) || !isReadable(name)) throw new NoSuchProjectException(name);
97+
}
7898
}

0 commit comments

Comments
 (0)