Re-establish singleton setup with configuration
git-svn-id: https://svn.apache.org/repos/asf/manifoldcf/integration/elasticsearch-1.5/trunk@1688322 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerRestSearchAction.java b/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerRestSearchAction.java
index cd39eb5..138c1d6 100644
--- a/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerRestSearchAction.java
+++ b/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerRestSearchAction.java
@@ -26,6 +26,34 @@
import org.elasticsearch.rest.action.search.RestSearchAction;
import org.elasticsearch.rest.action.support.RestStatusToXContentListener;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.elasticsearch.ElasticsearchIllegalArgumentException;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.support.IndicesOptions;
+import org.elasticsearch.common.Strings;
+import org.elasticsearch.common.logging.ESLogger;
+import org.elasticsearch.common.logging.Loggers;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.index.query.*;
+import org.elasticsearch.rest.RestRequest;
+import org.elasticsearch.rest.action.search.RestSearchAction;
+import org.elasticsearch.rest.action.support.RestActions;
+import org.elasticsearch.search.Scroll;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.elasticsearch.search.fetch.source.FetchSourceContext;
+import org.elasticsearch.search.sort.SortOrder;
+import org.elasticsearch.search.suggest.SuggestBuilders;
+import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
+
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/*
New parseSearchRequestMCF function added in utils to parse RestRequest.
There are also problems with security using JavaSearchAPI, because it doesn't implements setParam function
@@ -38,15 +66,300 @@
public class MCFAuthorizerRestSearchAction extends RestSearchAction {
+ protected final MCFAuthorizer authorizer;
+
@Inject
public MCFAuthorizerRestSearchAction(Settings settings, final RestController restController, Client client) {
super(settings,restController,client);
+ // Set up MCFConfigurationParameters instance from settings
+ final MCFConfigurationParameters conf = new MCFConfigurationParameters();
+ // MHL
+ authorizer = new MCFAuthorizer(conf);
}
@Override
public void handleRequest(RestRequest request, RestChannel channel, Client client) {
- SearchRequest searchRequest = MCFAuthorizerUtils.parseSearchRequestMCF(request);
+ SearchRequest searchRequest = parseSearchRequestMCF(request);
searchRequest.listenerThreaded(false);
client.search(searchRequest, new RestStatusToXContentListener(channel));
}
+
+ protected SearchRequest parseSearchRequestMCF(final RestRequest request) throws MCFAuthorizerException {
+ SearchRequest searchRequest;
+ //if(usernameAndDomain[0]==null) throw new MCFAuthorizerException("Username not passed.");
+ if(request.param("u")!=null) {
+ String[] authenticatedUserNamesAndDomains = request.param("u").split(",");
+ String[] indices = Strings.splitStringByCommaToArray(request.param("index"));
+ searchRequest = new SearchRequest(indices);
+ boolean isTemplateRequest = request.path().endsWith("/template");
+
+ if(request.hasContent() || request.hasParam("source")) {
+ FilterBuilder authorizationFilter = authorizer.buildAuthorizationFilter(authenticatedUserNamesAndDomains);
+ FilteredQueryBuilder filteredQueryBuilder;
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ ObjectNode modifiedJSON, innerJSON;
+ JsonNode requestJSON;
+
+ try {
+ requestJSON = objectMapper.readTree(RestActions.getRestContent(request).toBytes());
+ if (isTemplateRequest) {
+ modifiedJSON = (ObjectNode) requestJSON;
+ innerJSON = (ObjectNode)requestJSON.findValue("template");
+ filteredQueryBuilder = QueryBuilders.filteredQuery(QueryBuilders.wrapperQuery(innerJSON.findValue("query").toString()), authorizationFilter);
+ modifiedJSON.replace("template",innerJSON.set("query", objectMapper.readTree(filteredQueryBuilder.buildAsBytes().toBytes())));
+ searchRequest.templateSource(modifiedJSON.toString());
+ } else {
+ filteredQueryBuilder = QueryBuilders.filteredQuery(QueryBuilders.wrapperQuery(requestJSON.findValue("query").toString()), authorizationFilter);
+ modifiedJSON = (ObjectNode) requestJSON;
+ modifiedJSON.set("query", objectMapper.readTree(filteredQueryBuilder.buildAsBytes().toBytes()));
+ searchRequest.source(modifiedJSON.toString());
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new MCFAuthorizerException("JSON parser error");
+ }
+ }
+
+ searchRequest.extraSource(parseSearchSourceMCF(request));
+ searchRequest.searchType(request.param("search_type"));
+ searchRequest.queryCache(request.paramAsBoolean("query_cache", (Boolean)null));
+ String scroll = request.param("scroll");
+ if(scroll != null) {
+ searchRequest.scroll(new Scroll(TimeValue.parseTimeValue(scroll, (TimeValue)null)));
+ }
+
+ searchRequest.types(Strings.splitStringByCommaToArray(request.param("type")));
+ searchRequest.routing(request.param("routing"));
+ searchRequest.preference(request.param("preference"));
+ searchRequest.indicesOptions(IndicesOptions.fromRequest(request, searchRequest.indicesOptions()));
+ }
+ else {
+ searchRequest = RestSearchAction.parseSearchRequest(request);
+ }
+ return searchRequest;
+ }
+
+ protected SearchSourceBuilder parseSearchSourceMCF(final RestRequest request) throws MCFAuthorizerException {
+ SearchSourceBuilder searchSourceBuilder = null;
+ String queryString = request.param("q");
+ if(queryString != null) {
+ String[] authenticatedUserNamesAndDomains = request.param("u").split(",");
+ FilterBuilder authorizationFilter = authorizer.buildAuthorizationFilter(authenticatedUserNamesAndDomains);
+ QueryStringQueryBuilder from = QueryBuilders.queryStringQuery(queryString);
+ from.defaultField(request.param("df"));
+ from.analyzer(request.param("analyzer"));
+ from.analyzeWildcard(request.paramAsBoolean("analyze_wildcard", false));
+ from.lowercaseExpandedTerms(request.paramAsBoolean("lowercase_expanded_terms", true));
+ from.lenient(request.paramAsBoolean("lenient", (Boolean)null));
+ String size = request.param("default_operator");
+ if(size != null) {
+ if("OR".equals(size)) {
+ from.defaultOperator(QueryStringQueryBuilder.Operator.OR);
+ } else {
+ if(!"AND".equals(size)) {
+ throw new ElasticsearchIllegalArgumentException("Unsupported defaultOperator [" + size + "], can either be [OR] or [AND]");
+ }
+
+ from.defaultOperator(QueryStringQueryBuilder.Operator.AND);
+ }
+ }
+
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.query(QueryBuilders.filteredQuery(from, authorizationFilter));
+ }
+ else {
+ if(!(request.hasContent() || request.hasParam("source"))){
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+ FilterBuilder authorizationFilter = authorizer.buildAuthorizationFilter(request.param("u"));
+ searchSourceBuilder.query(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),authorizationFilter));
+ }
+ }
+
+ int var19 = request.paramAsInt("from", -1);
+ if(var19 != -1) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.from(var19);
+ }
+
+ int var20 = request.paramAsInt("size", -1);
+ if(var20 != -1) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.size(var20);
+ }
+
+ if(request.hasParam("explain")) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.explain(request.paramAsBoolean("explain", (Boolean)null));
+ }
+
+ if(request.hasParam("version")) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.version(request.paramAsBoolean("version", (Boolean)null));
+ }
+
+ if(request.hasParam("timeout")) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.timeout(request.paramAsTime("timeout", (TimeValue)null));
+ }
+
+ if(request.hasParam("terminate_after")) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ int sField = request.paramAsInt("terminate_after", 0);
+ if(sField < 0) {
+ throw new ElasticsearchIllegalArgumentException("terminateAfter must be > 0");
+ }
+
+ if(sField > 0) {
+ searchSourceBuilder.terminateAfter(sField);
+ }
+ }
+
+ String var21 = request.param("fields");
+ String suggestField;
+ if(var21 != null) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ if(!Strings.hasText(var21)) {
+ searchSourceBuilder.noFields();
+ } else {
+ String[] fetchSourceContext = Strings.splitStringByCommaToArray(var21);
+ if(fetchSourceContext != null) {
+ String[] sSorts = fetchSourceContext;
+ int sIndicesBoost = fetchSourceContext.length;
+
+ for(int sStats = 0; sStats < sIndicesBoost; ++sStats) {
+ suggestField = sSorts[sStats];
+ searchSourceBuilder.field(suggestField);
+ }
+ }
+ }
+ }
+
+ FetchSourceContext var22 = FetchSourceContext.parseFromRestRequest(request);
+ if(var22 != null) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.fetchSource(var22);
+ }
+
+ if(request.hasParam("track_scores")) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.trackScores(request.paramAsBoolean("track_scores", false));
+ }
+
+ String var23 = request.param("sort");
+ int suggestText;
+ String indexName;
+ String[] var26;
+ if(var23 != null) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ String[] var24 = Strings.splitStringByCommaToArray(var23);
+ var26 = var24;
+ int var27 = var24.length;
+
+ for(suggestText = 0; suggestText < var27; ++suggestText) {
+ String suggestSize = var26[suggestText];
+ int suggestMode = suggestSize.lastIndexOf(":");
+ if(suggestMode != -1) {
+ String divisor = suggestSize.substring(0, suggestMode);
+ indexName = suggestSize.substring(suggestMode + 1);
+ if("asc".equals(indexName)) {
+ searchSourceBuilder.sort(divisor, SortOrder.ASC);
+ } else if("desc".equals(indexName)) {
+ searchSourceBuilder.sort(divisor, SortOrder.DESC);
+ }
+ } else {
+ searchSourceBuilder.sort(suggestSize);
+ }
+ }
+ }
+
+ String var25 = request.param("indices_boost");
+ int var31;
+ String var32;
+ if(var25 != null) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ var26 = Strings.splitStringByCommaToArray(var25);
+ String[] var29 = var26;
+ suggestText = var26.length;
+
+ for(var31 = 0; var31 < suggestText; ++var31) {
+ var32 = var29[var31];
+ int var33 = var32.indexOf(44);
+ if(var33 == -1) {
+ throw new ElasticsearchIllegalArgumentException("Illegal index boost [" + var32 + "], no \',\'");
+ }
+
+ indexName = var32.substring(0, var33);
+ String sBoost = var32.substring(var33 + 1);
+
+ try {
+ searchSourceBuilder.indexBoost(indexName, Float.parseFloat(sBoost));
+ } catch (NumberFormatException var18) {
+ throw new ElasticsearchIllegalArgumentException("Illegal index boost [" + var32 + "], boost not a float number");
+ }
+ }
+ }
+
+ String var28 = request.param("stats");
+ if(var28 != null) {
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ searchSourceBuilder.stats(Strings.splitStringByCommaToArray(var28));
+ }
+
+ suggestField = request.param("suggest_field");
+ if(suggestField != null) {
+ String var30 = request.param("suggest_text", queryString);
+ var31 = request.paramAsInt("suggest_size", 5);
+ if(searchSourceBuilder == null) {
+ searchSourceBuilder = new SearchSourceBuilder();
+ }
+
+ var32 = request.param("suggest_mode");
+ searchSourceBuilder.suggest().addSuggestion(((TermSuggestionBuilder)((TermSuggestionBuilder)((TermSuggestionBuilder)SuggestBuilders.termSuggestion(suggestField).field(suggestField)).text(var30)).size(var31)).suggestMode(var32));
+ }
+
+ return searchSourceBuilder;
+ }
+
}
diff --git a/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerUtils.java b/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerUtils.java
deleted file mode 100644
index e1269a0..0000000
--- a/src/main/java/org/apache/manifoldcf/elasticsearch/MCFAuthorizerUtils.java
+++ /dev/null
@@ -1,584 +0,0 @@
-/* $Id$ */
-/* Modified to MCFAuthorizerUtils.java 2015-04-28 Bart Superson */
-/**
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements. See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.apache.manifoldcf.elasticsearch;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.elasticsearch.ElasticsearchIllegalArgumentException;
-import org.elasticsearch.action.search.SearchRequest;
-import org.elasticsearch.action.support.IndicesOptions;
-import org.elasticsearch.common.Strings;
-import org.elasticsearch.common.logging.ESLogger;
-import org.elasticsearch.common.logging.Loggers;
-import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.index.query.*;
-import org.elasticsearch.rest.RestRequest;
-import org.elasticsearch.rest.action.search.RestSearchAction;
-import org.elasticsearch.rest.action.support.RestActions;
-import org.elasticsearch.search.Scroll;
-import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.elasticsearch.search.fetch.source.FetchSourceContext;
-import org.elasticsearch.search.sort.SortOrder;
-import org.elasticsearch.search.suggest.SuggestBuilders;
-import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
-
-import java.io.*;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class MCFAuthorizerUtils {
-
- protected static String ALLOW_FIELD_PREFIX = "allow_token_";
- protected static String DENY_FIELD_PREFIX = "deny_token_";
-
- protected final static String AUTHORITY_BASE_URL = "http://localhost:8345/mcf-authority-service";
- protected final static String FIELD_ALLOW_DOCUMENT = ALLOW_FIELD_PREFIX +"document";
- protected final static String FIELD_DENY_DOCUMENT = DENY_FIELD_PREFIX +"document";
- protected final static String FIELD_ALLOW_PARENT = ALLOW_FIELD_PREFIX +"share";
- protected final static String FIELD_DENY_PARENT = DENY_FIELD_PREFIX +"share";
- protected final static String FIELD_ALLOW_SHARE = ALLOW_FIELD_PREFIX +"parent";
- protected final static String FIELD_DENY_SHARE = DENY_FIELD_PREFIX +"parent";
-
- /** Special token for null security fields */
- protected static final String NOSECURITY_TOKEN = "__nosecurity__";
-
- private final static CloseableHttpClient httpClient = HttpClients.createDefault();
-
- private static final ESLogger log = Loggers.getLogger("MCFAuthorizer");
-
- public static SearchRequest parseSearchRequestMCF(RestRequest request) throws MCFAuthorizerException {
- SearchRequest searchRequest;
- //if(usernameAndDomain[0]==null) throw new MCFAuthorizerException("Username not passed.");
- if(request.param("u")!=null) {
- String[] authenticatedUserNamesAndDomains = request.param("u").split(",");
- String[] indices = Strings.splitStringByCommaToArray(request.param("index"));
- searchRequest = new SearchRequest(indices);
- boolean isTemplateRequest = request.path().endsWith("/template");
-
- if(request.hasContent() || request.hasParam("source")) {
- FilterBuilder authorizationFilter = buildAuthorizationFilter(authenticatedUserNamesAndDomains);
- FilteredQueryBuilder filteredQueryBuilder;
-
- ObjectMapper objectMapper = new ObjectMapper();
- ObjectNode modifiedJSON, innerJSON;
- JsonNode requestJSON;
-
- try {
- requestJSON = objectMapper.readTree(RestActions.getRestContent(request).toBytes());
- if (isTemplateRequest) {
- modifiedJSON = (ObjectNode) requestJSON;
- innerJSON = (ObjectNode)requestJSON.findValue("template");
- filteredQueryBuilder = QueryBuilders.filteredQuery(QueryBuilders.wrapperQuery(innerJSON.findValue("query").toString()), authorizationFilter);
- modifiedJSON.replace("template",innerJSON.set("query", objectMapper.readTree(filteredQueryBuilder.buildAsBytes().toBytes())));
- searchRequest.templateSource(modifiedJSON.toString());
- } else {
- filteredQueryBuilder = QueryBuilders.filteredQuery(QueryBuilders.wrapperQuery(requestJSON.findValue("query").toString()), authorizationFilter);
- modifiedJSON = (ObjectNode) requestJSON;
- modifiedJSON.set("query", objectMapper.readTree(filteredQueryBuilder.buildAsBytes().toBytes()));
- searchRequest.source(modifiedJSON.toString());
- }
- } catch (IOException e) {
- e.printStackTrace();
- throw new MCFAuthorizerException("JSON parser error");
- }
- }
-
- searchRequest.extraSource(parseSearchSourceMCF(request));
- searchRequest.searchType(request.param("search_type"));
- searchRequest.queryCache(request.paramAsBoolean("query_cache", (Boolean)null));
- String scroll = request.param("scroll");
- if(scroll != null) {
- searchRequest.scroll(new Scroll(TimeValue.parseTimeValue(scroll, (TimeValue)null)));
- }
-
- searchRequest.types(Strings.splitStringByCommaToArray(request.param("type")));
- searchRequest.routing(request.param("routing"));
- searchRequest.preference(request.param("preference"));
- searchRequest.indicesOptions(IndicesOptions.fromRequest(request, searchRequest.indicesOptions()));
- }
- else {
- searchRequest = RestSearchAction.parseSearchRequest(request);
- }
- return searchRequest;
- }
-
- public static SearchSourceBuilder parseSearchSourceMCF(RestRequest request) throws MCFAuthorizerException {
- SearchSourceBuilder searchSourceBuilder = null;
- String queryString = request.param("q");
- if(queryString != null) {
- String[] authenticatedUserNamesAndDomains = request.param("u").split(",");
- FilterBuilder authorizationFilter = buildAuthorizationFilter(authenticatedUserNamesAndDomains);
- QueryStringQueryBuilder from = QueryBuilders.queryStringQuery(queryString);
- from.defaultField(request.param("df"));
- from.analyzer(request.param("analyzer"));
- from.analyzeWildcard(request.paramAsBoolean("analyze_wildcard", false));
- from.lowercaseExpandedTerms(request.paramAsBoolean("lowercase_expanded_terms", true));
- from.lenient(request.paramAsBoolean("lenient", (Boolean)null));
- String size = request.param("default_operator");
- if(size != null) {
- if("OR".equals(size)) {
- from.defaultOperator(QueryStringQueryBuilder.Operator.OR);
- } else {
- if(!"AND".equals(size)) {
- throw new ElasticsearchIllegalArgumentException("Unsupported defaultOperator [" + size + "], can either be [OR] or [AND]");
- }
-
- from.defaultOperator(QueryStringQueryBuilder.Operator.AND);
- }
- }
-
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.query(QueryBuilders.filteredQuery(from, authorizationFilter));
- }
- else {
- if(!(request.hasContent() || request.hasParam("source"))){
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
- FilterBuilder authorizationFilter = buildAuthorizationFilter(request.param("u"));
- searchSourceBuilder.query(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),authorizationFilter));
- }
- }
-
- int var19 = request.paramAsInt("from", -1);
- if(var19 != -1) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.from(var19);
- }
-
- int var20 = request.paramAsInt("size", -1);
- if(var20 != -1) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.size(var20);
- }
-
- if(request.hasParam("explain")) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.explain(request.paramAsBoolean("explain", (Boolean)null));
- }
-
- if(request.hasParam("version")) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.version(request.paramAsBoolean("version", (Boolean)null));
- }
-
- if(request.hasParam("timeout")) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.timeout(request.paramAsTime("timeout", (TimeValue)null));
- }
-
- if(request.hasParam("terminate_after")) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- int sField = request.paramAsInt("terminate_after", 0);
- if(sField < 0) {
- throw new ElasticsearchIllegalArgumentException("terminateAfter must be > 0");
- }
-
- if(sField > 0) {
- searchSourceBuilder.terminateAfter(sField);
- }
- }
-
- String var21 = request.param("fields");
- String suggestField;
- if(var21 != null) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- if(!Strings.hasText(var21)) {
- searchSourceBuilder.noFields();
- } else {
- String[] fetchSourceContext = Strings.splitStringByCommaToArray(var21);
- if(fetchSourceContext != null) {
- String[] sSorts = fetchSourceContext;
- int sIndicesBoost = fetchSourceContext.length;
-
- for(int sStats = 0; sStats < sIndicesBoost; ++sStats) {
- suggestField = sSorts[sStats];
- searchSourceBuilder.field(suggestField);
- }
- }
- }
- }
-
- FetchSourceContext var22 = FetchSourceContext.parseFromRestRequest(request);
- if(var22 != null) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.fetchSource(var22);
- }
-
- if(request.hasParam("track_scores")) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.trackScores(request.paramAsBoolean("track_scores", false));
- }
-
- String var23 = request.param("sort");
- int suggestText;
- String indexName;
- String[] var26;
- if(var23 != null) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- String[] var24 = Strings.splitStringByCommaToArray(var23);
- var26 = var24;
- int var27 = var24.length;
-
- for(suggestText = 0; suggestText < var27; ++suggestText) {
- String suggestSize = var26[suggestText];
- int suggestMode = suggestSize.lastIndexOf(":");
- if(suggestMode != -1) {
- String divisor = suggestSize.substring(0, suggestMode);
- indexName = suggestSize.substring(suggestMode + 1);
- if("asc".equals(indexName)) {
- searchSourceBuilder.sort(divisor, SortOrder.ASC);
- } else if("desc".equals(indexName)) {
- searchSourceBuilder.sort(divisor, SortOrder.DESC);
- }
- } else {
- searchSourceBuilder.sort(suggestSize);
- }
- }
- }
-
- String var25 = request.param("indices_boost");
- int var31;
- String var32;
- if(var25 != null) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- var26 = Strings.splitStringByCommaToArray(var25);
- String[] var29 = var26;
- suggestText = var26.length;
-
- for(var31 = 0; var31 < suggestText; ++var31) {
- var32 = var29[var31];
- int var33 = var32.indexOf(44);
- if(var33 == -1) {
- throw new ElasticsearchIllegalArgumentException("Illegal index boost [" + var32 + "], no \',\'");
- }
-
- indexName = var32.substring(0, var33);
- String sBoost = var32.substring(var33 + 1);
-
- try {
- searchSourceBuilder.indexBoost(indexName, Float.parseFloat(sBoost));
- } catch (NumberFormatException var18) {
- throw new ElasticsearchIllegalArgumentException("Illegal index boost [" + var32 + "], boost not a float number");
- }
- }
- }
-
- String var28 = request.param("stats");
- if(var28 != null) {
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- searchSourceBuilder.stats(Strings.splitStringByCommaToArray(var28));
- }
-
- suggestField = request.param("suggest_field");
- if(suggestField != null) {
- String var30 = request.param("suggest_text", queryString);
- var31 = request.paramAsInt("suggest_size", 5);
- if(searchSourceBuilder == null) {
- searchSourceBuilder = new SearchSourceBuilder();
- }
-
- var32 = request.param("suggest_mode");
- searchSourceBuilder.suggest().addSuggestion(((TermSuggestionBuilder)((TermSuggestionBuilder)((TermSuggestionBuilder)SuggestBuilders.termSuggestion(suggestField).field(suggestField)).text(var30)).size(var31)).suggestMode(var32));
- }
-
- return searchSourceBuilder;
- }
-
- /** Main method for building a filter representing appropriate security.
- *@param authenticatedUserNamesAndDomains is a list of user names and its domains in the form "user@domain".
- *@return the filter builder.
- */
- public static FilterBuilder buildAuthorizationFilter(String[] authenticatedUserNamesAndDomains)
- throws MCFAuthorizerException{
- Map<String,String> domainMap = new HashMap<String,String>();
- for(String buffer : authenticatedUserNamesAndDomains){
- String[] authenticatedUserNameAndDomain = buffer.split("@", 2);
- String authenticatedUserName = authenticatedUserNameAndDomain[0];
- String authenticatedUserDomain;
- if(authenticatedUserNameAndDomain.length<2) authenticatedUserDomain="";
- else authenticatedUserDomain=authenticatedUserNameAndDomain[1];
- domainMap.put(authenticatedUserDomain, authenticatedUserName);
- }
- return buildAuthorizationFilter(domainMap);
- }
-
-
- /** Main method for building a filter representing appropriate security.
- *@param domainMap is a map from MCF authorization domain name to user name,
- * and describes a complete user identity.
- *@return the filter builder.
- */
- public static FilterBuilder buildAuthorizationFilter(Map<String,String> domainMap)
- throws MCFAuthorizerException
- {
- if (AUTHORITY_BASE_URL == null)
- throw new IllegalStateException("Authority base URL required for finding access tokens for a user");
-
- if (domainMap == null || domainMap.size() == 0)
- throw new IllegalArgumentException("Cannot find user tokens for null user");
-
- StringBuilder sb = new StringBuilder("[");
- boolean first = true;
- for (String domain : domainMap.keySet())
- {
- if (!first)
- sb.append(",");
- else
- first = false;
- sb.append(domain).append(":").append(domainMap.get(domain));
- }
- sb.append("]");
- log.info("Trying to match docs for user '"+sb.toString()+"'");
-
- return buildAuthorizationFilter(getAccessTokens(domainMap));
- }
-
- /** Main method for building a filter representing appropriate security.
- *@param authenticatedUserName is a user name in the form "user@domain".
- *@return the filter builder.
- */
- public static FilterBuilder buildAuthorizationFilter(String authenticatedUserName)
- throws MCFAuthorizerException
- {
- return buildAuthorizationFilter(authenticatedUserName, "");
- }
-
- /** Main method for building a filter representing appropriate security.
- *@param authenticatedUserName is a user name in the form "user@domain".
- *@param authenticatedUserDomain is the corresponding MCF authorization domain.
- *@return the filter builder.
- */
- public static FilterBuilder buildAuthorizationFilter(String authenticatedUserName, String authenticatedUserDomain)
- throws MCFAuthorizerException
- {
- Map<String,String> domainMap = new HashMap<String,String>();
- domainMap.put(authenticatedUserDomain, authenticatedUserName);
- return buildAuthorizationFilter(domainMap);
- }
-
- /** Main method for building a filter representing appropriate security.
- *@param userAccessTokens are a set of tokens to use to construct the filter (presumably from mod_authz_annotate, upstream)
- *@return the wrapped query enforcing ManifoldCF security.
- */
- public static FilterBuilder buildAuthorizationFilter(List<String> userAccessTokens)
- throws MCFAuthorizerException
- {
- BoolFilterBuilder bq = new BoolFilterBuilder();
-
- FilterBuilder allowShareOpen = new TermFilterBuilder(FIELD_ALLOW_SHARE,NOSECURITY_TOKEN);
- FilterBuilder denyShareOpen = new TermFilterBuilder(FIELD_DENY_SHARE,NOSECURITY_TOKEN);
- FilterBuilder allowParentOpen = new TermFilterBuilder(FIELD_ALLOW_PARENT,NOSECURITY_TOKEN);
- FilterBuilder denyParentOpen = new TermFilterBuilder(FIELD_DENY_PARENT,NOSECURITY_TOKEN);
- FilterBuilder allowDocumentOpen = new TermFilterBuilder(FIELD_ALLOW_DOCUMENT,NOSECURITY_TOKEN);
- FilterBuilder denyDocumentOpen = new TermFilterBuilder(FIELD_DENY_DOCUMENT,NOSECURITY_TOKEN);
-
- if (userAccessTokens == null || userAccessTokens.size() == 0)
- {
- // Only open documents can be included.
- // That query is:
- // (FIELD_ALLOW_SHARE is empty AND FIELD_DENY_SHARE is empty AND FIELD_ALLOW_DOCUMENT is empty AND FIELD_DENY_DOCUMENT is empty)
- // We're trying to map to: -(FIELD_ALLOW_SHARE:*) , which should be pretty efficient in Solr because it is negated. If this turns out not to be so, then we should
- // have the SolrConnector inject a special token into these fields when they otherwise would be empty, and we can trivially match on that token.
- bq.must(allowShareOpen);
- bq.must(denyShareOpen);
- bq.must(allowParentOpen);
- bq.must(denyParentOpen);
- bq.must(allowDocumentOpen);
- bq.must(denyDocumentOpen);
- }
- else
- {
- // Extend the query appropriately for each user access token.
- bq.must(calculateCompleteSubquery(FIELD_ALLOW_SHARE, FIELD_DENY_SHARE,allowShareOpen,denyShareOpen,userAccessTokens));
- bq.must(calculateCompleteSubquery(FIELD_ALLOW_DOCUMENT, FIELD_DENY_DOCUMENT,allowDocumentOpen,denyDocumentOpen,userAccessTokens));
- bq.must(calculateCompleteSubquery(FIELD_ALLOW_PARENT, FIELD_DENY_PARENT,allowParentOpen,denyParentOpen,userAccessTokens));
- }
-
- return bq;
- }
-
- /** Calculate a complete subclause, representing something like:
- * ((FIELD_ALLOW_SHARE is empty AND FIELD_DENY_SHARE is empty) OR FIELD_ALLOW_SHARE HAS token1 OR FIELD_ALLOW_SHARE HAS token2 ...)
- * AND FIELD_DENY_SHARE DOESN'T_HAVE token1 AND FIELD_DENY_SHARE DOESN'T_HAVE token2 ...
- */
- private static FilterBuilder calculateCompleteSubquery(String allowField, String denyField, FilterBuilder allowOpen, FilterBuilder denyOpen, List<String> userAccessTokens)
- {
- BoolFilterBuilder bq = new BoolFilterBuilder();
- // No ES equivalent - hope this is done right inside
- //bq.setMaxClauseCount(1000000);
-
- // Add the empty-acl case
- BoolFilterBuilder subUnprotectedClause = new BoolFilterBuilder();
- subUnprotectedClause.must(allowOpen);
- subUnprotectedClause.must(denyOpen);
- bq.should(subUnprotectedClause);
- for (String accessToken : userAccessTokens)
- {
- bq.should(new TermFilterBuilder(allowField,accessToken));
- bq.mustNot(new TermFilterBuilder(denyField,accessToken));
- }
- return bq;
- }
-
- /** Get access tokens given a username */
- protected static List<String> getAccessTokens(Map<String,String> domainMap)
- throws MCFAuthorizerException
- {
- try
- {
- StringBuilder urlBuffer = new StringBuilder(AUTHORITY_BASE_URL);
- urlBuffer.append("/UserACLs");
- int i = 0;
- for (String domain : domainMap.keySet())
- {
- if (i == 0)
- urlBuffer.append("?");
- else
- urlBuffer.append("&");
- // For backwards compatibility, handle the singleton case specially
- if (domainMap.size() == 1 && domain.length() == 0)
- {
- urlBuffer.append("username=").append(URLEncoder.encode(domainMap.get(domain),"utf-8"));
- }
- else
- {
- urlBuffer.append("username_").append(Integer.toString(i)).append("=").append(URLEncoder.encode(domainMap.get(domain),"utf-8")).append("&")
- .append("domain_").append(Integer.toString(i)).append("=").append(URLEncoder.encode(domain,"utf-8"));
- }
- i++;
- }
- String theURL = urlBuffer.toString();
- HttpGet method = new HttpGet(theURL);
- try
- {
- HttpResponse httpResponse = httpClient.execute(method);
- int rval = httpResponse.getStatusLine().getStatusCode();
- if (rval != 200)
- {
- String response = EntityUtils.toString(httpResponse.getEntity(),"utf-8");
- throw new MCFAuthorizerException("Couldn't fetch user's access tokens from ManifoldCF authority service: "+Integer.toString(rval)+"; "+response);
- }
- InputStream is = httpResponse.getEntity().getContent();
- try
- {
- String charSet = ContentType.getOrDefault(httpResponse.getEntity()).getCharset().toString();
- if (charSet == null)
- charSet = "utf-8";
- Reader r = new InputStreamReader(is,charSet);
- try
- {
- BufferedReader br = new BufferedReader(r);
- try
- {
- // Read the tokens, one line at a time. If any authorities are down, we have no current way to note that, but someday we will.
- List<String> tokenList = new ArrayList<String>();
- while (true)
- {
- String line = br.readLine();
- if (line == null)
- break;
- if (line.startsWith("TOKEN:"))
- {
- tokenList.add(line.substring("TOKEN:".length()));
- log.info(line);
- }
- else {
- // It probably says something about the state of the authority(s) involved, so log it
- log.info("Saw authority response "+line);
- }
- }
- return tokenList;
- }
- finally
- {
- br.close();
- }
- }
- finally
- {
- r.close();
- }
- }
- finally
- {
- is.close();
- }
- }
- finally
- {
- method.abort();
- }
- }
- catch (IOException e)
- {
- throw new MCFAuthorizerException("IO exception: "+e.getMessage(),e);
- }
- }
-
-}