Skip to content

Commit 15050fb

Browse files
committed
add support for sample filter in hasPermission
1 parent 8bf8fd7 commit 15050fb

File tree

4 files changed

+75
-13
lines changed

4 files changed

+75
-13
lines changed

src/main/java/org/cbioportal/application/rest/vcolumnstore/ColumnStoreSampleController.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,11 @@
3838
import org.springframework.web.bind.annotation.GetMapping;
3939
import org.springframework.web.bind.annotation.PathVariable;
4040
import org.springframework.web.bind.annotation.PostMapping;
41-
import org.springframework.web.bind.annotation.RequestAttribute;
4241
import org.springframework.web.bind.annotation.RequestBody;
4342
import org.springframework.web.bind.annotation.RequestMapping;
4443
import org.springframework.web.bind.annotation.RequestParam;
4544
import org.springframework.web.bind.annotation.RestController;
4645

47-
import java.util.Collection;
4846
import java.util.List;
4947

5048
@RestController
@@ -146,7 +144,7 @@ public ResponseEntity<List<SampleDTO>> getSamplesByKeyword(
146144
}
147145
}
148146

149-
@PreAuthorize("hasPermission(#involvedCancerStudies, 'Collection<CancerStudyId>', T(org.cbioportal.legacy.utils.security.AccessLevel).READ)")
147+
@PreAuthorize("hasPermission(#sampleFilter, 'SampleFilter', T(org.cbioportal.legacy.utils.security.AccessLevel).READ)")
150148
@PostMapping(
151149
value = "/samples/fetch",
152150
consumes = MediaType.APPLICATION_JSON_VALUE,
@@ -159,13 +157,6 @@ public ResponseEntity<List<SampleDTO>> getSamplesByKeyword(
159157
content = @Content(array = @ArraySchema(schema = @Schema(implementation = Sample.class)))
160158
)
161159
public ResponseEntity<List<SampleDTO>> fetchSamples(
162-
@Parameter(hidden = true) // prevent reference to this attribute in the swagger-ui interface
163-
@RequestAttribute(required = false, value = "involvedCancerStudies")
164-
Collection<String> involvedCancerStudies,
165-
@Parameter(hidden = true) // prevent reference to this attribute in the swagger-ui interface. this attribute is needed for the @PreAuthorize tag above.
166-
@Valid
167-
@RequestAttribute(required = false, value = "interceptedSampleFilter")
168-
SampleFilter interceptedSampleFilter,
169160
@Parameter(required = true, description = "List of sample identifiers")
170161
@Valid
171162
@RequestBody(required = false)
@@ -175,11 +166,11 @@ public ResponseEntity<List<SampleDTO>> fetchSamples(
175166
ProjectionType projection
176167
) {
177168
if (projection == ProjectionType.META) {
178-
HttpHeaders responseHeaders = fetchMetaSamplesHeaders(interceptedSampleFilter);
169+
HttpHeaders responseHeaders = fetchMetaSamplesHeaders(sampleFilter);
179170
return new ResponseEntity<>(responseHeaders, HttpStatus.OK);
180171
}
181172
else {
182-
List<Sample> samples = sampleUseCases.fetchSamplesUseCase().execute(interceptedSampleFilter, projection);
173+
List<Sample> samples = sampleUseCases.fetchSamplesUseCase().execute(sampleFilter, projection);
183174
return new ResponseEntity<>(SampleMapper.INSTANCE.toDtos(samples), HttpStatus.OK);
184175
}
185176
}

src/main/java/org/cbioportal/application/security/CancerStudyPermissionEvaluator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.*;
3737
import java.util.stream.Collectors;
3838

39+
import org.cbioportal.application.security.util.CancerStudyExtractorUtil;
3940
import org.cbioportal.legacy.model.CancerStudy;
4041
import org.cbioportal.legacy.model.MolecularProfile;
4142
import org.cbioportal.legacy.model.Patient;
@@ -46,6 +47,7 @@
4647
import org.cbioportal.legacy.web.parameter.DataBinCountFilter;
4748
import org.cbioportal.legacy.web.parameter.GenericAssayDataCountFilter;
4849
import org.cbioportal.legacy.web.parameter.GenomicDataCountFilter;
50+
import org.cbioportal.legacy.web.parameter.SampleFilter;
4951
import org.cbioportal.legacy.web.parameter.StudyViewFilter;
5052
import org.slf4j.Logger;
5153
import org.slf4j.LoggerFactory;
@@ -192,6 +194,13 @@ public boolean hasPermission(Authentication authentication, Serializable targetI
192194
return hasAccessToSampleLists(authentication, (Collection<String>) targetId, permission);
193195
} else if (targetType.contains("Filter")) {
194196
switch (targetId) {
197+
case SampleFilter sampleFilter -> {
198+
return hasAccessToCancerStudies(
199+
authentication,
200+
CancerStudyExtractorUtil.extractCancerStudyIdsFromSampleFilter(sampleFilter, this.cacheMapUtil),
201+
permission
202+
);
203+
}
195204
case StudyViewFilter studyViewFilter -> {
196205
return hasAccessToCancerStudies(authentication, studyViewFilter.getUniqueStudyIds(), permission);
197206
}
@@ -216,7 +225,6 @@ public boolean hasPermission(Authentication authentication, Serializable targetI
216225
}
217226
return hasAccessToCancerStudies(authentication, studyIds, permission);
218227
}
219-
220228
case GenericAssayDataCountFilter genericAssayDataCountFilter -> {
221229
Set<String> studyIds = new HashSet<>();
222230
if (genericAssayDataCountFilter.getStudyViewFilter() != null) {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.cbioportal.application.security.util;
2+
3+
import org.cbioportal.legacy.persistence.cachemaputil.CacheMapUtil;
4+
import org.cbioportal.legacy.web.parameter.SampleFilter;
5+
import org.cbioportal.legacy.web.parameter.SampleIdentifier;
6+
import org.cbioportal.legacy.web.util.UniqueKeyExtractor;
7+
8+
import java.util.Collection;
9+
import java.util.List;
10+
11+
public class CancerStudyExtractorUtil {
12+
13+
private CancerStudyExtractorUtil() {}
14+
15+
public static Collection<String> extractCancerStudyIdsFromSampleFilter(
16+
SampleFilter sampleFilter,
17+
CacheMapUtil cacheMapUtil
18+
) {
19+
Collection<String> studyIds;
20+
21+
if (sampleFilter.getSampleListIds() != null) {
22+
studyIds = extractCancerStudyIdsFromSampleListIds(
23+
sampleFilter.getSampleListIds(),
24+
cacheMapUtil
25+
);
26+
} else if (sampleFilter.getSampleIdentifiers() != null) {
27+
studyIds = extractCancerStudyIdsFromSampleIdentifiers(sampleFilter.getSampleIdentifiers());
28+
} else {
29+
studyIds = UniqueKeyExtractor.extractUniqueKeys(sampleFilter.getUniqueSampleKeys());
30+
}
31+
32+
return studyIds;
33+
}
34+
35+
public static Collection<String> extractCancerStudyIdsFromSampleListIds(
36+
List<String> sampleListIds,
37+
CacheMapUtil cacheMapUtil
38+
) {
39+
return sampleListIds
40+
.stream()
41+
.map(sampleListId -> cacheMapUtil.getSampleListMap().get(sampleListId).getCancerStudyIdentifier())
42+
.distinct()
43+
.toList();
44+
}
45+
46+
public static Collection<String> extractCancerStudyIdsFromSampleIdentifiers(
47+
Collection<SampleIdentifier> sampleIdentifiers
48+
) {
49+
return sampleIdentifiers
50+
.stream()
51+
.map(SampleIdentifier::getStudyId)
52+
.distinct()
53+
.toList();
54+
}
55+
}

src/main/java/org/cbioportal/legacy/web/util/UniqueKeyExtractor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
package org.cbioportal.legacy.web.util;
22

33
import org.cbioportal.legacy.utils.Encoder;
4+
5+
import java.util.ArrayList;
46
import java.util.List;
57
import java.util.Collection;
68

79
public class UniqueKeyExtractor {
810

911
private UniqueKeyExtractor() {}
12+
13+
public static Collection<String> extractUniqueKeys(List<String> uniqueKeys) {
14+
Collection<String> studyIds = new ArrayList<>();
15+
extractUniqueKeys(uniqueKeys, studyIds, null);
16+
return studyIds;
17+
}
1018

1119
public static void extractUniqueKeys(List<String> uniqueKeys, Collection<String> studyIdsToReturn) {
1220
extractUniqueKeys(uniqueKeys, studyIdsToReturn, null);

0 commit comments

Comments
 (0)