From b58bb1917d608c9f6cca91ce3bc8fb22ff76ef20 Mon Sep 17 00:00:00 2001 From: "Gantner, Florian Klaus" Date: Fri, 20 Oct 2023 17:38:49 +0200 Subject: [PATCH 1/2] configurable option to wxclude non-public metadata based on their metadata security level/visibility before calculating the metadata signature for orcid profile objects --- .../factory/impl/OrcidAffiliationFactory.java | 24 ++++++++++++++++++- .../impl/OrcidSimpleValueObjectFactory.java | 17 +++++++++++++ dspace/config/spring/api/orcid-services.xml | 8 +++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java index 89a1ca3d83e4..26623a7ce820 100644 --- a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java +++ b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java @@ -50,6 +50,8 @@ public class OrcidAffiliationFactory extends AbstractOrcidProfileSectionFactory private String endDateField; + private boolean isAllowedMetadataVisibility = false; + public OrcidAffiliationFactory(OrcidProfileSectionType sectionType, OrcidProfileSyncPreference preference) { super(sectionType, preference); } @@ -93,7 +95,13 @@ public List getMetadataSignatures(Context context, Item item) { int groupSize = metadataGroups.getOrDefault(organizationField, Collections.emptyList()).size(); for (int currentGroupIndex = 0; currentGroupIndex < groupSize; currentGroupIndex++) { List metadataValues = getMetadataValueByPlace(metadataGroups, currentGroupIndex); - signatures.add(metadataSignatureGenerator.generate(context, metadataValues)); + //only "visible" metadatavalues within this group + metadataValues = metadataValues.stream() + .filter(metadataValue -> getAllowedMetadataVisibility(metadataValue)) + .collect(Collectors.toList()); + if (!metadataValues.isEmpty()) { + signatures.add(metadataSignatureGenerator.generate(context, metadataValues)); + } } return signatures; @@ -152,6 +160,13 @@ private boolean isUnprocessableValue(MetadataValue value) { return value == null || isBlank(value.getValue()) || value.getValue().equals(PLACEHOLDER_PARENT_METADATA_VALUE); } + private boolean getAllowedMetadataVisibility(MetadataValue metadataValue) { + if (isAllowedMetadataVisibility()) { + return metadataValue.getSecurityLevel() == null || metadataValue.getSecurityLevel() == 0; + } + return true; + } + private Map> getMetadataGroups(Item item) { Map> metadataGroups = new HashMap<>(); metadataGroups.put(organizationField, itemService.getMetadataByMetadataString(item, organizationField)); @@ -204,4 +219,11 @@ public void setEndDateField(String endDateField) { this.endDateField = endDateField; } + public boolean isAllowedMetadataVisibility() { + return isAllowedMetadataVisibility; + } + + public void setAllowedMetadataVisibility(boolean allowedMetadataVisibility) { + isAllowedMetadataVisibility = allowedMetadataVisibility; + } } diff --git a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java index 4ddfbe47a328..1f55c2d62e99 100644 --- a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java +++ b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java @@ -42,6 +42,8 @@ public class OrcidSimpleValueObjectFactory extends AbstractOrcidProfileSectionFa private List metadataFields = new ArrayList(); + private boolean isAllowedMetadataVisibility = false; + public OrcidSimpleValueObjectFactory(OrcidProfileSectionType sectionType, OrcidProfileSyncPreference preference) { super(sectionType, preference); } @@ -76,6 +78,7 @@ public Object create(Context context, List metadataValues) { public List getMetadataSignatures(Context context, Item item) { return metadataFields.stream() .flatMap(metadataField -> getMetadataValues(item, metadataField).stream()) + .filter(metadataValue -> getAllowedMetadataVisibility(metadataValue)) .map(metadataValue -> metadataSignatureGenerator.generate(context, List.of(metadataValue))) .collect(Collectors.toList()); } @@ -137,6 +140,13 @@ private Address createAddress(Country country) { return address; } + private boolean getAllowedMetadataVisibility(MetadataValue metadataValue) { + if (isAllowedMetadataVisibility()) { + return metadataValue.getSecurityLevel() == null || metadataValue.getSecurityLevel() == 0; + } + return true; + } + public void setMetadataFields(String metadataFields) { this.metadataFields = metadataFields != null ? asList(metadataFields.split(",")) : emptyList(); } @@ -146,4 +156,11 @@ public List getMetadataFields() { return metadataFields; } + public boolean isAllowedMetadataVisibility() { + return isAllowedMetadataVisibility; + } + + public void setAllowedMetadataVisibility(boolean allowedMetadataVisibility) { + isAllowedMetadataVisibility = allowedMetadataVisibility; + } } diff --git a/dspace/config/spring/api/orcid-services.xml b/dspace/config/spring/api/orcid-services.xml index eb4e20a459c2..d9c9c6d5f249 100644 --- a/dspace/config/spring/api/orcid-services.xml +++ b/dspace/config/spring/api/orcid-services.xml @@ -112,6 +112,7 @@ + @@ -121,6 +122,7 @@ + @@ -130,36 +132,42 @@ + + + + + + From 5fd4e5f105017b0d16a67851936abc5a83396f1d Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 16 Nov 2023 19:15:29 +0100 Subject: [PATCH 2/2] [DSC-1369] Improve security level check by add a new maxAllowedMetadataVisibility property --- .../AbstractOrcidProfileSectionFactory.java | 15 +++++++++++++++ .../factory/impl/OrcidAffiliationFactory.java | 18 +----------------- .../impl/OrcidSimpleValueObjectFactory.java | 18 +----------------- dspace/config/spring/api/orcid-services.xml | 8 -------- 4 files changed, 17 insertions(+), 42 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/AbstractOrcidProfileSectionFactory.java b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/AbstractOrcidProfileSectionFactory.java index 2c272e620cca..98f63193a964 100644 --- a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/AbstractOrcidProfileSectionFactory.java +++ b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/AbstractOrcidProfileSectionFactory.java @@ -34,6 +34,8 @@ public abstract class AbstractOrcidProfileSectionFactory implements OrcidProfile protected final OrcidProfileSyncPreference preference; + protected Integer maxAllowedMetadataVisibility = 0; + @Autowired protected ItemService itemService; @@ -70,4 +72,17 @@ protected List getMetadataValues(Item item, String metadataField) return itemService.getMetadataByMetadataString(item, metadataField); } + protected boolean isAllowedMetadataByVisibility(MetadataValue metadataValue) { + return metadataValue.getSecurityLevel() == null + || metadataValue.getSecurityLevel() <= getMaxAllowedMetadataVisibility(); + } + + public Integer getMaxAllowedMetadataVisibility() { + return maxAllowedMetadataVisibility; + } + + public void setMaxAllowedMetadataVisibility(Integer maxAllowedMetadataVisibility) { + this.maxAllowedMetadataVisibility = maxAllowedMetadataVisibility; + } + } diff --git a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java index 26623a7ce820..d74f05bcaf50 100644 --- a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java +++ b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidAffiliationFactory.java @@ -50,8 +50,6 @@ public class OrcidAffiliationFactory extends AbstractOrcidProfileSectionFactory private String endDateField; - private boolean isAllowedMetadataVisibility = false; - public OrcidAffiliationFactory(OrcidProfileSectionType sectionType, OrcidProfileSyncPreference preference) { super(sectionType, preference); } @@ -97,7 +95,7 @@ public List getMetadataSignatures(Context context, Item item) { List metadataValues = getMetadataValueByPlace(metadataGroups, currentGroupIndex); //only "visible" metadatavalues within this group metadataValues = metadataValues.stream() - .filter(metadataValue -> getAllowedMetadataVisibility(metadataValue)) + .filter(metadataValue -> isAllowedMetadataByVisibility(metadataValue)) .collect(Collectors.toList()); if (!metadataValues.isEmpty()) { signatures.add(metadataSignatureGenerator.generate(context, metadataValues)); @@ -160,13 +158,6 @@ private boolean isUnprocessableValue(MetadataValue value) { return value == null || isBlank(value.getValue()) || value.getValue().equals(PLACEHOLDER_PARENT_METADATA_VALUE); } - private boolean getAllowedMetadataVisibility(MetadataValue metadataValue) { - if (isAllowedMetadataVisibility()) { - return metadataValue.getSecurityLevel() == null || metadataValue.getSecurityLevel() == 0; - } - return true; - } - private Map> getMetadataGroups(Item item) { Map> metadataGroups = new HashMap<>(); metadataGroups.put(organizationField, itemService.getMetadataByMetadataString(item, organizationField)); @@ -219,11 +210,4 @@ public void setEndDateField(String endDateField) { this.endDateField = endDateField; } - public boolean isAllowedMetadataVisibility() { - return isAllowedMetadataVisibility; - } - - public void setAllowedMetadataVisibility(boolean allowedMetadataVisibility) { - isAllowedMetadataVisibility = allowedMetadataVisibility; - } } diff --git a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java index 1f55c2d62e99..28113e958332 100644 --- a/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java +++ b/dspace-api/src/main/java/org/dspace/orcid/model/factory/impl/OrcidSimpleValueObjectFactory.java @@ -42,8 +42,6 @@ public class OrcidSimpleValueObjectFactory extends AbstractOrcidProfileSectionFa private List metadataFields = new ArrayList(); - private boolean isAllowedMetadataVisibility = false; - public OrcidSimpleValueObjectFactory(OrcidProfileSectionType sectionType, OrcidProfileSyncPreference preference) { super(sectionType, preference); } @@ -78,7 +76,7 @@ public Object create(Context context, List metadataValues) { public List getMetadataSignatures(Context context, Item item) { return metadataFields.stream() .flatMap(metadataField -> getMetadataValues(item, metadataField).stream()) - .filter(metadataValue -> getAllowedMetadataVisibility(metadataValue)) + .filter(metadataValue -> isAllowedMetadataByVisibility(metadataValue)) .map(metadataValue -> metadataSignatureGenerator.generate(context, List.of(metadataValue))) .collect(Collectors.toList()); } @@ -140,13 +138,6 @@ private Address createAddress(Country country) { return address; } - private boolean getAllowedMetadataVisibility(MetadataValue metadataValue) { - if (isAllowedMetadataVisibility()) { - return metadataValue.getSecurityLevel() == null || metadataValue.getSecurityLevel() == 0; - } - return true; - } - public void setMetadataFields(String metadataFields) { this.metadataFields = metadataFields != null ? asList(metadataFields.split(",")) : emptyList(); } @@ -156,11 +147,4 @@ public List getMetadataFields() { return metadataFields; } - public boolean isAllowedMetadataVisibility() { - return isAllowedMetadataVisibility; - } - - public void setAllowedMetadataVisibility(boolean allowedMetadataVisibility) { - isAllowedMetadataVisibility = allowedMetadataVisibility; - } } diff --git a/dspace/config/spring/api/orcid-services.xml b/dspace/config/spring/api/orcid-services.xml index d9c9c6d5f249..eb4e20a459c2 100644 --- a/dspace/config/spring/api/orcid-services.xml +++ b/dspace/config/spring/api/orcid-services.xml @@ -112,7 +112,6 @@ - @@ -122,7 +121,6 @@ - @@ -132,42 +130,36 @@ - - - - - -