Skip to content

Commit 21947d3

Browse files
oleg-odysseuschrisknoll
authored andcommittedMar 15, 2025·
[issue-2953] Fixed access to resources for non-admin Tag Managers (having a 'tag:management' permission)
1 parent d23b434 commit 21947d3

9 files changed

+33
-23
lines changed
 

‎src/main/java/org/ohdsi/webapi/cohortcharacterization/CcServiceImpl.java

-2
Original file line numberDiff line numberDiff line change
@@ -322,15 +322,13 @@ public void onFeAnalysisChanged(FeAnalysisChangedEvent event) {
322322
@Transactional
323323
public void assignTag(Long id, int tagId) {
324324
CohortCharacterizationEntity entity = findById(id);
325-
checkOwnerOrAdminOrGranted(entity);
326325
assignTag(entity, tagId);
327326
}
328327

329328
@Override
330329
@Transactional
331330
public void unassignTag(Long id, int tagId) {
332331
CohortCharacterizationEntity entity = findById(id);
333-
checkOwnerOrAdminOrGranted(entity);
334332
unassignTag(entity, tagId);
335333
}
336334

‎src/main/java/org/ohdsi/webapi/pathway/PathwayServiceImpl.java

+12-14
Original file line numberDiff line numberDiff line change
@@ -534,19 +534,17 @@ public String findDesignByGenerationId(@PathwayAnalysisGenerationId final Long i
534534
return entity.getDesign();
535535
}
536536

537-
@Override
538-
public void assignTag(Integer id, int tagId) {
539-
PathwayAnalysisEntity entity = getById(id);
540-
checkOwnerOrAdminOrGranted(entity);
541-
assignTag(entity, tagId);
542-
}
543-
544-
@Override
545-
public void unassignTag(Integer id, int tagId) {
546-
PathwayAnalysisEntity entity = getById(id);
547-
checkOwnerOrAdminOrGranted(entity);
548-
unassignTag(entity, tagId);
549-
}
537+
@Override
538+
public void assignTag(Integer id, int tagId) {
539+
PathwayAnalysisEntity entity = getById(id);
540+
assignTag(entity, tagId);
541+
}
542+
543+
@Override
544+
public void unassignTag(Integer id, int tagId) {
545+
PathwayAnalysisEntity entity = getById(id);
546+
unassignTag(entity, tagId);
547+
}
550548

551549
@Override
552550
public List<VersionDTO> getVersions(long id) {
@@ -657,7 +655,7 @@ private PathwayAnalysisResult queryGenerationResults(Source source, Long generat
657655
new String[]{GENERATION_ID},
658656
new Object[]{generationId}
659657
);
660-
Map<Integer, Map<String, Integer>> pathwayResults =
658+
Map<Integer, Map<String, Integer>> pathwayResults =
661659
getSourceJdbcTemplate(source).query(pathwayResultsPsr.getSql(), pathwayResultsPsr.getOrderedParams(), pathwayExtractor);
662660

663661
cohortStats.stream().forEach((cp) -> {

‎src/main/java/org/ohdsi/webapi/service/AbstractDaoService.java

+15
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ protected PermissionService getPermissionService() {
371371
}
372372

373373
protected void assignTag(CommonEntityExt<?> entity, int tagId) {
374+
checkOwnerOrAdminOrGrantedOrTagManager(entity);
374375
if (Objects.nonNull(entity)) {
375376
Tag tag = tagService.getById(tagId);
376377
if (Objects.nonNull(tag)) {
@@ -397,6 +398,7 @@ protected void assignTag(CommonEntityExt<?> entity, int tagId) {
397398
}
398399

399400
protected void unassignTag(CommonEntityExt<?> entity, int tagId) {
401+
checkOwnerOrAdminOrGrantedOrTagManager(entity);
400402
if (Objects.nonNull(entity)) {
401403
Tag tag = tagService.getById(tagId);
402404
if (Objects.nonNull(tag)) {
@@ -459,6 +461,19 @@ protected void checkOwnerOrAdminOrGranted(CommonEntity<?> entity) {
459461
}
460462
}
461463

464+
protected void checkOwnerOrAdminOrGrantedOrTagManager(CommonEntity<?> entity) {
465+
if (security instanceof DisabledSecurity) {
466+
return;
467+
}
468+
469+
UserEntity user = getCurrentUser();
470+
Long ownerId = Objects.nonNull(entity.getCreatedBy()) ? entity.getCreatedBy().getId() : null;
471+
472+
if (!(user.getId().equals(ownerId) || isAdmin() || permissionService.hasWriteAccess(entity) || TagSecurityUtils.canManageTags())) {
473+
throw new ForbiddenException();
474+
}
475+
}
476+
462477
protected <T extends CommonEntityDTO> List<T> listByTags(List<? extends CommonEntityExt<? extends Number>> entities,
463478
List<String> names,
464479
Class<T> clazz) {

‎src/main/java/org/ohdsi/webapi/service/CohortDefinitionService.java

-2
Original file line numberDiff line numberDiff line change
@@ -1265,7 +1265,6 @@ private Response printFrindly(String markdown, String format) {
12651265
@Transactional
12661266
public void assignTag(@PathParam("id") final Integer id, final int tagId) {
12671267
CohortDefinition entity = cohortDefinitionRepository.findOne(id);
1268-
checkOwnerOrAdminOrGranted(entity);
12691268
assignTag(entity, tagId);
12701269
}
12711270

@@ -1283,7 +1282,6 @@ public void assignTag(@PathParam("id") final Integer id, final int tagId) {
12831282
@Transactional
12841283
public void unassignTag(@PathParam("id") final Integer id, @PathParam("tagId") final int tagId) {
12851284
CohortDefinition entity = cohortDefinitionRepository.findOne(id);
1286-
checkOwnerOrAdminOrGranted(entity);
12871285
unassignTag(entity, tagId);
12881286
}
12891287

‎src/main/java/org/ohdsi/webapi/service/ConceptSetService.java

-2
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,6 @@ public void deleteConceptSet(@PathParam("id") final int id) {
674674
@CacheEvict(cacheNames = CachingSetup.CONCEPT_SET_LIST_CACHE, allEntries = true)
675675
public void assignTag(@PathParam("id") final Integer id, final int tagId) {
676676
ConceptSet entity = getConceptSetRepository().findById(id);
677-
checkOwnerOrAdminOrGranted(entity);
678677
assignTag(entity, tagId);
679678
}
680679

@@ -692,7 +691,6 @@ public void assignTag(@PathParam("id") final Integer id, final int tagId) {
692691
@Transactional
693692
public void unassignTag(@PathParam("id") final Integer id, @PathParam("tagId") final int tagId) {
694693
ConceptSet entity = getConceptSetRepository().findById(id);
695-
checkOwnerOrAdminOrGranted(entity);
696694
unassignTag(entity, tagId);
697695
}
698696

‎src/main/java/org/ohdsi/webapi/service/IRAnalysisService.java

-2
Original file line numberDiff line numberDiff line change
@@ -806,15 +806,13 @@ public void deleteInfo(final int id, final String sourceKey) {
806806
@Transactional
807807
public void assignTag(final Integer id, final int tagId) {
808808
IncidenceRateAnalysis entity = irAnalysisRepository.findOne(id);
809-
checkOwnerOrAdminOrGranted(entity);
810809
assignTag(entity, tagId);
811810
}
812811

813812
@Override
814813
@Transactional
815814
public void unassignTag(final Integer id, final int tagId) {
816815
IncidenceRateAnalysis entity = irAnalysisRepository.findOne(id);
817-
checkOwnerOrAdminOrGranted(entity);
818816
unassignTag(entity, tagId);
819817
}
820818

‎src/main/java/org/ohdsi/webapi/tag/TagGroupService.java

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ private <T extends Number> void assignGroup(HasTags<T> service, List<T> assetIds
7575
service.assignTag(id, tagId);
7676
} catch (final ForbiddenException e) {
7777
log.warn("Tag {} cannot be assigned to entity {} in service {} - forbidden", tagId, id, service.getClass().getName());
78+
throw e;
7879
}
7980
});
8081
}

‎src/main/java/org/ohdsi/webapi/tag/TagSecurityUtils.java

+4
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,8 @@ public static String getAssetName(final CommonEntityExt<?> entity) {
7474
}
7575
return null;
7676
}
77+
78+
public static boolean canManageTags() {
79+
return SecurityUtils.getSubject().isPermitted("tag:management");
80+
}
7781
}

‎src/main/java/org/ohdsi/webapi/tag/TagService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public Tag create(Tag tag) {
6565
.filter(Tag::isAllowCustom)
6666
.count() == groups.size();
6767

68-
if (this.getPermissionService().isSecurityEnabled() && !SecurityUtils.getSubject().isPermitted("tag:management") && !allowCustom) {
68+
if (this.getPermissionService().isSecurityEnabled() && !TagSecurityUtils.canManageTags() && !allowCustom) {
6969
throw new IllegalArgumentException("Tag can be added only to groups that allows to do it");
7070
}
7171

0 commit comments

Comments
 (0)
Please sign in to comment.