From 16e50099bc5937e2593d6b01886179d5313c3f96 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 30 Aug 2022 14:43:00 -0700 Subject: [PATCH 1/4] SHIBUI-2341 Adding capacity to handle long character descriptions --- .../admin/ui/domain/Description.java | 4 +++- .../main/resources/db/changelog/changelog.sql | 22 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Description.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Description.java index db994740a..b86c86b1d 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Description.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/Description.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.Lob; @Entity @EqualsAndHashCode(callSuper = true) @@ -16,6 +17,7 @@ public class Description extends AbstractXMLObject implements org.opensaml.saml. private String xmlLang; @Column(name = "descriptionValue") + @Lob private String value; @Nullable @@ -39,4 +41,4 @@ public String getValue() { public void setValue(@Nullable String value) { this.value = value; } -} +} \ No newline at end of file diff --git a/backend/src/main/resources/db/changelog/changelog.sql b/backend/src/main/resources/db/changelog/changelog.sql index 0a63846a3..f1494b2ca 100644 --- a/backend/src/main/resources/db/changelog/changelog.sql +++ b/backend/src/main/resources/db/changelog/changelog.sql @@ -175,4 +175,24 @@ update file_backed_http_metadata_resolver_aud set max_refresh_delay ='PT4H'; update resource_backed_metadata_resolver set min_refresh_delay ='PT5M'; update resource_backed_metadata_resolver_aud set min_refresh_delay ='PT5M'; update resource_backed_metadata_resolver set max_refresh_delay ='PT4H'; -update resource_backed_metadata_resolver_aud set max_refresh_delay ='PT4H'; \ No newline at end of file +update resource_backed_metadata_resolver_aud set max_refresh_delay ='PT4H'; + +-- changeset liquibase:1.13.0.1 dbms:mariadb,mysql +-- preconditions onFail:MARK_RAN +-- precondition-sql-check expectedResult:1 SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'users' +-- comment: /* we don't need to run this if the system is new */ + +ALTER TABLE description ALTER COLUMN descriptionValue LONGTEXT; +GO +ALTER TABLE description)aud ALTER COLUMN descriptionValue LONGTEXT; +GO + +-- changeset liquibase:1.13.0.2 dbms:postgresql,mssql +-- preconditions onFail:MARK_RAN +-- precondition-sql-check expectedResult:1 SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'users' +-- comment: /* we don't need to run this if the system is new */ + +ALTER TABLE description ALTER COLUMN descriptionValue TEXT; +GO +ALTER TABLE description_aud ALTER COLUMN descriptionValue TEXT; +GO \ No newline at end of file From 1e04e06830f005e1b07f05c27bc9e55378c5b5be Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 31 Aug 2022 16:20:10 -0700 Subject: [PATCH 2/4] SHIBUI-2341 Fixing logic to correctly import the XML --- .../ui/controller/EntityDescriptorController.java | 6 ++++-- .../admin/ui/domain/AttributeConsumingService.java | 11 ++++++++++- .../shibboleth/admin/ui/domain/SPSSODescriptor.java | 4 ++-- .../admin/ui/service/EntityDescriptorService.java | 2 ++ .../ui/service/JPAEntityDescriptorServiceImpl.java | 10 ++++++++-- .../controller/EntityDescriptorControllerTests.groovy | 8 ++++++-- testbed/postgres/docker-compose.yml | 2 ++ 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java index c2d9b81a0..a31838f1a 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java @@ -9,6 +9,7 @@ import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tags; import lombok.extern.slf4j.Slf4j; @@ -33,6 +34,7 @@ import javax.annotation.PostConstruct; import java.net.URI; import java.util.ConcurrentModificationException; +import java.util.Optional; @RestController @RequestMapping("/api") @@ -127,8 +129,8 @@ public ResponseEntity getSpecificVersion(@PathVariable String resourceId, @Pa private ResponseEntity handleUploadingEntityDescriptorXml(byte[] rawXmlBytes, String spName) throws Exception { final EntityDescriptor ed = EntityDescriptor.class.cast(openSamlObjects.unmarshalFromXml(rawXmlBytes)); ed.setServiceProviderName(spName); - - EntityDescriptorRepresentation persistedEd = entityDescriptorService.createNew(ed); + + EntityDescriptorRepresentation persistedEd = entityDescriptorService.createNewEntityDescriptorFromXMLOrigin(ed); return ResponseEntity.created(getResourceUriFor(persistedEd.getId())).body(persistedEd); } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java index 632bcb888..9adb45e2e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AttributeConsumingService.java @@ -2,6 +2,7 @@ import lombok.EqualsAndHashCode; import org.hibernate.envers.Audited; +import org.opensaml.core.xml.XMLObject; import org.opensaml.core.xml.schema.XSBooleanValue; import javax.persistence.CascadeType; @@ -17,7 +18,6 @@ @EqualsAndHashCode(callSuper = true) @Audited public class AttributeConsumingService extends AbstractXMLObject implements org.opensaml.saml.saml2.metadata.AttributeConsumingService { - private int acsIndex; private boolean isDefault; @@ -93,4 +93,13 @@ public List getRequestedAtt public void setRequestedAttributes(List requestedAttributes) { this.requestedAttributes = requestedAttributes; } + + @Override + public List getOrderedChildren() { + List childXMLObjects = new ArrayList<>(); + childXMLObjects.addAll(serviceNames); + childXMLObjects.addAll(serviceDescriptions); + childXMLObjects.addAll(requestedAttributes); + return childXMLObjects; + } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java index e90542c5a..52d37bf1f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SPSSODescriptor.java @@ -95,7 +95,7 @@ public AssertionConsumerService getDefaultAssertionConsumerService() { @Override public List getAttributeConsumingServices() { - return Lists.newArrayList(attributeConsumingServices); + return (List)(List) attributeConsumingServices; } public void setAttributeConsumingServices(List attributeConsumingServices) { @@ -124,4 +124,4 @@ public List getOrderedChildren() { public Optional getOptionalExtensions() { return Optional.ofNullable(this.getExtensions()); } -} +} \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java index b2bf96ac3..ed3f7be0e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java @@ -114,4 +114,6 @@ EntityDescriptorRepresentation update(EntityDescriptorRepresentation edRepresent void updateDescriptorFromRepresentation(final org.opensaml.saml.saml2.metadata.EntityDescriptor entityDescriptor, final EntityDescriptorRepresentation representation); EntityDescriptorRepresentation updateEntityDescriptorEnabledStatus(String resourceId, boolean status) throws EntityNotFoundException, ForbiddenException; + + EntityDescriptorRepresentation createNewEntityDescriptorFromXMLOrigin(EntityDescriptor ed); } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index f6c419b31..be79e3097 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -102,11 +102,17 @@ public EntityDescriptor createDescriptorFromRepresentation(final EntityDescripto } @Override - public EntityDescriptorRepresentation createNew(EntityDescriptor ed) - throws ForbiddenException, ObjectIdExistsException, InvalidPatternMatchException { + public EntityDescriptorRepresentation createNew(EntityDescriptor ed) throws ForbiddenException, ObjectIdExistsException, InvalidPatternMatchException { return createNew(createRepresentationFromDescriptor(ed)); } + @Override + public EntityDescriptorRepresentation createNewEntityDescriptorFromXMLOrigin(EntityDescriptor ed) { + ed.setIdOfOwner(userService.getCurrentUserGroup().getOwnerId()); + EntityDescriptor savedEntity = entityDescriptorRepository.save(ed); + return createRepresentationFromDescriptor(savedEntity); + } + @Override public EntityDescriptorRepresentation createNew(EntityDescriptorRepresentation edRep) throws ForbiddenException, ObjectIdExistsException, InvalidPatternMatchException { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy index 8861d1613..94de774b3 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy @@ -530,6 +530,11 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + + Shrink Space + Shrink Space Authenticator + + ''' @@ -551,7 +556,6 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.assertionConsumerServices[0].binding").value("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST")) .andExpect(jsonPath("\$.assertionConsumerServices[0].makeDefault").value(false)) .andExpect(jsonPath("\$.assertionConsumerServices[0].locationUrl").value("https://test.scaldingspoon.org/test1/acs")) - } @WithMockAdmin @@ -691,4 +695,4 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { e instanceof ConcurrentModificationException } } -} +} \ No newline at end of file diff --git a/testbed/postgres/docker-compose.yml b/testbed/postgres/docker-compose.yml index c66b591a8..1a3dd4d82 100644 --- a/testbed/postgres/docker-compose.yml +++ b/testbed/postgres/docker-compose.yml @@ -18,9 +18,11 @@ services: - 8080:8080 - 5005:5005 - 8443:8443 + - 8000:8000 volumes: - ./conf:/conf - ./conf/application.yml:/application.yml + entrypoint: ["/usr/bin/java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000", "-jar", "app.war"] networks: - front depends_on: From d7bed884421789be89802f8c96fab644effd1811 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 31 Aug 2022 16:38:13 -0700 Subject: [PATCH 3/4] SHIBUI-2341 Fixing logic to correctly save SurName --- .../edu/internet2/tier/shibboleth/admin/ui/domain/SurName.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SurName.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SurName.java index b6be50f64..031dc8eec 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SurName.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/SurName.java @@ -18,6 +18,6 @@ public String getValue() { @Override public void setValue(String name) { - this.value = value; + this.value = name; } } \ No newline at end of file From f011dca576be2189f2c9745b70ddf07ddb370f4e Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 2 Sep 2022 10:15:53 -0700 Subject: [PATCH 4/4] SHIBUI-2374 Added logic so that entities with the same entity id won't be created. --- .../admin/ui/controller/EntityDescriptorController.java | 4 ++++ .../admin/ui/service/EntityDescriptorService.java | 2 ++ .../admin/ui/service/JPAEntityDescriptorServiceImpl.java | 5 +++++ .../ui/controller/EntityDescriptorControllerTests.groovy | 7 +++++++ 4 files changed, 18 insertions(+) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java index a31838f1a..81d62a1ad 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorController.java @@ -128,6 +128,10 @@ public ResponseEntity getSpecificVersion(@PathVariable String resourceId, @Pa private ResponseEntity handleUploadingEntityDescriptorXml(byte[] rawXmlBytes, String spName) throws Exception { final EntityDescriptor ed = EntityDescriptor.class.cast(openSamlObjects.unmarshalFromXml(rawXmlBytes)); + if (entityDescriptorService.entityExists(ed.getEntityID())) { + throw new ObjectIdExistsException("Entity with ID: " + ed.getEntityID() + "exists"); + } + ed.setServiceProviderName(spName); EntityDescriptorRepresentation persistedEd = entityDescriptorService.createNewEntityDescriptorFromXMLOrigin(ed); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java index ed3f7be0e..6ecf9073e 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EntityDescriptorService.java @@ -116,4 +116,6 @@ EntityDescriptorRepresentation update(EntityDescriptorRepresentation edRepresent EntityDescriptorRepresentation updateEntityDescriptorEnabledStatus(String resourceId, boolean status) throws EntityNotFoundException, ForbiddenException; EntityDescriptorRepresentation createNewEntityDescriptorFromXMLOrigin(EntityDescriptor ed); + + boolean entityExists(String entityID); } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java index be79e3097..ec5c28048 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPAEntityDescriptorServiceImpl.java @@ -113,6 +113,11 @@ public EntityDescriptorRepresentation createNewEntityDescriptorFromXMLOrigin(Ent return createRepresentationFromDescriptor(savedEntity); } + @Override + public boolean entityExists(String entityID) { + return entityDescriptorRepository.findByEntityID(entityID) != null ; + } + @Override public EntityDescriptorRepresentation createNew(EntityDescriptorRepresentation edRep) throws ForbiddenException, ObjectIdExistsException, InvalidPatternMatchException { diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy index 94de774b3..35bd77ea2 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/controller/EntityDescriptorControllerTests.groovy @@ -556,6 +556,13 @@ class EntityDescriptorControllerTests extends AbstractBaseDataJpaTest { .andExpect(jsonPath("\$.assertionConsumerServices[0].binding").value("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST")) .andExpect(jsonPath("\$.assertionConsumerServices[0].makeDefault").value(false)) .andExpect(jsonPath("\$.assertionConsumerServices[0].locationUrl").value("https://test.scaldingspoon.org/test1/acs")) + + try { + mockMvc.perform(post("/api/EntityDescriptor").contentType(APPLICATION_XML).content(postedBody).param("spName", spName)) + } + catch (Exception e) { + e instanceof ObjectIdExistsException + } } @WithMockAdmin