Started adding authentication, not finished yet
Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/f6b19a9f Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/f6b19a9f Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/f6b19a9f Branch: refs/heads/apache-blur-0.2 Commit: f6b19a9f8fed4c64f2e2d81165cc86dd2e5a2d21 Parents: b2e2952 Author: Chris Rohr <[email protected]> Authored: Tue Jul 1 09:27:50 2014 -0400 Committer: Chris Rohr <[email protected]> Committed: Tue Jul 1 09:27:50 2014 -0400 ---------------------------------------------------------------------- .../org/apache/blur/console/JettyServer.java | 6 +- .../org/apache/blur/console/model/User.java | 69 + .../console/providers/AllAllowedProvider.java | 74 + .../blur/console/providers/IProvider.java | 40 + .../blur/console/servlets/AuthServlet.java | 104 + .../console/servlets/BaseConsoleServlet.java | 18 +- .../blur/console/servlets/NodesServlet.java | 3 +- .../blur/console/servlets/QueriesServlet.java | 3 +- .../blur/console/servlets/SearchServlet.java | 3 +- .../blur/console/servlets/TablesServlet.java | 4 +- .../org/apache/blur/console/util/Config.java | 42 +- .../org/apache/blur/console/util/HttpUtil.java | 7 + .../apache/blur/console/util/SearchUtil.java | 31 +- ...console.018c8d880edbb816d45f576c8cf85eed.css | 6592 +++++++++++++++++ ...console.52f95d3d625a3fddbc9e7a03e36b99f5.css | 19 - .../src/main/webapp/public/css/blurconsole.css | 6611 +++++++++++++++++- ...ole.css.0212975e50782bb2f0d4b89d196e90dc.map | 7 + ...ole.css.2dce84df98e8778277eceec68cfe56ca.map | 7 - .../main/webapp/public/css/blurconsole.css.map | 2 +- blur-console/src/main/webapp/public/index.html | 4 +- ...rconsole.30907698bb5cd04fc79379cdc68bf683.js | 27 + ...rconsole.3b2e36bed1188bf6d6709c238d901a2b.js | 27 - .../src/main/webapp/public/js/blurconsole.js | 4 +- ...sole.js.13e45f7dcc18364f8967d5ac8cac7214.map | 1 + ...sole.js.256687eb5a2e118e9a09c90bbc929ecf.map | 1 - .../main/webapp/public/js/blurconsole.js.map | 2 +- 26 files changed, 13592 insertions(+), 116 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/JettyServer.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/JettyServer.java b/blur-console/src/main/java/org/apache/blur/console/JettyServer.java index 8b693cb..2bcbf88 100644 --- a/blur-console/src/main/java/org/apache/blur/console/JettyServer.java +++ b/blur-console/src/main/java/org/apache/blur/console/JettyServer.java @@ -17,10 +17,7 @@ package org.apache.blur.console; * limitations under the License. */ -import org.apache.blur.console.servlets.NodesServlet; -import org.apache.blur.console.servlets.QueriesServlet; -import org.apache.blur.console.servlets.SearchServlet; -import org.apache.blur.console.servlets.TablesServlet; +import org.apache.blur.console.servlets.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mortbay.jetty.Server; @@ -74,6 +71,7 @@ public class JettyServer { // for localhost:port/service/dashboard, etc. final Context context = new Context(server, "/service", Context.SESSIONS); + context.addServlet(new ServletHolder(new AuthServlet()), "/auth/*"); context.addServlet(new ServletHolder(new NodesServlet()), "/nodes/*"); context.addServlet(new ServletHolder(new TablesServlet()), "/tables/*"); context.addServlet(new ServletHolder(new QueriesServlet()), "/queries/*"); http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/model/User.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/model/User.java b/blur-console/src/main/java/org/apache/blur/console/model/User.java new file mode 100644 index 0000000..2625f7f --- /dev/null +++ b/blur-console/src/main/java/org/apache/blur/console/model/User.java @@ -0,0 +1,69 @@ +package org.apache.blur.console.model; + +/** + * 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. + */ + +import java.util.List; + +public class User { + protected String authToken; + protected String name; + protected String email; + protected String password; + protected List<String> roles; + + public String getAuthToken() { + return authToken; + } + + public void setAuthToken(String authToken) { + this.authToken = authToken; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public List<String> getRoles() { + return roles; + } + + public void setRoles(List<String> roles) { + this.roles = roles; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/providers/AllAllowedProvider.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/providers/AllAllowedProvider.java b/blur-console/src/main/java/org/apache/blur/console/providers/AllAllowedProvider.java new file mode 100644 index 0000000..6086a7e --- /dev/null +++ b/blur-console/src/main/java/org/apache/blur/console/providers/AllAllowedProvider.java @@ -0,0 +1,74 @@ +package org.apache.blur.console.providers; + +/** + * 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. + */ + +import org.apache.blur.BlurConfiguration; +import org.apache.blur.console.model.User; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +public class AllAllowedProvider implements IProvider { + + @Override + public User login(HttpServletRequest request) { + return null; + } + + @Override + public User getUser(String token) { + return null; + } + + @Override + public User getUser(String token, HttpServletRequest request) { + return null; + } + + @Override + public boolean isValidToken(String token, HttpServletRequest request) { + return true; + } + + @Override + public boolean userHasRole(User user, String role) { + return false; + } + + @Override + public void setupProvider(BlurConfiguration config) { + + } + + @Override + public Map<String, Map<String, Object>> getLoginFields() { + return null; + } + + @Override + public boolean isLoginRequired() { + return false; + } + + @Override + public boolean isRetryAllowed() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/providers/IProvider.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/providers/IProvider.java b/blur-console/src/main/java/org/apache/blur/console/providers/IProvider.java new file mode 100644 index 0000000..9381a00 --- /dev/null +++ b/blur-console/src/main/java/org/apache/blur/console/providers/IProvider.java @@ -0,0 +1,40 @@ +package org.apache.blur.console.providers; + +/** + * 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. + */ + +import org.apache.blur.BlurConfiguration; +import org.apache.blur.console.model.User; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +public interface IProvider { + public static final String INPUT_FIELD = "input"; + public static final String PASSWORD_FIELD = "password"; + public static final String BROWSER_PROVIDED = "browser"; + + public User login(HttpServletRequest request); + public User getUser(String token); + public User getUser(String token, HttpServletRequest request); + public boolean isValidToken(String token, HttpServletRequest request); + public boolean userHasRole(User user, String role); + public void setupProvider(BlurConfiguration config); + public Map<String, Map<String, Object>> getLoginFields(); + public boolean isLoginRequired(); + public boolean isRetryAllowed(); +} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/AuthServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/AuthServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/AuthServlet.java new file mode 100644 index 0000000..f47a183 --- /dev/null +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/AuthServlet.java @@ -0,0 +1,104 @@ +package org.apache.blur.console.servlets; + +/** + * 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. + */ + +import org.apache.blur.console.model.User; +import org.apache.blur.console.providers.IProvider; +import org.apache.blur.console.util.Config; +import org.apache.blur.console.util.HttpUtil; +import org.apache.commons.lang.StringUtils; +import org.codehaus.jackson.map.ObjectMapper; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class AuthServlet extends BaseConsoleServlet { + private static final String LOGIN_STATUS_FIELD = "loggedIn"; + private static final String LOGIN_FIELDS_FIELD = "requiredFields"; + private static final String LOGIN_RETRY_ALLOWED = "retryAllowed"; + private static final String AUTH_TOKEN = "authToken"; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String path = req.getPathInfo(); + + if (path == null) { + checkCurrentAuth(req, resp); + } else { + sendNotFound(resp, req.getRequestURI()); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String path = req.getPathInfo(); + + if ("login".equalsIgnoreCase(path)) { + loginUser(req, resp); + } else { + sendNotFound(resp, req.getRequestURI()); + } + } + + private void checkCurrentAuth(HttpServletRequest request, HttpServletResponse response) throws IOException { + IProvider provider = Config.getProvider(); + Map<String, Object> responseData = new HashMap<String, Object>(); + + if (provider.isLoginRequired()) { + String authToken = HttpUtil.getFirstParam(request.getParameterMap().get(AUTH_TOKEN)); + + if (StringUtils.isNotBlank(authToken) && provider.getUser(authToken, request) != null) { + responseData.put(LOGIN_STATUS_FIELD, true); + } else { + responseData.put(LOGIN_STATUS_FIELD, false); + responseData.put(LOGIN_FIELDS_FIELD, provider.getLoginFields()); + } + } else { + responseData.put(LOGIN_STATUS_FIELD, true); + } + + HttpUtil.sendResponse(response, new ObjectMapper().writeValueAsString(responseData), HttpUtil.JSON); + } + + private void loginUser(HttpServletRequest request, HttpServletResponse response) throws IOException { + Map<String, Object> data = new HashMap<String, Object>(); + + IProvider provider = Config.getProvider(); + + User user = provider.login(request); + + if (user == null) { + data.put(LOGIN_STATUS_FIELD, false); + + boolean retry = provider.isRetryAllowed(); + data.put(LOGIN_RETRY_ALLOWED, retry); + if (retry) { + data.put(LOGIN_FIELDS_FIELD, provider.getLoginFields()); + } + } else { + data.put(AUTH_TOKEN, user.getAuthToken()); + data.put("roles", user.getRoles()); + } + + HttpUtil.sendResponse(response, new ObjectMapper().writeValueAsString(data), HttpUtil.JSON); + } +} http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/BaseConsoleServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/BaseConsoleServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/BaseConsoleServlet.java index 86ba33a..c155813 100644 --- a/blur-console/src/main/java/org/apache/blur/console/servlets/BaseConsoleServlet.java +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/BaseConsoleServlet.java @@ -23,12 +23,16 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; public abstract class BaseConsoleServlet extends HttpServlet { private static final long serialVersionUID = -5156028303476799953L; + private static final Log log = LogFactory.getLog(BaseConsoleServlet.class); + private static final String UNAUTHORIZED = "User is unauthorized to perform this action"; protected void sendError(HttpServletResponse response, Exception e) throws IOException { - e.printStackTrace(); + log.error("Error processing request.", e); String body = e.getMessage(); response.setContentType("application/json"); response.setContentLength(body.getBytes().length); @@ -36,6 +40,13 @@ public abstract class BaseConsoleServlet extends HttpServlet { IOUtils.write(body, response.getOutputStream()); } + protected void sendUnauthorized(HttpServletResponse response) throws IOException { + response.setContentType("application/json"); + response.setContentLength(UNAUTHORIZED.getBytes().length); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + IOUtils.write(UNAUTHORIZED, response.getOutputStream()); + } + protected void sendGenericOk(HttpServletResponse response) throws IOException { String responseBody = "success"; response.setContentType("text/plain"); @@ -43,4 +54,9 @@ public abstract class BaseConsoleServlet extends HttpServlet { response.setStatus(HttpServletResponse.SC_OK); IOUtils.write(responseBody, response.getOutputStream()); } + + protected void sendNotFound(HttpServletResponse response, String path) throws IOException { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + IOUtils.write("URL [" + path + "] doesn't exist", response.getOutputStream()); + } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/NodesServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/NodesServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/NodesServlet.java index 2333bad..d2e1bd4 100644 --- a/blur-console/src/main/java/org/apache/blur/console/servlets/NodesServlet.java +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/NodesServlet.java @@ -39,8 +39,7 @@ public class NodesServlet extends BaseConsoleServlet { if (path == null) { sendNodeStatus(res); } else { - res.setStatus(HttpServletResponse.SC_NOT_FOUND); - IOUtils.write("Route [" + path + "] doesn't exist", res.getOutputStream()); + sendNotFound(res, req.getRequestURI()); } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/QueriesServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/QueriesServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/QueriesServlet.java index 816d391..913c6de 100644 --- a/blur-console/src/main/java/org/apache/blur/console/servlets/QueriesServlet.java +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/QueriesServlet.java @@ -47,8 +47,7 @@ public class QueriesServlet extends BaseConsoleServlet { } else if ((m = queryCancelPattern.matcher(path)).matches()) { cancelQuery(res, m.group(1), req.getParameter("table")); } else { - res.setStatus(HttpServletResponse.SC_NOT_FOUND); - IOUtils.write("Route [" + path + "] doesn't exist", res.getOutputStream()); + sendNotFound(res, req.getRequestURI()); } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/SearchServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/SearchServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/SearchServlet.java index cf64515..54e73e1 100644 --- a/blur-console/src/main/java/org/apache/blur/console/servlets/SearchServlet.java +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/SearchServlet.java @@ -41,8 +41,7 @@ public class SearchServlet extends BaseConsoleServlet { String remoteHost = req.getRemoteHost(); search(res, req.getParameterMap(), remoteHost); } else { - res.setStatus(HttpServletResponse.SC_NOT_FOUND); - IOUtils.write("Route [" + path + "] doesn't exist", res.getOutputStream()); + sendNotFound(res, req.getRequestURI()); } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/servlets/TablesServlet.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/servlets/TablesServlet.java b/blur-console/src/main/java/org/apache/blur/console/servlets/TablesServlet.java index 61983aa..2fb3ecd 100644 --- a/blur-console/src/main/java/org/apache/blur/console/servlets/TablesServlet.java +++ b/blur-console/src/main/java/org/apache/blur/console/servlets/TablesServlet.java @@ -31,7 +31,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.blur.console.util.HttpUtil; import org.apache.blur.console.util.TableUtil; -import org.apache.commons.io.IOUtils; import org.codehaus.jackson.map.ObjectMapper; public class TablesServlet extends BaseConsoleServlet { @@ -59,8 +58,7 @@ public class TablesServlet extends BaseConsoleServlet { } else if ((m = tableDeletePattern.matcher(path)).matches()) { delete(res, m.group(1), req.getParameter("includeFiles")); } else { - res.setStatus(HttpServletResponse.SC_NOT_FOUND); - IOUtils.write("Route [" + path + "] doesn't exist", res.getOutputStream()); + sendNotFound(res, req.getRequestURI()); } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/util/Config.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/util/Config.java b/blur-console/src/main/java/org/apache/blur/console/util/Config.java index 20e37c8..d867e54 100644 --- a/blur-console/src/main/java/org/apache/blur/console/util/Config.java +++ b/blur-console/src/main/java/org/apache/blur/console/util/Config.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Map; import org.apache.blur.BlurConfiguration; +import org.apache.blur.console.providers.AllAllowedProvider; +import org.apache.blur.console.providers.IProvider; import org.apache.blur.manager.clusterstatus.ZookeeperClusterStatus; import org.apache.blur.thrift.BlurClient; import org.apache.blur.thrift.generated.Blur.Iface; @@ -49,7 +51,8 @@ public class Config { private static ZookeeperClusterStatus zk; private static String blurConnection; private static Object cluster; - private static Map<String, String> globalUserProperties; + private static Map<String, Map<String, String>> globalUserProperties; + private static IProvider provider; public static int getConsolePort() { return port; @@ -78,6 +81,7 @@ public class Config { blurConnection = buildConnectionString(); port = blurConfig.getInt("blur.console.port", DEFAULT_PORT); parseSecurity(); + setupProvider(); } private static void parseSecurity() { @@ -87,8 +91,8 @@ public class Config { JsonFactory factory = new JsonFactory(); ObjectMapper mapper = new ObjectMapper(factory); File from = new File(securityFile); - TypeReference<Map<String, String>> typeRef - = new TypeReference<Map<String, String>>() { }; + TypeReference<Map<String, Map<String, String>>> typeRef + = new TypeReference<Map<String, Map<String, String>>>() { }; try { globalUserProperties = mapper.readValue(from, typeRef); @@ -99,6 +103,22 @@ public class Config { } } + private static void setupProvider() { + String providerClassName = blurConfig.get("blur.console.auth.provider", "org.apache.blur.console.providers.AllAllowedProvider"); + + try { + Class providerClass = Class.forName(providerClassName, false, Config.class.getClassLoader()); + + if (providerClass != null) { + provider = (IProvider) providerClass.newInstance(); + provider.setupProvider(blurConfig); + } + } catch (Exception e) { + log.fatal("Unable to setup provider [" + providerClassName + "]. Reverting to default."); + provider = new AllAllowedProvider(); + } + } + public static String getConnectionString() throws IOException { return blurConnection; } @@ -149,17 +169,21 @@ public class Config { } } - public static Iface getClient(String username) throws IOException { + public static Iface getClient(String username, String securityUser) throws IOException { Iface client = BlurClient.getClient(getConnectionString()); - if (globalUserProperties != null) { - UserContext.setUser(new User(username, globalUserProperties)); + if (globalUserProperties != null && globalUserProperties.get(securityUser) != null) { + UserContext.setUser(new User(username, globalUserProperties.get(securityUser))); } return client; } - public static boolean isClusterSetup() { - return cluster != null; - } + public static boolean isClusterSetup() { + return cluster != null; + } + + public static IProvider getProvider() { + return provider; + } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/util/HttpUtil.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/util/HttpUtil.java b/blur-console/src/main/java/org/apache/blur/console/util/HttpUtil.java index 1a9253b..32690e5 100644 --- a/blur-console/src/main/java/org/apache/blur/console/util/HttpUtil.java +++ b/blur-console/src/main/java/org/apache/blur/console/util/HttpUtil.java @@ -33,4 +33,11 @@ public class HttpUtil { res.setStatus(HttpServletResponse.SC_OK); IOUtils.write(body, res.getOutputStream()); } + + public static String getFirstParam(String[] param) { + if (param == null || param.length == 0) { + return ""; + } + return param[0]; + } } http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/f6b19a9f/blur-console/src/main/java/org/apache/blur/console/util/SearchUtil.java ---------------------------------------------------------------------- diff --git a/blur-console/src/main/java/org/apache/blur/console/util/SearchUtil.java b/blur-console/src/main/java/org/apache/blur/console/util/SearchUtil.java index f932bb2..4eccab9 100644 --- a/blur-console/src/main/java/org/apache/blur/console/util/SearchUtil.java +++ b/blur-console/src/main/java/org/apache/blur/console/util/SearchUtil.java @@ -53,28 +53,29 @@ public class SearchUtil { private static final String RECORD_RECORD_OPTION = "recordrecord"; public static Map<String, Object> search(Map<String, String[]> params, String remoteHost) throws IOException, TException { - String table = params.get("table")[0]; - String query = params.get("query")[0]; - String rowQuery = params.get("rowRecordOption")[0]; - String start = params.get("start")[0]; - String fetch = params.get("fetch")[0]; + String table = HttpUtil.getFirstParam(params.get("table")); + String query = HttpUtil.getFirstParam(params.get("query")); + String rowQuery = HttpUtil.getFirstParam(params.get("rowRecordOption")); + String start = HttpUtil.getFirstParam(params.get("start")); + String fetch = HttpUtil.getFirstParam(params.get("fetch")); String[] families = params.get("families[]"); + String securityUser = HttpUtil.getFirstParam(params.get("securityUser")); if (query.indexOf("rowid:") >= 0) { - return fetchRow(table, query, families, remoteHost); + return fetchRow(table, query, families, remoteHost, securityUser); } if (families == null || families.length == 0) { - return fullTextSearch(table, query, remoteHost); + return fullTextSearch(table, query, remoteHost, securityUser); } - return searchAndFetch(table, query, rowQuery, start, fetch, families, remoteHost); + return searchAndFetch(table, query, rowQuery, start, fetch, families, remoteHost, securityUser); } @SuppressWarnings({ "unchecked", "rawtypes" }) - private static Map<String, Object> searchAndFetch(String table, String query, String rowQuery, String start, String fetch, String[] families, String remoteHost) throws IOException, TException { + private static Map<String, Object> searchAndFetch(String table, String query, String rowQuery, String start, String fetch, String[] families, String remoteHost, String securityUser) throws IOException, TException { try { - Iface client = Config.getClient(remoteHost); + Iface client = Config.getClient(remoteHost, securityUser); boolean recordsOnly = RECORD_RECORD_OPTION.equalsIgnoreCase(rowQuery); @@ -84,6 +85,7 @@ public class SearchUtil { blurQuery.setQuery(q); blurQuery.setStart(Long.parseLong(start)); blurQuery.setFetch(Integer.parseInt(fetch)); + blurQuery.setUserContext(remoteHost); Selector s = new Selector(); s.setRecordOnly(recordsOnly); @@ -138,14 +140,15 @@ public class SearchUtil { } } - private static Map<String, Object> fullTextSearch(String table, String query, String remoteHost) throws IOException, TException { + private static Map<String, Object> fullTextSearch(String table, String query, String remoteHost, String securityUser) throws IOException, TException { try { - Iface client = Config.getClient(remoteHost); + Iface client = Config.getClient(remoteHost, securityUser); BlurQuery blurQuery = new BlurQuery(); Query q = new Query(query, true, ScoreType.SUPER, null, null); blurQuery.setQuery(q); + blurQuery.setUserContext(remoteHost); BlurResults blurResults = client.query(table, blurQuery); Map<String, Object> results = new HashMap<String, Object>(); @@ -157,9 +160,9 @@ public class SearchUtil { } @SuppressWarnings({ "unchecked", "rawtypes" }) - private static Map<String, Object> fetchRow(String table, String query, String[] families, String remoteHost) throws IOException, TException { + private static Map<String, Object> fetchRow(String table, String query, String[] families, String remoteHost, String securityUser) throws IOException, TException { try { - Iface client = Config.getClient(remoteHost); + Iface client = Config.getClient(remoteHost, securityUser); Selector selector = new Selector(); String rowid = StringUtils.remove(query, "rowid:");
