From 222a3db187f6ffafea91399206e1b642b6797a77 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 15 Jun 2021 16:10:17 -0700 Subject: [PATCH] SHIBUI-1788 Fixes for lists in custom attribute definitions showing up on the relying party override config in metadata --- .../service/JsonSchemaBuilderService.groovy | 4 +-- .../CustomPropertiesConfiguration.java | 27 ++++++++++--------- .../CustomEntityAttributeDefinition.java | 16 ++++++++--- .../domain/RelyingPartyOverrideProperty.java | 9 +++++-- backend/src/main/resources/application.yml | 4 +-- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy index fa606f53b..6857a0109 100644 --- a/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy +++ b/backend/src/main/groovy/edu/internet2/tier/shibboleth/admin/ui/service/JsonSchemaBuilderService.groovy @@ -36,7 +36,7 @@ class JsonSchemaBuilderService { [title : it['displayName'], description: it['helpText'], type : it['displayType'], - examples : it['defaultValues']] + examples : it['examples']] } properties[(String) it['name']] = property } @@ -59,7 +59,7 @@ class JsonSchemaBuilderService { def items = [type : 'string', minLength: 1, // TODO: should this be configurable? maxLength: 255] //TODO: or this? - items.examples = it['defaultValues'] + items.examples = it['examples'] definition['items'] = items json[(String) it['name']] = definition diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CustomPropertiesConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CustomPropertiesConfiguration.java index 5b73b1fb1..66063c490 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CustomPropertiesConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/CustomPropertiesConfiguration.java @@ -21,21 +21,24 @@ @ConfigurationProperties(prefix = "custom") public class CustomPropertiesConfiguration implements ApplicationListener { private List> attributes = new ArrayList<>(); - + private CustomEntityAttributesDefinitionService ceadService; private HashMap overrides = new HashMap<>(); - + private List overridesFromConfigFile = new ArrayList<>(); - + private void buildRelyingPartyOverrides() { // Start over with a clean map and get the CustomEntityAttributesDefinitions from the DB overrides = new HashMap<>(); - ceadService.getAllDefinitions().forEach(def -> overrides.put(def.getName(), def)); - - // We only want to add to an override from the config file if the incoming override (by name) isn't already in + ceadService.getAllDefinitions().forEach(def -> { + def.updateExamplesList(); // totally non-ooo, but @PostLoad wasn't working and JPA/Hibernate is doing some reflection crap + overrides.put(def.getName(), def); + }); + + // We only want to add to an override from the config file if the incoming override (by name) isn't already in // the list of overrides (ie DB > file config) - for(RelyingPartyOverrideProperty rpop : this.overridesFromConfigFile) { + for (RelyingPartyOverrideProperty rpop : this.overridesFromConfigFile) { if (!this.overrides.containsKey(rpop.getName())) { this.overrides.put(rpop.getName(), rpop); } @@ -44,10 +47,10 @@ private void buildRelyingPartyOverrides() { public List> getAttributes() { return attributes; - } - + } + public List getOverrides() { - return new ArrayList<>(overrides.values()); + return new ArrayList<>(overrides.values()); } /** @@ -56,9 +59,9 @@ public List getOverrides() { */ @Override public void onApplicationEvent(CustomEntityAttributeDefinitionChangeEvent arg0) { - buildRelyingPartyOverrides(); + buildRelyingPartyOverrides(); } - + @PostConstruct public void postConstruct() { // Make sure we have the right data diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java index 0df210269..6c3186ea9 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/CustomEntityAttributeDefinition.java @@ -7,8 +7,11 @@ import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; +import javax.persistence.EntityListeners; import javax.persistence.Id; import javax.persistence.JoinColumn; +import javax.persistence.PostLoad; +import javax.persistence.Transient; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; @@ -41,6 +44,9 @@ public class CustomEntityAttributeDefinition implements IRelyingPartyOverridePro @Column(name = "display_name", nullable = true) String displayName; + @Transient + Set examples; + @Column(name = "help_text", nullable = true) String helpText; @@ -78,12 +84,12 @@ public String getDisplayName() { public String getDisplayType() { return attributeType.name().toLowerCase(); } - + @Override public Boolean getFromConfigFile() { return Boolean.FALSE; } - + @Override public void setDefaultValues(Set defaultValues) { // This is here to comply with the interface only and should not be used to change the set of values in this implementation @@ -92,5 +98,9 @@ public void setDefaultValues(Set defaultValues) { @Override public void setDisplayType(String displayType) { // This is here to comply with the interface only and should not be used to change the value in this implementation - } + } + + public void updateExamplesList() { + examples = customAttrListDefinitions; + } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java index 4c8b9daa6..a958095b6 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/RelyingPartyOverrideProperty.java @@ -19,12 +19,13 @@ public class RelyingPartyOverrideProperty implements IRelyingPartyOverrideProper private Set defaultValues; private String displayName; private String displayType; + private Set examples; private String helpText; private String invert; private String name; private String persistType; private String persistValue; - + @Override public Boolean getFromConfigFile() { return Boolean.TRUE; @@ -39,6 +40,10 @@ public CustomAttributeType getAttributeType() { default: return CustomAttributeType.valueOf(displayType.toUpperCase()); } - + } + + public void setDefaultValues(Set defaults) { + defaultValues = defaults; + examples = defaults; } } \ No newline at end of file diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index ea5222d05..e9301289a 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -118,7 +118,7 @@ custom: displayName: label.nameid-format-to-send displayType: set helpText: tooltip.nameid-format - examples: + defaultValues: - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent @@ -129,7 +129,7 @@ custom: displayName: label.authentication-methods-to-use displayType: set helpText: tooltip.authentication-methods-to-use - examples: + defaultValues: - https://refeds.org/profile/mfa - urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken - urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport