From b517c3ca02a4c09a64767b4d9ae84febc6ccebc9 Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Fri, 1 Oct 2021 16:30:49 +0200 Subject: [PATCH 1/6] filter password query parameter in access log --- .../FilteredSlf4jRequestLogWriter.java | 29 +++++++++++++++++++ .../whois/api/httpserver/JettyBootstrap.java | 2 +- .../log/JettyRequestLogTestIntegration.java | 13 +++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java new file mode 100644 index 0000000000..1c3dbc34d9 --- /dev/null +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java @@ -0,0 +1,29 @@ +package net.ripe.db.whois.api.httpserver; + +import org.eclipse.jetty.server.Slf4jRequestLogWriter; + +import java.io.IOException; + +public class FilteredSlf4jRequestLogWriter extends Slf4jRequestLogWriter { + private final String keyToFilter; + + public FilteredSlf4jRequestLogWriter(String keyToFilter) { + this.keyToFilter = keyToFilter; + } + + @Override + public void write(String requestEntry) throws IOException { + String regexString; + + if (keyToFilter != null && keyToFilter.equalsIgnoreCase("apikey")) { + // Replace with "FILTERED" but leave the last 3 characters if its API keys + regexString = "(?<=(?i)(key=))(.+?(?=\\S{3}\\s))".replace("key", keyToFilter); + } else { + regexString = "(?<=(?i)(key=))(\\S*)".replace("key", keyToFilter); + } + + String filtered = requestEntry.replaceAll(regexString, "FILTERED"); + super.write(filtered); + } + +} diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java index 6553f5f2e1..1101a37027 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/JettyBootstrap.java @@ -216,6 +216,6 @@ public void stop(final boolean force) { // Log requests to org.eclipse.jetty.server.RequestLog private RequestLog createRequestLog() { - return new CustomRequestLog(new Slf4jRequestLogWriter(), EXTENDED_RIPE_LOG_FORMAT); + return new CustomRequestLog(new FilteredSlf4jRequestLogWriter("password"), EXTENDED_RIPE_LOG_FORMAT); } } diff --git a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java index 100dc9985b..b078c76c56 100644 --- a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java +++ b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.nio.file.Files; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -92,6 +93,18 @@ public void log_request_x_forwarded_for() throws Exception { } + @Test + public void password_filtered() throws Exception { + RestTest.target(getPort(), "whois/test/person/TP1-TEST?password=some-api_key-123") + .request() + .get(WhoisResources.class); + + + String actual = fileToString(getRequestLogFilename()); + assertThat(actual, containsString("password=FILTERED")); + assertThat(actual, not(containsString("some-api_key-123"))); + } + // helper methods private static void cleanupRequestLogDirectory() throws IOException { From 00a10a8a686b774fd519091f11162ba0d6c8821f Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Sat, 2 Oct 2021 06:22:16 +0200 Subject: [PATCH 2/6] compile the regex --- .../httpserver/FilteredSlf4jRequestLogWriter.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java index 1c3dbc34d9..606e1be687 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java @@ -3,9 +3,13 @@ import org.eclipse.jetty.server.Slf4jRequestLogWriter; import java.io.IOException; +import java.util.regex.Pattern; public class FilteredSlf4jRequestLogWriter extends Slf4jRequestLogWriter { private final String keyToFilter; + // Replace value passed to apikey with "FILTERED" but leave the last 3 characters if its API keys + private static final Pattern ApiKeyPattern = Pattern.compile("(?<=(?i)(apikey=))(.+?(?=\\\\S{3}\\\\s))"); + private static final Pattern PasswordPattern = Pattern.compile("(?<=(?i)(password=))(\\S*)"); public FilteredSlf4jRequestLogWriter(String keyToFilter) { this.keyToFilter = keyToFilter; @@ -13,16 +17,14 @@ public FilteredSlf4jRequestLogWriter(String keyToFilter) { @Override public void write(String requestEntry) throws IOException { - String regexString; + String filtered; if (keyToFilter != null && keyToFilter.equalsIgnoreCase("apikey")) { - // Replace with "FILTERED" but leave the last 3 characters if its API keys - regexString = "(?<=(?i)(key=))(.+?(?=\\S{3}\\s))".replace("key", keyToFilter); + filtered = ApiKeyPattern.matcher(requestEntry).replaceAll("FILTERED"); } else { - regexString = "(?<=(?i)(key=))(\\S*)".replace("key", keyToFilter); + filtered = PasswordPattern.matcher(requestEntry).replaceAll("FILTERED"); } - String filtered = requestEntry.replaceAll(regexString, "FILTERED"); super.write(filtered); } From d01372de7fe8ddc4f733d0c000e4e073fe80664e Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Wed, 6 Oct 2021 14:07:43 +0200 Subject: [PATCH 3/6] Added more test cases --- .../log/JettyRequestLogTestIntegration.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java index b078c76c56..4fc9587e25 100644 --- a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java +++ b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java @@ -105,6 +105,31 @@ public void password_filtered() throws Exception { assertThat(actual, not(containsString("some-api_key-123"))); } + @Test + public void multiple_password_filtered() throws Exception { + RestTest.target(getPort(), "whois/test/person/TP1-TEST?password=pass1&password=pass2") + .request() + .get(WhoisResources.class); + + + String actual = fileToString(getRequestLogFilename()); + assertThat(actual, containsString("password=FILTERED")); + assertThat(actual, not(containsString("pass1"))); + assertThat(actual, not(containsString("pass2"))); + } + + @Test + public void password_filtered_case_insensitive() throws Exception { + RestTest.target(getPort(), "whois/test/person/TP1-TEST?PassWord=pass1") + .request() + .get(WhoisResources.class); + + + String actual = fileToString(getRequestLogFilename()); + assertThat(actual.toLowerCase(), containsString("password=FILTERED".toLowerCase())); + assertThat(actual, not(containsString("pass1"))); + } + // helper methods private static void cleanupRequestLogDirectory() throws IOException { From a1380c96251cd21be99760f7ab51729258eb85ac Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Tue, 19 Oct 2021 13:19:21 +0200 Subject: [PATCH 4/6] should replace password no matter the occurance --- .../api/fulltextsearch/FullTextIndex.java | 13 ++++++++ .../api/fulltextsearch/FullTextSearch.java | 6 ++-- .../api/fulltextsearch/IndexTemplate.java | 3 -- .../FilteredSlf4jRequestLogWriter.java | 2 +- .../log/JettyRequestLogTestIntegration.java | 30 +++++++++++++++++-- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java index c103ca7403..49a56a99ca 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java @@ -71,6 +71,7 @@ public class FullTextIndex extends RebuildableIndex { public static final Analyzer INDEX_ANALYZER = new FullTextAnalyzer(FullTextAnalyzer.Operation.INDEX); static final String[] FIELD_NAMES; + static final String[] SEARCH_FIELD_NAMES; private static final Set SKIPPED_ATTRIBUTES = Sets.newEnumSet(Sets.newHashSet(AttributeType.CERTIF, AttributeType.CHANGED, AttributeType.SOURCE), AttributeType.class); private static final Set FILTERED_ATTRIBUTES = Sets.newEnumSet(Sets.newHashSet(AttributeType.AUTH), AttributeType.class); @@ -91,6 +92,18 @@ public class FullTextIndex extends RebuildableIndex { FIELD_NAMES = names.toArray(new String[names.size()]); + SEARCH_FIELD_NAMES = new String[]{ + AttributeType.INETNUM.getName(), + AttributeType.INET6NUM.getName(), + AttributeType.DOMAIN.getName(), + AttributeType.ROUTE.getName(), + AttributeType.ROUTE6.getName(), + AttributeType.ORGANISATION.getName(), + AttributeType.PERSON.getName(), + AttributeType.ROLE.getName(), + AttributeType.MNTNER.getName(), + }; + OBJECT_TYPE_FIELD_TYPE = new FieldType(); OBJECT_TYPE_FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); OBJECT_TYPE_FIELD_TYPE.setDocValuesType(DocValuesType.SORTED); diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java index 7138c2b2e4..e5459b6812 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java @@ -109,6 +109,7 @@ public Response search( @QueryParam("hl.simple.post") @DefaultValue("") final String highlightPost, @QueryParam("wt") @DefaultValue("xml") final String writerType, @QueryParam("facet") @DefaultValue("false") final String facet, + @QueryParam("autocomplete") @DefaultValue("no") final Boolean autocomplete, @Context final HttpServletRequest request) { try { return ok(search( @@ -154,7 +155,7 @@ public SearchResponse search(final SearchRequest searchRequest, final HttpServle throw new IllegalArgumentException("Too many rows"); } - final QueryParser queryParser = new MultiFieldQueryParser(FullTextIndex.FIELD_NAMES, FullTextIndex.QUERY_ANALYZER); + final QueryParser queryParser = new MultiFieldQueryParser(FullTextIndex.SEARCH_FIELD_NAMES, FullTextIndex.QUERY_ANALYZER); queryParser.setDefaultOperator(org.apache.lucene.queryparser.classic.QueryParser.Operator.AND); final Query query; @@ -165,8 +166,7 @@ public SearchResponse search(final SearchRequest searchRequest, final HttpServle } try { - return fullTextIndex.search( - new IndexTemplate.AccountingSearchCallback(accessControlListManager, request.getRemoteAddr(), source) { + return fullTextIndex.search(new IndexTemplate.AccountingSearchCallback(accessControlListManager, request.getRemoteAddr(), source) { @Override protected SearchResponse doSearch(final IndexReader indexReader, final TaxonomyReader taxonomyReader, final IndexSearcher indexSearcher) throws IOException { diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java index 782b4f79f7..16fd8c4711 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java @@ -1,11 +1,8 @@ package net.ripe.db.whois.api.fulltextsearch; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.net.InetAddresses; -import net.ripe.db.whois.common.rpsl.AttributeType; import net.ripe.db.whois.common.rpsl.ObjectType; -import net.ripe.db.whois.common.rpsl.RpslAttribute; import net.ripe.db.whois.common.rpsl.RpslObject; import net.ripe.db.whois.common.source.Source; import net.ripe.db.whois.query.QueryMessages; diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java index 606e1be687..29fed2e5e9 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java @@ -9,7 +9,7 @@ public class FilteredSlf4jRequestLogWriter extends Slf4jRequestLogWriter { private final String keyToFilter; // Replace value passed to apikey with "FILTERED" but leave the last 3 characters if its API keys private static final Pattern ApiKeyPattern = Pattern.compile("(?<=(?i)(apikey=))(.+?(?=\\\\S{3}\\\\s))"); - private static final Pattern PasswordPattern = Pattern.compile("(?<=(?i)(password=))(\\S*)"); + private static final Pattern PasswordPattern = Pattern.compile("(?<=(?i)(password=))([^&]*)"); public FilteredSlf4jRequestLogWriter(String keyToFilter) { this.keyToFilter = keyToFilter; diff --git a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java index 4fc9587e25..06c75942be 100644 --- a/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java +++ b/whois-api/src/test/java/net/ripe/db/whois/api/log/JettyRequestLogTestIntegration.java @@ -101,7 +101,7 @@ public void password_filtered() throws Exception { String actual = fileToString(getRequestLogFilename()); - assertThat(actual, containsString("password=FILTERED")); + assertThat(actual, containsString("GET /whois/test/person/TP1-TEST?password=FILTERED")); assertThat(actual, not(containsString("some-api_key-123"))); } @@ -113,11 +113,37 @@ public void multiple_password_filtered() throws Exception { String actual = fileToString(getRequestLogFilename()); - assertThat(actual, containsString("password=FILTERED")); + assertThat(actual, containsString("GET /whois/test/person/TP1-TEST?password=FILTERED&password=FILTERED")); assertThat(actual, not(containsString("pass1"))); assertThat(actual, not(containsString("pass2"))); } + @Test + public void multiple_query_password_filtered() throws Exception { + RestTest.target(getPort(), "whois/test/person/TP1-TEST?password=pass1&key=value") + .request() + .get(WhoisResources.class); + + + String actual = fileToString(getRequestLogFilename()); + assertThat(actual, containsString("GET /whois/test/person/TP1-TEST?password=FILTERED&key=value")); + assertThat(actual, containsString("key=value")); + assertThat(actual, not(containsString("pass1"))); + } + + @Test + public void multiple_query_password_last_filtered() throws Exception { + RestTest.target(getPort(), "whois/test/person/TP1-TEST?key=value&password=pass1") + .request() + .get(WhoisResources.class); + + + String actual = fileToString(getRequestLogFilename()); + assertThat(actual, containsString("GET /whois/test/person/TP1-TEST?key=value&password=FILTERED")); + assertThat(actual, containsString("key=value")); + assertThat(actual, not(containsString("pass1"))); + } + @Test public void password_filtered_case_insensitive() throws Exception { RestTest.target(getPort(), "whois/test/person/TP1-TEST?PassWord=pass1") From f0aa48549d8d75ceee36ba92ea57c8309e279db5 Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Tue, 19 Oct 2021 15:20:58 +0200 Subject: [PATCH 5/6] should filter apikey no matter the occurance in the url string --- .../db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java index 29fed2e5e9..a86d03d680 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/httpserver/FilteredSlf4jRequestLogWriter.java @@ -8,7 +8,7 @@ public class FilteredSlf4jRequestLogWriter extends Slf4jRequestLogWriter { private final String keyToFilter; // Replace value passed to apikey with "FILTERED" but leave the last 3 characters if its API keys - private static final Pattern ApiKeyPattern = Pattern.compile("(?<=(?i)(apikey=))(.+?(?=\\\\S{3}\\\\s))"); + private static final Pattern ApiKeyPattern = Pattern.compile("(?<=(?i)(apikey=))(.+?(?=\\S{3}[&|\\s]))"); private static final Pattern PasswordPattern = Pattern.compile("(?<=(?i)(password=))([^&]*)"); public FilteredSlf4jRequestLogWriter(String keyToFilter) { @@ -27,5 +27,4 @@ public void write(String requestEntry) throws IOException { super.write(filtered); } - } From f6ba0de4df10bc798ece090f08b6cc3f2cd3760b Mon Sep 17 00:00:00 2001 From: Dadepo Aderemi Date: Tue, 19 Oct 2021 16:46:07 +0200 Subject: [PATCH 6/6] undo unintentional commits --- .../db/whois/api/fulltextsearch/FullTextIndex.java | 13 ------------- .../db/whois/api/fulltextsearch/FullTextSearch.java | 6 +++--- .../db/whois/api/fulltextsearch/IndexTemplate.java | 3 +++ 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java index 49a56a99ca..c103ca7403 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextIndex.java @@ -71,7 +71,6 @@ public class FullTextIndex extends RebuildableIndex { public static final Analyzer INDEX_ANALYZER = new FullTextAnalyzer(FullTextAnalyzer.Operation.INDEX); static final String[] FIELD_NAMES; - static final String[] SEARCH_FIELD_NAMES; private static final Set SKIPPED_ATTRIBUTES = Sets.newEnumSet(Sets.newHashSet(AttributeType.CERTIF, AttributeType.CHANGED, AttributeType.SOURCE), AttributeType.class); private static final Set FILTERED_ATTRIBUTES = Sets.newEnumSet(Sets.newHashSet(AttributeType.AUTH), AttributeType.class); @@ -92,18 +91,6 @@ public class FullTextIndex extends RebuildableIndex { FIELD_NAMES = names.toArray(new String[names.size()]); - SEARCH_FIELD_NAMES = new String[]{ - AttributeType.INETNUM.getName(), - AttributeType.INET6NUM.getName(), - AttributeType.DOMAIN.getName(), - AttributeType.ROUTE.getName(), - AttributeType.ROUTE6.getName(), - AttributeType.ORGANISATION.getName(), - AttributeType.PERSON.getName(), - AttributeType.ROLE.getName(), - AttributeType.MNTNER.getName(), - }; - OBJECT_TYPE_FIELD_TYPE = new FieldType(); OBJECT_TYPE_FIELD_TYPE.setIndexOptions(IndexOptions.DOCS); OBJECT_TYPE_FIELD_TYPE.setDocValuesType(DocValuesType.SORTED); diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java index e5459b6812..7138c2b2e4 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/FullTextSearch.java @@ -109,7 +109,6 @@ public Response search( @QueryParam("hl.simple.post") @DefaultValue("") final String highlightPost, @QueryParam("wt") @DefaultValue("xml") final String writerType, @QueryParam("facet") @DefaultValue("false") final String facet, - @QueryParam("autocomplete") @DefaultValue("no") final Boolean autocomplete, @Context final HttpServletRequest request) { try { return ok(search( @@ -155,7 +154,7 @@ public SearchResponse search(final SearchRequest searchRequest, final HttpServle throw new IllegalArgumentException("Too many rows"); } - final QueryParser queryParser = new MultiFieldQueryParser(FullTextIndex.SEARCH_FIELD_NAMES, FullTextIndex.QUERY_ANALYZER); + final QueryParser queryParser = new MultiFieldQueryParser(FullTextIndex.FIELD_NAMES, FullTextIndex.QUERY_ANALYZER); queryParser.setDefaultOperator(org.apache.lucene.queryparser.classic.QueryParser.Operator.AND); final Query query; @@ -166,7 +165,8 @@ public SearchResponse search(final SearchRequest searchRequest, final HttpServle } try { - return fullTextIndex.search(new IndexTemplate.AccountingSearchCallback(accessControlListManager, request.getRemoteAddr(), source) { + return fullTextIndex.search( + new IndexTemplate.AccountingSearchCallback(accessControlListManager, request.getRemoteAddr(), source) { @Override protected SearchResponse doSearch(final IndexReader indexReader, final TaxonomyReader taxonomyReader, final IndexSearcher indexSearcher) throws IOException { diff --git a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java index 16fd8c4711..782b4f79f7 100644 --- a/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java +++ b/whois-api/src/main/java/net/ripe/db/whois/api/fulltextsearch/IndexTemplate.java @@ -1,8 +1,11 @@ package net.ripe.db.whois.api.fulltextsearch; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.net.InetAddresses; +import net.ripe.db.whois.common.rpsl.AttributeType; import net.ripe.db.whois.common.rpsl.ObjectType; +import net.ripe.db.whois.common.rpsl.RpslAttribute; import net.ripe.db.whois.common.rpsl.RpslObject; import net.ripe.db.whois.common.source.Source; import net.ripe.db.whois.query.QueryMessages;