Skip to content

Commit

Permalink
Merged in feature/SHIBUI-1783 (pull request #482)
Browse files Browse the repository at this point in the history
Feature/SHIBUI-1783

Approved-by: Jonathan Johnson
  • Loading branch information
chasegawa authored and Jonathan Johnson committed Jun 2, 2021
2 parents e6096b0 + 1b18a3a commit 4ab559d
Show file tree
Hide file tree
Showing 15 changed files with 393 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public ResponseEntity<?> create(@RequestBody CustomEntityAttributeDefinition def

if (cad != null) {
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute").build().toUri());
headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute").build().toUri());

return ResponseEntity.status(HttpStatus.CONFLICT).headers(headers)
.body(new ErrorResponse(String.valueOf(HttpStatus.CONFLICT.value()),
Expand All @@ -52,7 +52,7 @@ public ResponseEntity<?> update(@RequestBody CustomEntityAttributeDefinition def
CustomEntityAttributeDefinition cad = caService.find(definition.getName());
if (cad == null) {
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute").build().toUri());
headers.setLocation(ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute").build().toUri());

return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers)
.body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()),
Expand All @@ -76,7 +76,7 @@ public ResponseEntity<?> getOne(@PathVariable String name) {
if (cad == null) {
HttpHeaders headers = new HttpHeaders();
headers.setLocation(
ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute/" + name).build().toUri());
ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + name).build().toUri());

return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers)
.body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()),
Expand All @@ -92,7 +92,7 @@ public ResponseEntity<?> delete(@PathVariable String name) {
if (cad == null) {
HttpHeaders headers = new HttpHeaders();
headers.setLocation(
ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/attribute/" + name).build().toUri());
ServletUriComponentsBuilder.fromCurrentServletMapping().path("/api/custom/entity/attribute/" + name).build().toUri());

return ResponseEntity.status(HttpStatus.NOT_FOUND).headers(headers)
.body(new ErrorResponse(String.valueOf(HttpStatus.NOT_FOUND.value()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public ResponseEntity<?> update(@PathVariable String metadataResolverId,

filterTobeUpdated.setName(updatedFilter.getName());
filterTobeUpdated.setFilterEnabled(updatedFilter.isFilterEnabled());
updateConcreteFilterTypeData(filterTobeUpdated, updatedFilter);
updatedFilter.updateConcreteFilterTypeData(filterTobeUpdated);

MetadataFilter persistedFilter = filterRepository.save(filterTobeUpdated);

Expand Down Expand Up @@ -206,49 +206,6 @@ private MetadataFilter newlyPersistedFilter(Stream<MetadataFilter> filters, fina
return persistedFilter;
}

/**
* Add else if instanceof block here for each concrete filter types we add in the future
*/
private void updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated, MetadataFilter filterWithUpdatedData) {
//TODO: Could we maybe use Dozer here before things get out of control? https://dozermapper.github.io
// Mapper mapper = new net.sf.dozer.Mapper(); // or autowire one
// mapper.map(fromFilter, toFilter);
if (filterWithUpdatedData instanceof EntityAttributesFilter) {
EntityAttributesFilter toFilter = EntityAttributesFilter.class.cast(filterToBeUpdated);
EntityAttributesFilter fromFilter = EntityAttributesFilter.class.cast(filterWithUpdatedData);
toFilter.setEntityAttributesFilterTarget(fromFilter.getEntityAttributesFilterTarget());
toFilter.setRelyingPartyOverrides(fromFilter.getRelyingPartyOverrides());
toFilter.setAttributeRelease(fromFilter.getAttributeRelease());
} else if (filterWithUpdatedData instanceof EntityRoleWhiteListFilter) {
EntityRoleWhiteListFilter toFilter = EntityRoleWhiteListFilter.class.cast(filterToBeUpdated);
EntityRoleWhiteListFilter fromFilter = EntityRoleWhiteListFilter.class.cast(filterWithUpdatedData);
toFilter.setRemoveEmptyEntitiesDescriptors(fromFilter.getRemoveEmptyEntitiesDescriptors());
toFilter.setRemoveRolelessEntityDescriptors(fromFilter.getRemoveRolelessEntityDescriptors());
toFilter.setRetainedRoles(fromFilter.getRetainedRoles());
} else if (filterWithUpdatedData instanceof SignatureValidationFilter) {
SignatureValidationFilter toFilter = SignatureValidationFilter.class.cast(filterToBeUpdated);
SignatureValidationFilter fromFilter = SignatureValidationFilter.class.cast(filterWithUpdatedData);
toFilter.setRequireSignedRoot(fromFilter.getRequireSignedRoot());
toFilter.setCertificateFile(fromFilter.getCertificateFile());
toFilter.setDefaultCriteriaRef(fromFilter.getDefaultCriteriaRef());
toFilter.setSignaturePrevalidatorRef(fromFilter.getSignaturePrevalidatorRef());
toFilter.setDynamicTrustedNamesStrategyRef(fromFilter.getDynamicTrustedNamesStrategyRef());
toFilter.setTrustEngineRef(fromFilter.getTrustEngineRef());
toFilter.setPublicKey(fromFilter.getPublicKey());
} else if (filterWithUpdatedData instanceof RequiredValidUntilFilter) {
RequiredValidUntilFilter toFilter = RequiredValidUntilFilter.class.cast(filterToBeUpdated);
RequiredValidUntilFilter fromFilter = RequiredValidUntilFilter.class.cast(filterWithUpdatedData);
toFilter.setMaxValidityInterval(fromFilter.getMaxValidityInterval());
} else if (filterWithUpdatedData instanceof NameIdFormatFilter) {
NameIdFormatFilter toFilter = NameIdFormatFilter.class.cast(filterToBeUpdated);
NameIdFormatFilter fromFilter = NameIdFormatFilter.class.cast(filterWithUpdatedData);
toFilter.setRemoveExistingFormats(fromFilter.getRemoveExistingFormats());
toFilter.setFormats(fromFilter.getFormats());
toFilter.setNameIdFormatFilterTarget(fromFilter.getNameIdFormatFilterTarget());
}
//TODO: add other types of concrete filters update here
}

private static URI getResourceUriFor(MetadataResolver mr, String filterResourceId) {
return ServletUriComponentsBuilder
.fromCurrentServletMapping().path("/api/MetadataResolvers/")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import org.hibernate.envers.Audited;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.hibernate.envers.Audited;

import edu.internet2.tier.shibboleth.admin.ui.domain.CustomEntityAttributeDefinition;
import lombok.Getter;
import lombok.Setter;


@Entity(name = "custom_entity_attr_filter_value")
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "filter_id", "custom_entity_attribute_name" }) })
@Audited
// NOTE: lombok's toString and equals cause an infinite loop somewhere that causes stack overflows, so if we need impls,
// do it manually. Do not replace the Getter and Setter with @Data...
@Getter
@Setter
public class CustomEntityAttributeFilterValue {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "generated_id")
private Integer id;

@ManyToOne
@JoinColumn(name = "filter_id", nullable = false)
EntityAttributesFilter entityAttributesFilter;

@ManyToOne
@JoinColumn(name = "custom_entity_attribute_name", referencedColumnName = "name", nullable = false)
CustomEntityAttributeDefinition customEntityAttributeDefinition;

@Column(name = "value", nullable = false)
String value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,21 @@
import org.hibernate.envers.Audited;

import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderColumn;
import javax.persistence.PostLoad;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeListFromAttributeReleaseList;
import static edu.internet2.tier.shibboleth.admin.util.ModelRepresentationConversions.getAttributeListFromRelyingPartyOverridesRepresentation;
Expand All @@ -32,6 +37,7 @@
@ToString
@Audited
public class EntityAttributesFilter extends MetadataFilter {
private static final long serialVersionUID = 1L;

public EntityAttributesFilter() {
type = "EntityAttributes";
Expand All @@ -47,7 +53,16 @@ public EntityAttributesFilter() {

@Transient
private List<String> attributeRelease = new ArrayList<>();

@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy = "entityAttributesFilter", orphanRemoval = true)
private Set<CustomEntityAttributeFilterValue> customEntityAttributes = new HashSet<>();

public void setCustomEntityAttributes (Set<CustomEntityAttributeFilterValue> newValues) {
customEntityAttributes.clear();
customEntityAttributes.addAll(newValues);
}

public void setAttributeRelease(List<String> attributeRelease) {
this.attributeRelease = attributeRelease;
this.rebuildAttributes();
Expand Down Expand Up @@ -75,4 +90,17 @@ public void intoTransientRepresentation() {
this.attributeRelease = getAttributeReleaseListFromAttributeList(this.attributes);
this.relyingPartyOverrides = getRelyingPartyOverridesRepresentationFromAttributeList(this.attributes);
}

private EntityAttributesFilter updateConcreteFilterTypeData(EntityAttributesFilter filterToBeUpdated) {
filterToBeUpdated.setEntityAttributesFilterTarget(getEntityAttributesFilterTarget());
filterToBeUpdated.setRelyingPartyOverrides(getRelyingPartyOverrides());
filterToBeUpdated.setAttributeRelease(getAttributeRelease());
filterToBeUpdated.setCustomEntityAttributes(customEntityAttributes);
return filterToBeUpdated;
}

@Override
public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) {
return updateConcreteFilterTypeData((EntityAttributesFilter) filterToBeUpdated);
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.envers.Audited;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OrderColumn;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.envers.Audited;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Entity
@EqualsAndHashCode(callSuper = true)
Expand All @@ -36,4 +38,16 @@ public EntityRoleWhiteListFilter() {
@Column(name="RETAINED_ROLE")
@OrderColumn
private List<String> retainedRoles = new ArrayList<>();

private EntityRoleWhiteListFilter updateConcreteFilterTypeData(EntityRoleWhiteListFilter filterToBeUpdated) {
filterToBeUpdated.setRemoveEmptyEntitiesDescriptors(getRemoveEmptyEntitiesDescriptors());
filterToBeUpdated.setRemoveRolelessEntityDescriptors(getRemoveRolelessEntityDescriptors());
filterToBeUpdated.setRetainedRoles(getRetainedRoles());
return filterToBeUpdated;
}

@Override
public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) {
return updateConcreteFilterTypeData((EntityRoleWhiteListFilter) filterToBeUpdated);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

/**
* Concrete implementations of the MetadataFilter should implement the updateConcreteFilterTypeData signature to
* populate specific type data from the existing filter to the target filter.
*/
public interface IConcreteMetadataFilterType<T> {

/**
* @param filterToBeUpdated the target of the data
* @return the filterToBeUpdated with the updated information from the existing filter
*/
T updateConcreteFilterTypeData(T filterToBeUpdated);
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
@JsonSubTypes.Type(value=NameIdFormatFilter.class, name="NameIDFormat")})
@Audited
@AuditOverride(forClass = AbstractAuditable.class)
public class MetadataFilter extends AbstractAuditable {
public abstract class MetadataFilter extends AbstractAuditable implements IConcreteMetadataFilterType<MetadataFilter> {

@JsonProperty("@type")
@Transient
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.envers.Audited;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.OneToOne;
import javax.persistence.OrderColumn;
import java.util.List;

import org.hibernate.envers.Audited;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Entity
@EqualsAndHashCode(callSuper = true)
Expand All @@ -34,4 +36,16 @@ public NameIdFormatFilter() {
@OneToOne(cascade = CascadeType.ALL)
private NameIdFormatFilterTarget nameIdFormatFilterTarget;

private NameIdFormatFilter updateConcreteFilterTypeData(NameIdFormatFilter filterToBeUpdated) {
filterToBeUpdated.setRemoveExistingFormats(getRemoveExistingFormats());
filterToBeUpdated.setFormats(getFormats());
filterToBeUpdated.setNameIdFormatFilterTarget(getNameIdFormatFilterTarget());
return filterToBeUpdated;
}

@Override
public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) {
return updateConcreteFilterTypeData((NameIdFormatFilter) filterToBeUpdated);
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

import javax.persistence.Entity;

import org.hibernate.envers.Audited;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.envers.Audited;

import javax.persistence.Entity;

@Entity
@EqualsAndHashCode(callSuper = true)
Expand All @@ -25,4 +26,14 @@ public RequiredValidUntilFilter() {
public boolean xmlShouldBeGenerated() {
return (maxValidityInterval != null) && (!maxValidityInterval.equals("PT0S"));
}

private RequiredValidUntilFilter updateConcreteFilterTypeData(RequiredValidUntilFilter filterToBeUpdated) {
filterToBeUpdated.setMaxValidityInterval(getMaxValidityInterval());
return filterToBeUpdated;
}

@Override
public MetadataFilter updateConcreteFilterTypeData(MetadataFilter filterToBeUpdated) {
return updateConcreteFilterTypeData((RequiredValidUntilFilter) filterToBeUpdated);
}
}
Loading

0 comments on commit 4ab559d

Please sign in to comment.