Skip to content

Commit

Permalink
SHIBUI-2268
Browse files Browse the repository at this point in the history
Refactoring and simplifying code for AlgorithmFilter
  • Loading branch information
chasegawa committed Aug 9, 2022
1 parent ccc61ff commit ae97066
Show file tree
Hide file tree
Showing 20 changed files with 268 additions and 338 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package edu.internet2.tier.shibboleth.admin.ui.controller

import com.fasterxml.jackson.databind.ObjectMapper
import edu.internet2.tier.shibboleth.admin.ui.jsonschema.JsonSchemaResourceLocation
import edu.internet2.tier.shibboleth.admin.ui.jsonschema.JsonSchemaResourceLocationRegistry
import edu.internet2.tier.shibboleth.admin.ui.service.JsonSchemaBuilderService
import groovy.util.logging.Slf4j
import io.swagger.v3.oas.annotations.tags.Tag
import io.swagger.v3.oas.annotations.tags.Tags
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

import javax.annotation.PostConstruct

import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR

/**
* Controller implementing REST resource responsible for exposing structure definition for algorithm format filter user
* interface in terms of JSON schema.
*/
@RestController
@RequestMapping('/api/ui/AlgorithmFilter')
@Slf4j
@Tags(value = [@Tag(name = "ui")])
class AlgorithmFilterUiDefinitionController {

@Autowired
JsonSchemaResourceLocationRegistry jsonSchemaResourceLocationRegistry

JsonSchemaResourceLocation jsonSchemaLocation

@Autowired
ObjectMapper jacksonObjectMapper

@Autowired
JsonSchemaBuilderService jsonSchemaBuilderService

@GetMapping
ResponseEntity<?> getUiDefinitionJsonSchema() {
try {
def parsedJson = jacksonObjectMapper.readValue(this.jsonSchemaLocation.url, Map)
return ResponseEntity.ok(parsedJson)
} catch (Exception e) {
log.error(e.getMessage(), e)
return ResponseEntity.status(INTERNAL_SERVER_ERROR).body([jsonParseError : e.getMessage(), sourceUiSchemaDefinitionFile: this.jsonSchemaLocation.url])
}
}

@PostConstruct
void init() {
// this.jsonSchemaLocation = algorithmFilterSchema(this.jsonSchemaResourceLocationRegistry)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package edu.internet2.tier.shibboleth.admin.ui.service

import com.google.common.base.Predicate
import edu.internet2.tier.shibboleth.admin.ui.configuration.ShibUIConfiguration
import edu.internet2.tier.shibboleth.admin.ui.domain.EncryptionMethod
import edu.internet2.tier.shibboleth.admin.ui.domain.EncryptionMethodBuilder
import edu.internet2.tier.shibboleth.admin.ui.domain.exceptions.MetadataFileNotFoundException
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget
Expand All @@ -10,9 +12,7 @@ import edu.internet2.tier.shibboleth.admin.ui.domain.filters.NameIdFormatFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.RequiredValidUntilFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.SignatureValidationFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.AlgorithmFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.ConditionRef
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.ConditionScript
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.Entity
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.AlgorithmFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.opensaml.OpenSamlNameIdFormatFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.ExternalMetadataResolver
Expand Down Expand Up @@ -109,24 +109,50 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
'xmlns:alg': 'urn:oasis:names:tc:SAML:metadata:algsupport',
'xmlns:ds': 'http://www.w3.org/2000/09/xmldsig#'
) {
filter.unknownXMLObjects.each { xmlObject ->
{
if (xmlObject instanceof Entity) {
Entity(xmlObject.getValue())
} else if (xmlObject instanceof ConditionRef) {
ConditionRef(xmlObject.getValue())
} else if (xmlObject instanceof ConditionScript) {
ConditionScript() {
Script() {
def script = xmlObject.getValue()
mkp.yieldUnescaped("\n<![CDATA[\n${script}\n]]>\n")
}
for (String algValue : filter.getAlgorithms()) {
EncryptionMethod method = new EncryptionMethodBuilder().buildObject();
method.setAlgorithm(algValue)
mkp.yieldUnescaped(openSamlObjects.marshalToXmlString(method, false))
}
switch (filter.algorithmFilterTarget.targetType) {
case AlgorithmFilterTarget.AlgorithmFilterTargetType.ENTITY:
filter.algorithmFilterTarget.value.each {
Entity(it)
}
break
case AlgorithmFilterTarget.AlgorithmFilterTargetType.CONDITION_REF:
ConditionRef(xmlObject.getValue())
break
case AlgorithmFilterTarget.AlgorithmFilterTargetType.CONDITION_SCRIPT:
ConditionScript() {
Script() {
def script = filter.getAlgorithmFilterTarget().value[0]
mkp.yieldUnescaped("\n<![CDATA[\n${script}\n]]>\n")
}
} else {
mkp.yieldUnescaped(openSamlObjects.marshalToXmlString(xmlObject, false))
}
}
break
default:
// do nothing, we'd have exploded elsewhere previously.
break
}
// filter.unknownXMLObjects.each { xmlObject ->
// {
// if (xmlObject instanceof Entity) {
// Entity(xmlObject.getValue())
// } else if (xmlObject instanceof ConditionRef) {
// ConditionRef(xmlObject.getValue())
// } else if (xmlObject instanceof ConditionScript) {
// ConditionScript() {
// Script() {
// def script = xmlObject.getValue()
// mkp.yieldUnescaped("\n<![CDATA[\n${script}\n]]>\n")
// }
// }
// } else {
// mkp.yieldUnescaped(openSamlObjects.marshalToXmlString(xmlObject, false))
// }
// }
// }
}
}

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

import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.AbstractAlgorithmIdentifierType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm;
package edu.internet2.tier.shibboleth.admin.ui.domain;

import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.AbstractAlgorithmIdentifierType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm;
package edu.internet2.tier.shibboleth.admin.ui.domain;

import edu.internet2.tier.shibboleth.admin.ui.domain.filters.algorithm.AbstractAlgorithmIdentifierType;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.filters;

import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable;
import lombok.EqualsAndHashCode;

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.FetchType;
import javax.persistence.MappedSuperclass;
import javax.persistence.OrderColumn;
import java.util.ArrayList;
import java.util.List;

@MappedSuperclass
@EqualsAndHashCode(callSuper = true)
public abstract class AbstractFilterTarget extends AbstractAuditable implements IFilterTarget {
@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(length = 760, name="target_value")
protected List<String> value;

@Override
public List<String> getValue() {
return value == null ? new ArrayList<>() : value;
}

@Override
public void setSingleValue(String value) {
List<String> values = new ArrayList<>();
values.add(value);
this.value = values;
}

@Override
public void setValue(List<String> value) {
this.value = value;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,21 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.Audited;

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

@Entity
@EqualsAndHashCode(callSuper = true)
@ToString
@Audited
@AuditOverride(forClass = AbstractAuditable.class)
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class EntityAttributesFilterTarget extends AbstractAuditable implements IFilterTarget {

public class EntityAttributesFilterTarget extends AbstractFilterTarget {
private EntityAttributesFilterTargetType entityAttributesFilterTargetType;

@ElementCollection (fetch = FetchType.EAGER)
@OrderColumn
@Column(length = 760, name="target_value")
private List<String> value;

public EntityAttributesFilterTargetType getEntityAttributesFilterTargetType() {
return entityAttributesFilterTargetType;
}
Expand All @@ -39,33 +29,10 @@ public String getTargetTypeValue() {
return entityAttributesFilterTargetType == null ? "NONE" : entityAttributesFilterTargetType.name();
}

@Override
public List<String> getValue() {
return value == null ? new ArrayList<>() : value;
}

public void setEntityAttributesFilterTargetType(EntityAttributesFilterTargetType entityAttributesFilterTarget) {
this.entityAttributesFilterTargetType = entityAttributesFilterTarget;
}

public void setSingleValue(String value) {
List<String> values = new ArrayList<>();
values.add(value);
this.value = values;
}

public void setValue(List<String> value) {
this.value = value;
}

@Override
public String toString() {
return "EntityAttributesFilterTarget{" +
"entityAttributesFilterTargetType=" + entityAttributesFilterTargetType +
", value=" + value +
'}';
}

public enum EntityAttributesFilterTargetType {
ENTITY, CONDITION_SCRIPT, CONDITION_REF, REGEX
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public abstract class MetadataFilter extends AbstractAuditable implements IConcr

@JsonProperty("@type")
@Transient
String type;
protected String type;

@Transient
private transient Integer version;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,18 @@
import org.hibernate.envers.AuditOverride;
import org.hibernate.envers.Audited;

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

@Entity
@EqualsAndHashCode(callSuper = true)
@ToString
@Audited
@AuditOverride(forClass = AbstractAuditable.class)
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class NameIdFormatFilterTarget extends AbstractAuditable implements IFilterTarget {
@JsonIgnoreProperties({ "handler", "hibernateLazyInitializer" })
public class NameIdFormatFilterTarget extends AbstractFilterTarget {

private NameIdFormatFilterTargetType nameIdFormatFilterTargetType;

@ElementCollection
@OrderColumn
@Column(name="target_value")
private List<String> value;

public NameIdFormatFilterTargetType getNameIdFormatFilterTargetType() {
return nameIdFormatFilterTargetType;
}
Expand All @@ -41,24 +30,10 @@ public String getTargetTypeValue() {
return nameIdFormatFilterTargetType.name();
}

public List<String> getValue() {
return value;
}

public void setNameIdFormatFilterTargetType(NameIdFormatFilterTargetType nameIdFormatFilterTargetType) {
this.nameIdFormatFilterTargetType = nameIdFormatFilterTargetType;
}

public void setSingleValue(String value) {
List<String> values = new ArrayList<>();
values.add(value);
this.value = values;
}

public void setValue(List<String> value) {
this.value = value;
}

public enum NameIdFormatFilterTargetType {
ENTITY, CONDITION_SCRIPT, REGEX
}
Expand Down
Loading

0 comments on commit ae97066

Please sign in to comment.