Skip to content

Commit

Permalink
Merged in SHIBUI-519 (pull request #84)
Browse files Browse the repository at this point in the history
SHIBUI-519

Approved-by: Shibui Jenkins <shibui.jenkins@gmail.com>
Approved-by: Dmitriy Kopylenko <dkopylenko@unicon.net>
  • Loading branch information
Bill Smith authored and Jonathan Johnson committed Jun 20, 2018
2 parents 7c08aee + 90a0cc1 commit 92fb2fb
Show file tree
Hide file tree
Showing 21 changed files with 1,248 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package edu.internet2.tier.shibboleth.admin.ui.service;

import com.google.common.base.Predicate;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter;
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver
import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects;

import com.google.common.base.Predicate

import com.google.common.base.Predicate
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilter
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityAttributesFilterTarget
import edu.internet2.tier.shibboleth.admin.ui.domain.filters.EntityRoleWhiteListFilter


import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.FileBackedHttpMetadataResolver

import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects

import edu.internet2.tier.shibboleth.admin.ui.repository.MetadataResolverRepository
import groovy.util.logging.Slf4j
import groovy.xml.DOMBuilder
Expand Down Expand Up @@ -115,6 +126,52 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
}
}

void constructXmlNodeForResolver(DynamicHttpMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) {
markupBuilderDelegate.MetadataProvider(id: resolver.name,
'xsi:type': 'DynamicHttpMetadataProvider',
requireValidMetadata: !resolver.requireValidMetadata ?: null,
failFastInitialization: !resolver.failFastInitialization ?: null,
sortKey: resolver.sortKey,
criterionPredicateRegistryRef: resolver.criterionPredicateRegistryRef,
useDefaultPredicateRegistry: !resolver.useDefaultPredicateRegistry ?: null,
satisfyAnyPredicates: resolver.satisfyAnyPredicates ?: null,
parserPoolRef: resolver.dynamicMetadataResolverAttributes?.parserPoolRef,
taskTimerRef: resolver.dynamicMetadataResolverAttributes?.taskTimerRef,
refreshDelayFactor: resolver.dynamicMetadataResolverAttributes?.refreshDelayFactor,
minCacheDuration: resolver.dynamicMetadataResolverAttributes?.minCacheDuration,
maxCacheDuration: resolver.dynamicMetadataResolverAttributes?.maxCacheDuration,
maxIdleEntityData: resolver.dynamicMetadataResolverAttributes?.maxIdleEntityData,
removeIdleEntityData: !resolver.dynamicMetadataResolverAttributes?.removeIdleEntityData ?: null,
cleanupTaskInterval: resolver.dynamicMetadataResolverAttributes?.cleanupTaskInterval,
persistentCacheManagerRef: resolver.dynamicMetadataResolverAttributes?.persistentCacheManagerRef,
persistentCacheManagerDirectory: resolver.dynamicMetadataResolverAttributes?.persistentCacheManagerDirectory,
persistentCacheKeyGeneratorRef: resolver.dynamicMetadataResolverAttributes?.persistentCacheKeyGeneratorRef,
initializeFromPersistentCacheInBackground: !resolver.dynamicMetadataResolverAttributes?.initializeFromPersistentCacheInBackground ?: null,
backgroundInitializationFromCacheDelay: resolver.dynamicMetadataResolverAttributes?.backgroundInitializationFromCacheDelay,
initializationFromCachePredicateRef: resolver.dynamicMetadataResolverAttributes?.initializationFromCachePredicateRef,

maxConnectionsTotal: resolver.maxConnectionsTotal,
maxConnectionsPerRoute: resolver.maxConnectionsPerRoute,
supportedContentTypes: resolver.supportedContentTypes?.value, //not sure this is right. maybe take off the ?.value

httpClientRef: resolver.httpMetadataResolverAttributes?.httpClientRef,
connectionRequestTimeout: resolver.httpMetadataResolverAttributes?.connectionRequestTimeout,
connectionTimeout: resolver.httpMetadataResolverAttributes?.connectionTimeout,
socketTimeout: resolver.httpMetadataResolverAttributes?.socketTimeout,
disregardTLSCertificate: resolver.httpMetadataResolverAttributes?.disregardTLSCertificate ?: null,
httpClientSecurityParametersRef: resolver.httpMetadataResolverAttributes?.httpClientSecurityParametersRef,
proxyHost: resolver.httpMetadataResolverAttributes?.proxyHost,
proxyPort: resolver.httpMetadataResolverAttributes?.proxyHost,
proxyUser: resolver.httpMetadataResolverAttributes?.proxyUser,
proxyPassword: resolver.httpMetadataResolverAttributes?.proxyPassword,
httpCaching: resolver.httpMetadataResolverAttributes?.httpCaching,
httpCacheDirectory: resolver.httpMetadataResolverAttributes?.httpCacheDirectory,
httpMaxCacheEntries: resolver.httpMetadataResolverAttributes?.httpMaxCacheEntries,
httpMaxCacheEntrySize: resolver.httpMetadataResolverAttributes?.httpMaxCacheEntrySize) {

childNodes()
}
}

void constructXmlNodeForFilter(EntityAttributesFilter filter, def markupBuilderDelegate) {
markupBuilderDelegate.MetadataFilter('xsi:type': 'EntityAttributes') {
Expand Down Expand Up @@ -182,4 +239,36 @@ class JPAMetadataResolverServiceImpl implements MetadataResolverService {
childNodes()
}
}

void constructXmlNodeForResolver(LocalDynamicMetadataResolver resolver, def markupBuilderDelegate, Closure childNodes) {
markupBuilderDelegate.MetadataProvider(sourceDirectory: resolver.sourceDirectory,
sourceManagerRef: resolver.sourceManagerRef,
sourceKeyGeneratorRef: resolver.sourceKeyGeneratorRef,

id: resolver.name,
'xsi:type': 'DynamicHttpMetadataProvider',
requireValidMetadata: !resolver.requireValidMetadata ?: null,
failFastInitialization: !resolver.failFastInitialization ?: null,
sortKey: resolver.sortKey,
criterionPredicateRegistryRef: resolver.criterionPredicateRegistryRef,
useDefaultPredicateRegistry: !resolver.useDefaultPredicateRegistry ?: null,
satisfyAnyPredicates: resolver.satisfyAnyPredicates ?: null,
parserPoolRef: resolver.dynamicMetadataResolverAttributes?.parserPoolRef,
taskTimerRef: resolver.dynamicMetadataResolverAttributes?.taskTimerRef,
refreshDelayFactor: resolver.dynamicMetadataResolverAttributes?.refreshDelayFactor,
minCacheDuration: resolver.dynamicMetadataResolverAttributes?.minCacheDuration,
maxCacheDuration: resolver.dynamicMetadataResolverAttributes?.maxCacheDuration,
maxIdleEntityData: resolver.dynamicMetadataResolverAttributes?.maxIdleEntityData,
removeIdleEntityData: !resolver.dynamicMetadataResolverAttributes?.removeIdleEntityData ?: null,
cleanupTaskInterval: resolver.dynamicMetadataResolverAttributes?.cleanupTaskInterval,
persistentCacheManagerRef: resolver.dynamicMetadataResolverAttributes?.persistentCacheManagerRef,
persistentCacheManagerDirectory: resolver.dynamicMetadataResolverAttributes?.persistentCacheManagerDirectory,
persistentCacheKeyGeneratorRef: resolver.dynamicMetadataResolverAttributes?.persistentCacheKeyGeneratorRef,
initializeFromPersistentCacheInBackground: !resolver.dynamicMetadataResolverAttributes?.initializeFromPersistentCacheInBackground ?: null,
backgroundInitializationFromCacheDelay: resolver.dynamicMetadataResolverAttributes?.backgroundInitializationFromCacheDelay,
initializationFromCachePredicateRef: resolver.dynamicMetadataResolverAttributes?.initializationFromCachePredicateRef) {

childNodes()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package edu.internet2.tier.shibboleth.admin.ui.controller;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.DynamicHttpMetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.repository.DynamicHttpMetadataResolverRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.net.URI;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
@RestController
@RequestMapping("/api/MetadataProvider/DynamicHttp")
public class DynamicHttpMetadataProviderController {
private static final Logger logger = LoggerFactory.getLogger(DynamicHttpMetadataProviderController.class);

@Autowired
DynamicHttpMetadataResolverRepository repository;

@DeleteMapping("/{resourceId}")
public ResponseEntity<?> deleteByResourceId(@PathVariable String resourceId) {
if (repository.deleteByResourceId(resourceId)) {
return ResponseEntity.accepted().build();
} else {
return ResponseEntity.notFound().build();
}
}

@GetMapping("/name/{metadataProviderName}")
@Transactional(readOnly = true)
public ResponseEntity<?> getOneByName(@PathVariable String metadataProviderName) {
DynamicHttpMetadataResolver resolver = repository.findByName(metadataProviderName);
if (resolver == null) {
return ResponseEntity.notFound().build();
} else {
resolver.setVersion(resolver.hashCode());
return ResponseEntity.ok(resolver);
}
}

@GetMapping("/{resourceId}")
@Transactional(readOnly = true)
public ResponseEntity<?> getOneByResourceId(@PathVariable String resourceId) {
DynamicHttpMetadataResolver resolver = repository.findByResourceId(resourceId);
if (resolver == null) {
return ResponseEntity.notFound().build();
} else {
resolver.setVersion(resolver.hashCode());
return ResponseEntity.ok(resolver);
}
}

@PostMapping
public ResponseEntity<?> create(@RequestBody DynamicHttpMetadataResolver resolver) {
if (repository.findByName(resolver.getName()) != null) {
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

DynamicHttpMetadataResolver persistedResolver = repository.save(resolver);
persistedResolver.setVersion(persistedResolver.hashCode());

return ResponseEntity
.created(getResourceUriFor(persistedResolver))
.body(persistedResolver);
}

@PutMapping
public ResponseEntity<?> update(@RequestBody DynamicHttpMetadataResolver resolver) {
DynamicHttpMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId());

if (existingResolver == null) {
return ResponseEntity.notFound().build();
}

if (existingResolver.hashCode() != resolver.getVersion()) {
logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion());
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

resolver.setAudId(existingResolver.getAudId());
//TODO: Do we need to set anything else? dates?

DynamicHttpMetadataResolver updatedResolver = repository.save(resolver);
updatedResolver.setVersion(updatedResolver.hashCode());

return ResponseEntity.ok(updatedResolver);
}

private static URI getResourceUriFor(DynamicHttpMetadataResolver resolver) {
return ServletUriComponentsBuilder
.fromCurrentServletMapping().path("/api/MetadataProvider/DynamicHttp/")
.pathSegment(resolver.getResourceId())
.build()
.toUri();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package edu.internet2.tier.shibboleth.admin.ui.controller;

import edu.internet2.tier.shibboleth.admin.ui.domain.resolvers.LocalDynamicMetadataResolver;
import edu.internet2.tier.shibboleth.admin.ui.repository.LocalDynamicMetadataResolverRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.net.URI;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
@RestController
@RequestMapping("/api/MetadataProvider/LocalDynamic")
public class LocalDynamicMetadataProviderController {
private static final Logger logger = LoggerFactory.getLogger(LocalDynamicMetadataProviderController.class);

@Autowired
LocalDynamicMetadataResolverRepository repository;

@DeleteMapping("/{resourceId}")
public ResponseEntity<?> deleteByResourceId(@PathVariable String resourceId) {
if (repository.deleteByResourceId(resourceId)) {
return ResponseEntity.accepted().build();
} else {
return ResponseEntity.notFound().build();
}
}

@GetMapping("/name/{metadataProviderName}")
@Transactional(readOnly = true)
public ResponseEntity<?> getOneByName(@PathVariable String metadataProviderName) {
LocalDynamicMetadataResolver resolver = repository.findByName(metadataProviderName);
if (resolver == null) {
return ResponseEntity.notFound().build();
} else {
resolver.setVersion(resolver.hashCode());
return ResponseEntity.ok(resolver);
}
}

@GetMapping("/{resourceId}")
@Transactional(readOnly = true)
public ResponseEntity<?> getOneByResourceId(@PathVariable String resourceId) {
LocalDynamicMetadataResolver resolver = repository.findByResourceId(resourceId);
if (resolver == null) {
return ResponseEntity.notFound().build();
} else {
resolver.setVersion(resolver.hashCode());
return ResponseEntity.ok(resolver);
}
}

@PostMapping
public ResponseEntity<?> create(@RequestBody LocalDynamicMetadataResolver resolver) {
if (repository.findByName(resolver.getName()) != null) {
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

LocalDynamicMetadataResolver persistedResolver = repository.save(resolver);
persistedResolver.setVersion(persistedResolver.hashCode());

return ResponseEntity
.created(getResourceUriFor(persistedResolver))
.body(persistedResolver);
}

@PutMapping
public ResponseEntity<?> update(@RequestBody LocalDynamicMetadataResolver resolver) {
LocalDynamicMetadataResolver existingResolver = repository.findByResourceId(resolver.getResourceId());

if (existingResolver == null) {
return ResponseEntity.notFound().build();
}

if (existingResolver.hashCode() != resolver.getVersion()) {
logger.info("Comparing: " + existingResolver.hashCode() + " with " + resolver.getVersion());
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

resolver.setAudId(existingResolver.getAudId());
//TODO: Do we need to set anything else? dates?

LocalDynamicMetadataResolver updatedResolver = repository.save(resolver);
updatedResolver.setVersion(updatedResolver.hashCode());

return ResponseEntity.ok(updatedResolver);
}

private static URI getResourceUriFor(LocalDynamicMetadataResolver resolver) {
return ServletUriComponentsBuilder
.fromCurrentServletMapping().path("/api/MetadataProvider/LocalDynamic/")
.pathSegment(resolver.getResourceId())
.build()
.toUri();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers;

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

import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.OrderColumn;
import java.util.List;

/**
* @author Bill Smith (wsmith@unicon.net)
*/
@Entity
@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
@ToString
public class DynamicHttpMetadataResolver extends MetadataResolver {

public static final String DEFAULT_TIMEOUT = "PT5S";

@Embedded
private DynamicMetadataResolverAttributes dynamicMetadataResolverAttributes;

@Embedded
private HttpMetadataResolverAttributes httpMetadataResolverAttributes;

private Integer maxConnectionsTotal = 100;

private Integer maxConnectionsPerRoute = 100;

@ElementCollection
@OrderColumn
private List<String> supportedContentTypes;

public DynamicHttpMetadataResolver() {
this.httpMetadataResolverAttributes = new HttpMetadataResolverAttributes();
this.httpMetadataResolverAttributes.setConnectionRequestTimeout(DEFAULT_TIMEOUT);
this.httpMetadataResolverAttributes.setConnectionTimeout(DEFAULT_TIMEOUT);
this.httpMetadataResolverAttributes.setSocketTimeout(DEFAULT_TIMEOUT);
this.dynamicMetadataResolverAttributes = new DynamicMetadataResolverAttributes();
}
}
Loading

0 comments on commit 92fb2fb

Please sign in to comment.