Skip to content

Commit

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

* [SHIBUI-365,SHIBUI-366,SHIBUI-383]

Approved-by: Jonathan Johnson <jj@scaldingspoon.com>
  • Loading branch information
Bill Smith authored and Jonathan Johnson committed Apr 4, 2018
1 parent de29dd8 commit a1b2724
Show file tree
Hide file tree
Showing 11 changed files with 295 additions and 35 deletions.
8 changes: 7 additions & 1 deletion backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,13 @@ dependencies {
['starter-web', 'starter-data-jpa', 'starter-security', 'starter-actuator', 'devtools'].each {
compile "org.springframework.boot:spring-boot-${it}"
}
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// TODO: figure out what this should really be
runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat'

// lucene deps
['core', 'analyzers-common', 'queryparser'].each {
compile "org.apache.lucene:lucene-${it}:${project.'lucene.version'}"
}

compile "org.liquibase:liquibase-core"
compile group: 'org.jadira.usertype', name: 'usertype.core', version: '6.0.1.GA'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,29 @@
import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService;
import edu.internet2.tier.shibboleth.admin.ui.service.EntityIdsSearchService;
import edu.internet2.tier.shibboleth.admin.ui.service.JPAEntityDescriptorServiceImpl;
import net.andreinc.mockneat.MockNeat;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class CoreShibUiConfiguration {
private static final Logger logger = LoggerFactory.getLogger(CoreShibUiConfiguration.class);

@Value("${shibui.metadata-dir:/opt/shibboleth-idp/metadata/generated}")
private String metadataDir;
Expand All @@ -30,6 +44,12 @@ public EntityDescriptorService jpaEntityDescriptorService() {
return new JPAEntityDescriptorServiceImpl(openSamlObjects());
}

@Autowired
Analyzer fullTokenAnalyzer;

@Autowired
Directory directory;


@Bean
public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(EntityDescriptorRepository entityDescriptorRepository) {
Expand All @@ -38,12 +58,20 @@ public EntityDescriptorFilesScheduledTasks entityDescriptorFilesScheduledTasks(E

@Bean
public EntityIdsSearchService entityIdsSearchService() {
//TODO: replace with real data store implementation when ready
return (term, limit) -> {
MockNeat m = MockNeat.threadLocal();
// Just simulate returning 100 results for no-limit query
List<String> simulatedEntityIds = limit > 0 ? m.urls().list(limit).val() : m.urls().list(100).val();
return new EntityIdsSearchResultRepresentation(simulatedEntityIds);
List<String> entityIds = new ArrayList<>();
try {
IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(directory));
QueryParser parser = new QueryParser("content", fullTokenAnalyzer);
TopDocs topDocs = searcher.search(parser.parse(term), limit);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document document = searcher.doc(scoreDoc.doc);
entityIds.add(document.get("id"));
}
} catch (IOException | ParseException e) {
logger.error(e.getMessage(), e);
}
return new EntityIdsSearchResultRepresentation(entityIds);
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import edu.internet2.tier.shibboleth.admin.ui.opensaml.OpenSamlObjects;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.resolver.ResolverException;
import org.apache.http.impl.client.HttpClients;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.opensaml.saml.metadata.resolver.ChainingMetadataResolver;
import org.opensaml.saml.metadata.resolver.MetadataResolver;
import org.opensaml.saml.metadata.resolver.impl.FileBackedHTTPMetadataResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

/**
* this is a temporary class until a better way of doing this is found.
*/
@Configuration
public class MetadataResolverConfiguration {
private static final Logger logger = LoggerFactory.getLogger(MetadataResolverConfiguration.class);

@Autowired
OpenSamlObjects openSamlObjects;

@Autowired
IndexWriter indexWriter;

@Bean
public MetadataResolver metadataResolver() throws ResolverException, ComponentInitializationException {
MetadataResolver metadataResolver = new ChainingMetadataResolver();

FileBackedHTTPMetadataResolver incommonMR = new FileBackedHTTPMetadataResolver(HttpClients.createMinimal(), "http://md.incommon.org/InCommon/InCommon-metadata.xml", "/tmp/incommon.xml"){
@Override
protected void initMetadataResolver() throws ComponentInitializationException {
super.initMetadataResolver();

for (String entityId: this.getBackingStore().getIndexedDescriptors().keySet()) {
Document document = new Document();
document.add(new StringField("id", entityId, Field.Store.YES));
document.add(new TextField("content", entityId, Field.Store.YES)); // TODO: change entityId to be content of entity descriptor block
try {
indexWriter.addDocument(document);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
try {
indexWriter.commit();
} catch (IOException e) {
throw new ComponentInitializationException(e);
}
}
};
incommonMR.setId("incommonmd");
incommonMR.setParserPool(openSamlObjects.getParserPool());
incommonMR.initialize();

return metadataResolver;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package edu.internet2.tier.shibboleth.admin.ui.configuration;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.LowerCaseFilter;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.ngram.NGramTokenFilter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.standard.StandardTokenizer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class SearchConfiguration {
@Bean
Directory directory() {
return new RAMDirectory();
}

@Bean
Analyzer analyzer() {
return new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
final StandardTokenizer src = new StandardTokenizer();
src.setMaxTokenLength(255);
TokenFilter tokenFilter;
tokenFilter = new NGramTokenFilter(src, 3, 10);
tokenFilter = new LowerCaseFilter(tokenFilter);
tokenFilter = new StopFilter(tokenFilter, StandardAnalyzer.STOP_WORDS_SET);
return new TokenStreamComponents(src, tokenFilter);
}
};
}

@Bean
Analyzer fullTokenAnalyzer() {
return new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
final StandardTokenizer src = new StandardTokenizer();
src.setMaxTokenLength(255);
TokenFilter tokenFilter;
tokenFilter = new LowerCaseFilter(src);
tokenFilter = new StopFilter(tokenFilter, StandardAnalyzer.STOP_WORDS_SET);
return new TokenStreamComponents(src, tokenFilter);
}
};
}

@Bean
IndexWriter indexWriter() throws IOException {
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer());
indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
return new IndexWriter(directory(), indexWriterConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public EntityIdsSearchController(EntityIdsSearchService entityIdsSearchService)
@GetMapping
ResponseEntity<?> search(@RequestParam String term, @RequestParam(required = false) Integer limit) {
//Zero indicates no-limit
final int resultLimit = (limit != null ? limit : 0);
final int resultLimit = (limit != null ? limit : 10);
return ResponseEntity.ok(this.entityIdsSearchService.findBySearchTermAndOptionalLimit(term, resultLimit));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;


Expand All @@ -14,28 +15,28 @@ public class AttributeAuthorityDescriptor extends RoleDescriptor implements org.

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "attribauthdesc_attribserv_id")
private List<AttributeService> attributeServices;
private List<AttributeService> attributeServices = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "attribauthdesc_assertidreqservc_id")
private List<AssertionIDRequestService> assertionIDRequestServices;
private List<AssertionIDRequestService> assertionIDRequestServices = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "attribauthdesc_nameidfrmt_id")
private List<NameIDFormat> nameIDFormats;
private List<NameIDFormat> nameIDFormats = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "attribauthdesc_attribprofile_id")
private List<AttributeProfile> attributeProfiles;
private List<AttributeProfile> attributeProfiles = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "attribauthdesc_attrib_id")
private List<Attribute> attributes;
private List<Attribute> attributes = new ArrayList<>();


@Override
public List<org.opensaml.saml.saml2.metadata.AttributeService> getAttributeServices() {
return Lists.newArrayList(attributeServices);
return (List<org.opensaml.saml.saml2.metadata.AttributeService>)(List<? extends org.opensaml.saml.saml2.metadata.AttributeService>)attributeServices;
}

public void setAttributeServices(List<AttributeService> attributeServices) {
Expand All @@ -44,7 +45,7 @@ public void setAttributeServices(List<AttributeService> attributeServices) {

@Override
public List<org.opensaml.saml.saml2.metadata.AssertionIDRequestService> getAssertionIDRequestServices() {
return Lists.newArrayList(assertionIDRequestServices);
return (List<org.opensaml.saml.saml2.metadata.AssertionIDRequestService>)(List<? extends org.opensaml.saml.saml2.metadata.AssertionIDRequestService>)assertionIDRequestServices;
}

public void setAssertionIDRequestServices(List<AssertionIDRequestService> assertionIDRequestServices) {
Expand All @@ -53,7 +54,7 @@ public void setAssertionIDRequestServices(List<AssertionIDRequestService> assert

@Override
public List<org.opensaml.saml.saml2.metadata.NameIDFormat> getNameIDFormats() {
return Lists.newArrayList(nameIDFormats);
return (List<org.opensaml.saml.saml2.metadata.NameIDFormat>)(List<? extends org.opensaml.saml.saml2.metadata.NameIDFormat>)nameIDFormats;
}

public void setNameIDFormats(List<NameIDFormat> nameIDFormats) {
Expand All @@ -62,7 +63,7 @@ public void setNameIDFormats(List<NameIDFormat> nameIDFormats) {

@Override
public List<org.opensaml.saml.saml2.metadata.AttributeProfile> getAttributeProfiles() {
return Lists.newArrayList(attributeProfiles);
return (List<org.opensaml.saml.saml2.metadata.AttributeProfile>)(List<? extends org.opensaml.saml.saml2.metadata.AttributeProfile>)attributeProfiles;
}

public void setAttributeProfiles(List<AttributeProfile> attributeProfiles) {
Expand All @@ -71,7 +72,7 @@ public void setAttributeProfiles(List<AttributeProfile> attributeProfiles) {

@Override
public List<org.opensaml.saml.saml2.core.Attribute> getAttributes() {
return Lists.newArrayList(attributes);
return (List<org.opensaml.saml.saml2.core.Attribute>)(List<? extends org.opensaml.saml.saml2.core.Attribute>)attributes;
}

public void setAttributes(List<Attribute> attributes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;


Expand All @@ -17,23 +18,23 @@ public class IDPSSODescriptor extends SSODescriptor implements org.opensaml.saml

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idpssodesc_ssoserv_id")
private List<SingleSignOnService> singleSignOnServices;
private List<SingleSignOnService> singleSignOnServices = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idpssodesc_nameidmapserv_id")
private List<NameIDMappingService> nameIDMappingServices;
private List<NameIDMappingService> nameIDMappingServices = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idpssodesc_asseridreqserv_id")
private List<AssertionIDRequestService> assertionIDRequestServices;
private List<AssertionIDRequestService> assertionIDRequestServices = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idpssodesc_attribprofile_id")
private List<AttributeProfile> attributeProfiles;
private List<AttributeProfile> attributeProfiles = new ArrayList<>();

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "idpssodesc_attrib_id")
private List<Attribute> attributes;
private List<Attribute> attributes = new ArrayList<>();

@Override
public Boolean getWantAuthnRequestsSigned() {
Expand All @@ -57,7 +58,7 @@ public void setWantAuthnRequestsSigned(XSBooleanValue xsBooleanValue) {

@Override
public List<org.opensaml.saml.saml2.metadata.SingleSignOnService> getSingleSignOnServices() {
return Lists.newArrayList(singleSignOnServices);
return (List<org.opensaml.saml.saml2.metadata.SingleSignOnService>)(List<? extends org.opensaml.saml.saml2.metadata.SingleSignOnService>)singleSignOnServices;
}

public void setSingleSignOnServices(List<SingleSignOnService> singleSignOnServices) {
Expand All @@ -66,7 +67,7 @@ public void setSingleSignOnServices(List<SingleSignOnService> singleSignOnServic

@Override
public List<org.opensaml.saml.saml2.metadata.NameIDMappingService> getNameIDMappingServices() {
return Lists.newArrayList(nameIDMappingServices);
return (List<org.opensaml.saml.saml2.metadata.NameIDMappingService>)(List<? extends org.opensaml.saml.saml2.metadata.NameIDMappingService>)nameIDMappingServices;
}

public void setNameIDMappingServices(List<NameIDMappingService> nameIDMappingServices) {
Expand All @@ -75,7 +76,7 @@ public void setNameIDMappingServices(List<NameIDMappingService> nameIDMappingSer

@Override
public List<org.opensaml.saml.saml2.metadata.AssertionIDRequestService> getAssertionIDRequestServices() {
return Lists.newArrayList(assertionIDRequestServices);
return (List<org.opensaml.saml.saml2.metadata.AssertionIDRequestService>)(List<? extends org.opensaml.saml.saml2.metadata.AssertionIDRequestService>)assertionIDRequestServices;
}

public void setAssertionIDRequestServices(List<AssertionIDRequestService> assertionIDRequestServices) {
Expand All @@ -84,7 +85,7 @@ public void setAssertionIDRequestServices(List<AssertionIDRequestService> assert

@Override
public List<org.opensaml.saml.saml2.metadata.AttributeProfile> getAttributeProfiles() {
return Lists.newArrayList(attributeProfiles);
return (List<org.opensaml.saml.saml2.metadata.AttributeProfile>)(List<? extends org.opensaml.saml.saml2.metadata.AttributeProfile>)attributeProfiles;
}

public void setAttributeProfiles(List<AttributeProfile> attributeProfiles) {
Expand All @@ -93,7 +94,7 @@ public void setAttributeProfiles(List<AttributeProfile> attributeProfiles) {

@Override
public List<org.opensaml.saml.saml2.core.Attribute> getAttributes() {
return Lists.newArrayList(attributes);
return (List<org.opensaml.saml.saml2.core.Attribute>)(List<? extends org.opensaml.saml.saml2.core.Attribute>)attributes;
}

public void setAttributes(List<Attribute> attributes) {
Expand Down
Loading

0 comments on commit a1b2724

Please sign in to comment.