/* * (C) Copyright 2011-2016 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed 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. * * Contributors: * tdelprat, jcarsique * */ package org.nuxeo.wizard; import static org.nuxeo.common.Environment.NUXEO_DATA_DIR; import static org.nuxeo.launcher.config.ConfigurationGenerator.DB_EXCLUDE_CHECK_LIST; import static org.nuxeo.launcher.config.ConfigurationGenerator.DB_NOSQL_LIST; import static org.nuxeo.launcher.config.ConfigurationGenerator.INSTALL_AFTER_RESTART; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_BIND_ADDRESS; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_DB_HOST; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_DB_NAME; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_DB_PORT; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_DB_PWD; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_DB_USER; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_MONGODB_NAME; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_MONGODB_SERVER; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_TEMPLATE_DBNAME; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_TEMPLATE_DBNOSQL_NAME; import static org.nuxeo.launcher.config.ConfigurationGenerator.PARAM_WIZARD_DONE; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.URLEncoder; import java.net.UnknownHostException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Map; import javax.naming.AuthenticationException; import javax.naming.NameNotFoundException; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuxeo.launcher.commons.DatabaseDriverException; import org.nuxeo.launcher.config.ConfigurationException; import org.nuxeo.launcher.config.ConfigurationGenerator; import org.nuxeo.wizard.context.Context; import org.nuxeo.wizard.context.ParamCollector; import org.nuxeo.wizard.download.DownloadablePackageOptions; import org.nuxeo.wizard.download.PackageDownloader; import org.nuxeo.wizard.helpers.ConnectRegistrationHelper; import org.nuxeo.wizard.helpers.IPValidator; import org.nuxeo.wizard.helpers.NumberValidator; import org.nuxeo.wizard.helpers.PackageDownloaderHelper; import org.nuxeo.wizard.nav.Page; import org.nuxeo.wizard.nav.SimpleNavigationHandler; /** * Main entry point : find the right handler and start jsp rendering * * @author Tiry (tdelprat@nuxeo.com) * @since 5.4.2 */ public class RouterServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected static Log log = LogFactory.getLog(RouterServlet.class); protected SimpleNavigationHandler navHandler = SimpleNavigationHandler.instance(); public static final String CONNECT_TOKEN_KEY = "ConnectRegistrationToken"; protected String getAction(HttpServletRequest req) { String uri = req.getRequestURI(); int idx = uri.indexOf("?"); if (idx > 0) { uri = uri.substring(0, idx - 1); } String action = uri.replace(req.getContextPath() + "/router/", ""); if (action.startsWith("/")) { action = action.substring(1); } return action; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // process action handleAction(getAction(req), req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // store posted data Context.instance(req).getCollector().collectConfigurationParams(req); doGet(req, resp); } protected Method findhandler(Page currentPage, String verb) { String methodName = "handle" + currentPage.getAction() + verb; Method method = null; try { method = this.getClass().getMethod(methodName, Page.class, HttpServletRequest.class, HttpServletResponse.class); } catch (Exception e) { // fall back to default Handler lookup methodName = "handleDefault" + verb; try { method = this.getClass().getMethod(methodName, Page.class, HttpServletRequest.class, HttpServletResponse.class); } catch (Exception e2) { log.error("Unable to resolve default handler for " + verb, e); } } return method; } protected void handleAction(String action, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // locate page Page currentPage = navHandler.getCurrentPage(action); if (currentPage == null) { resp.sendError(404, "Action " + action + " is not supported"); return; } // find action handler Method handler = findhandler(currentPage, req.getMethod()); if (handler == null) { resp.sendError(500, "No handler found for " + action); return; } // execute handler => triggers rendering try { handler.invoke(this, currentPage, req, resp); } catch (Exception e) { log.error("Error during handler execution", e); req.setAttribute("error", e); req.getRequestDispatcher("/error.jsp").forward(req, resp); } } // default handlers public void handleDefaultGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { currentPage.dispatchToJSP(req, resp); } public void handleDefaultPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // XXX validate data currentPage.next().dispatchToJSP(req, resp, true); } // custom handlers public void handleConnectGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("popupUrl", req.getContextPath() + "/ConnectCallback?action=display"); handleDefaultGET(currentPage, req, resp); } public void handleConnectCallbackGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); String token = req.getParameter(CONNECT_TOKEN_KEY); String action = req.getParameter("action"); String targetNav = null; if (action == null || action.isEmpty()) { action = "skip"; } if (action.equals("register") && (token == null || token.isEmpty())) { action = "skip"; } if ("register".equals(action)) { // store the registration info Map<String, String> connectMap = new HashMap<>(); Context context = Context.instance(req); if (token != null) { String tokenData = new String(Base64.decodeBase64(token)); String[] tokenDataLines = tokenData.split("\n"); for (String line : tokenDataLines) { String[] parts = line.split(":"); if (parts.length > 1) { connectMap.put(parts[0], parts[1]); } } context.storeConnectMap(connectMap); } // Save CLID if (context.isConnectRegistrationDone()) { // save Connect registration ConnectRegistrationHelper.saveConnectRegistrationFile(context); } // deactivate the confirm form SimpleNavigationHandler.instance().deactivatePage("ConnectFinish"); // go to the next page targetNav = currentPage.next().getAction(); } else if ("skip".equals(action)) { // activate the confirm form SimpleNavigationHandler.instance().activatePage("ConnectFinish"); // go to it targetNav = currentPage.next().getAction(); } else if ("prev".equals(action)) { targetNav = currentPage.prev().prev().getAction(); } else if ("display".equals(action)) { // compute CB url String cbUrl = req.getRequestURL().toString(); cbUrl = cbUrl.replace("/router/" + currentPage.getAction(), "/ConnectCallback?cb=yes"); // In order to avoid any issue with badly configured reverse proxies // => get url from the client side if (ctx.getBaseUrl() != null) { cbUrl = ctx.getBaseUrl() + "ConnectCallback?cb=yes"; } cbUrl = URLEncoder.encode(cbUrl, "UTF-8"); String redirect = ctx.getCollector().getConfigurationParam("org.nuxeo.connect.url", "https://connect.nuxeo.com/nuxeo/site/") + "../../register/#/embedded?wizardCallbackUrl=" + cbUrl + "&pkg=" + ctx.getDistributionKey(); resp.sendRedirect(redirect); return; } String targetUrl = req.getContextPath() + "/" + targetNav; req.setAttribute("targetUrl", targetUrl); handleDefaultGET(currentPage, req, resp); } public void handleConnectFinishGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // get the connect Token and decode associated infos String token = req.getParameter(CONNECT_TOKEN_KEY); Map<String, String> connectMap = new HashMap<>(); if (token != null) { String tokenData = new String(Base64.decodeBase64(token)); String[] tokenDataLines = tokenData.split("\n"); for (String line : tokenDataLines) { String[] parts = line.split(":"); if (parts.length > 1) { connectMap.put(parts[0], parts[1]); } } Context.instance(req).storeConnectMap(connectMap); } handleDefaultGET(currentPage, req, resp); } public void handleDBPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); String templateDbName = collector.getConfigurationParam(PARAM_TEMPLATE_DBNAME); String templateDbNoSQLName = collector.getConfigurationParam(PARAM_TEMPLATE_DBNOSQL_NAME); if ("true".equals(req.getParameter("refresh"))) { collector.changeDBTemplate(templateDbName); collector.changeDBTemplate(templateDbNoSQLName); collector.removeDbKeys(); currentPage.dispatchToJSP(req, resp); return; } // Check relational database if (!DB_EXCLUDE_CHECK_LIST.contains(templateDbName)) { if (collector.getConfigurationParam(PARAM_DB_NAME).isEmpty()) { ctx.trackError(PARAM_DB_NAME, "error.dbname.required"); } if (collector.getConfigurationParam(PARAM_DB_USER).isEmpty()) { ctx.trackError(PARAM_DB_USER, "error.dbuser.required"); } if (collector.getConfigurationParam(PARAM_DB_PWD).isEmpty()) { ctx.trackError(PARAM_DB_PWD, "error.dbpassword.required"); } if (collector.getConfigurationParam(PARAM_DB_HOST).isEmpty()) { ctx.trackError(PARAM_DB_HOST, "error.dbhost.required"); } if (collector.getConfigurationParam(PARAM_DB_PORT).isEmpty()) { ctx.trackError(PARAM_DB_PORT, "error.dbport.required"); } else { if (!NumberValidator.validate(collector.getConfigurationParam(PARAM_DB_PORT))) { ctx.trackError(PARAM_DB_PORT, "error.invalid.port"); } else { int dbPort = Integer.parseInt(collector.getConfigurationParam(PARAM_DB_PORT)); if (dbPort < 1024 || dbPort > 65536) { ctx.trackError(PARAM_DB_PORT, "error.invalid.port"); } } } ConfigurationGenerator cg = collector.getConfigurationGenerator(); try { cg.checkDatabaseConnection(templateDbName, collector.getConfigurationParam(PARAM_DB_NAME), collector.getConfigurationParam(PARAM_DB_USER), collector.getConfigurationParam(PARAM_DB_PWD), collector.getConfigurationParam(PARAM_DB_HOST), collector.getConfigurationParam(PARAM_DB_PORT)); } catch (DatabaseDriverException e) { ctx.trackError(PARAM_DB_NAME, "error.db.driver.notfound"); log.warn(e); } catch (SQLException e) { ctx.trackError(PARAM_DB_NAME, "error.db.connection"); log.warn(e); } } // Check NoSQL database if (!DB_EXCLUDE_CHECK_LIST.contains(templateDbNoSQLName) && DB_NOSQL_LIST.contains(templateDbNoSQLName)) { if (collector.getConfigurationParam(PARAM_MONGODB_NAME).isEmpty()) { ctx.trackError(PARAM_MONGODB_NAME, "error.dbname.required"); } if (collector.getConfigurationParam(PARAM_MONGODB_SERVER).isEmpty()) { ctx.trackError(PARAM_MONGODB_SERVER, "error.dburi.required"); } } if (ctx.hasErrors()) { currentPage.dispatchToJSP(req, resp); } else { currentPage.next().dispatchToJSP(req, resp, true); } } public void handleUserPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); String refreshParam = req.getParameter("refresh"); String directoryType = collector.getConfigurationParam("nuxeo.directory.type"); if ("true".equals(refreshParam)) { currentPage.dispatchToJSP(req, resp); return; } if ("checkNetwork".equals(refreshParam) || "checkAuth".equals(refreshParam) || "checkUserLdapParam".equals(refreshParam) || "checkGroupLdapParam".equals(refreshParam)) { try { if ("checkNetwork".equals(refreshParam)) { bindLdapConnection(collector, false); ctx.trackInfo("nuxeo.ldap.url", "info.host.found"); } else if ("checkAuth".equals(refreshParam)) { bindLdapConnection(collector, true); ctx.trackInfo("nuxeo.ldap.auth", "info.auth.success"); } else { DirContext dirContext = new InitialDirContext(getContextEnv(collector, true)); String searchScope; String searchBaseDn; String searchClass; String searchFilter; if ("checkUserLdapParam".equals(refreshParam)) { searchBaseDn = collector.getConfigurationParam("nuxeo.ldap.user.searchBaseDn"); searchScope = collector.getConfigurationParam("nuxeo.ldap.user.searchScope"); searchClass = collector.getConfigurationParam("nuxeo.ldap.user.searchClass"); searchFilter = collector.getConfigurationParam("nuxeo.ldap.user.searchFilter"); } else { searchBaseDn = collector.getConfigurationParam("nuxeo.ldap.group.searchBaseDn"); searchScope = collector.getConfigurationParam("nuxeo.ldap.group.searchScope"); searchFilter = collector.getConfigurationParam("nuxeo.ldap.group.searchFilter"); searchClass = ""; } SearchControls scts = new SearchControls(); if ("onelevel".equals(searchScope)) { scts.setSearchScope(SearchControls.ONELEVEL_SCOPE); } else { scts.setSearchScope(SearchControls.SUBTREE_SCOPE); } String filter = String.format("(&(%s)(objectClass=%s))", searchFilter.isEmpty() ? "objectClass=*" : searchFilter, searchClass.isEmpty() ? "*" : searchClass); NamingEnumeration<SearchResult> results; try { results = dirContext.search(searchBaseDn, filter, scts); if (!results.hasMore()) { ctx.trackError("nuxeo.ldap.search", "error.ldap.noresult"); } else { SearchResult result = results.next(); if (searchBaseDn.equalsIgnoreCase(result.getNameInNamespace()) && results.hasMore()) { // try not to display the root of the search // base DN result = results.next(); } ctx.trackInfo("dn", result.getNameInNamespace()); Attributes attributes = result.getAttributes(); NamingEnumeration<String> ids = attributes.getIDs(); String id; StringBuilder sb; while (ids.hasMore()) { id = ids.next(); NamingEnumeration<?> values = attributes.get(id).getAll(); sb = new StringBuilder(); while (values.hasMore()) { sb.append(values.next()).append(" , "); } ctx.trackInfo(id, sb.substring(0, sb.length() - 3)); } } } catch (NameNotFoundException e) { ctx.trackError("nuxeo.ldap.search", "error.ldap.searchBaseDn"); log.warn(e); } dirContext.close(); } } catch (AuthenticationException e) { ctx.trackError("nuxeo.ldap.auth", "error.auth.failed"); log.warn(e); } catch (NamingException e) { ctx.trackError("nuxeo.ldap.url", "error.host.not.found"); log.warn(e); } } // Form submit if (!"default".equals(directoryType) && refreshParam.isEmpty()) { // first check bind to LDAP server try { bindLdapConnection(collector, true); } catch (NamingException e) { ctx.trackError("nuxeo.ldap.auth", "error.ldap.bind.failed"); log.warn(e); } // then check mandatory fields if (collector.getConfigurationParam("nuxeo.ldap.user.searchBaseDn").isEmpty()) { ctx.trackError("nuxeo.ldap.user.searchBaseDn", "error.user.searchBaseDn.required"); } if (collector.getConfigurationParam("nuxeo.ldap.user.mapping.rdn").isEmpty()) { ctx.trackError("nuxeo.ldap.user.mapping.rdn", "error.user.rdn.required"); } if (collector.getConfigurationParam("nuxeo.ldap.user.mapping.username").isEmpty()) { ctx.trackError("nuxeo.ldap.user.mapping.username", "error.user.username.required"); } if (collector.getConfigurationParam("nuxeo.ldap.user.mapping.password").isEmpty()) { ctx.trackError("nuxeo.ldap.user.mapping.password", "error.user.password.required"); } if (collector.getConfigurationParam("nuxeo.ldap.user.mapping.firstname").isEmpty()) { ctx.trackError("nuxeo.ldap.user.mapping.firstname", "error.user.firstname.required"); } if (collector.getConfigurationParam("nuxeo.ldap.user.mapping.lastname").isEmpty()) { ctx.trackError("nuxeo.ldap.user.mapping.lastname", "error.user.lastname.required"); } String userGroupStorage = collector.getConfigurationParam("nuxeo.user.group.storage"); if (!"userLdapOnly".equals(userGroupStorage) && !"multiUserSqlGroup".equals(userGroupStorage)) { if (collector.getConfigurationParam("nuxeo.ldap.group.searchBaseDn").isEmpty()) { ctx.trackError("nuxeo.ldap.group.searchBaseDn", "error.group.searchBaseDn.required"); } if (collector.getConfigurationParam("nuxeo.ldap.group.mapping.rdn").isEmpty()) { ctx.trackError("nuxeo.ldap.group.mapping.rdn", "error.group.rdn.required"); } if (collector.getConfigurationParam("nuxeo.ldap.group.mapping.name").isEmpty()) { ctx.trackError("nuxeo.ldap.group.mapping.name", "error.group.name.required"); } } if ("true".equals(collector.getConfigurationParam("nuxeo.user.emergency.enable"))) { if (collector.getConfigurationParam("nuxeo.user.emergency.username").isEmpty()) { ctx.trackError("nuxeo.user.emergency.username", "error.emergency.username.required"); } if (collector.getConfigurationParam("nuxeo.user.emergency.password").isEmpty()) { ctx.trackError("nuxeo.user.emergency.password", "error.emergency.password.required"); } } } if (ctx.hasErrors() || ctx.hasInfos()) { currentPage.dispatchToJSP(req, resp); } else { currentPage.next().dispatchToJSP(req, resp, true); } } private Hashtable<Object, Object> getContextEnv(ParamCollector collector, boolean checkAuth) { String ldapUrl = collector.getConfigurationParam("nuxeo.ldap.url"); String ldapBindDn = collector.getConfigurationParam("nuxeo.ldap.binddn"); String ldapBindPassword = collector.getConfigurationParam("nuxeo.ldap.bindpassword"); ConfigurationGenerator cg = collector.getConfigurationGenerator(); return cg.getContextEnv(ldapUrl, ldapBindDn, ldapBindPassword, checkAuth); } private void bindLdapConnection(ParamCollector collector, boolean authenticate) throws NamingException { ConfigurationGenerator cg = collector.getConfigurationGenerator(); cg.checkLdapConnection(getContextEnv(collector, authenticate)); } public void handleSmtpPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); if (collector.getConfigurationParam("mail.transport.auth").equals("true")) { if (collector.getConfigurationParam("mail.transport.user").isEmpty()) { ctx.trackError("mail.transport.user", "error.mail.transport.user.required"); } if (collector.getConfigurationParam("mail.transport.password").isEmpty()) { ctx.trackError("mail.transport.password", "error.mail.transport.password.required"); } } if (!collector.getConfigurationParam("mail.transport.port").isEmpty()) { if (!NumberValidator.validate(collector.getConfigurationParam("mail.transport.port"))) { ctx.trackError("mail.transport.port", "error.mail.transport.port.mustbeanumber"); } } if (ctx.hasErrors()) { currentPage.dispatchToJSP(req, resp); } else { currentPage.next().dispatchToJSP(req, resp, true); } } public void handleRecapPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); ConfigurationGenerator cg = collector.getConfigurationGenerator(); // Mark package selection done PackageDownloaderHelper.markPackageSelectionDone(ctx); Map<String, String> changedParameters = collector.getConfigurationParams(); changedParameters.put(PARAM_WIZARD_DONE, "true"); try { // save config cg.saveFilteredConfiguration(changedParameters); // // => page will trigger the restart // new Page("", "reStarting.jsp").dispatchToJSP(req, resp); currentPage.next().dispatchToJSP(req, resp, true); } catch (ConfigurationException e) { log.error("Could not save wizard parameters.", e); currentPage.dispatchToJSP(req, resp); } } public void handleGeneralPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); String bindAddress = collector.getConfigurationParamValue(PARAM_BIND_ADDRESS); if (bindAddress != null && !bindAddress.isEmpty()) { if (!IPValidator.validate(bindAddress)) { ctx.trackError(PARAM_BIND_ADDRESS, "error.invalid.ip"); } try { InetAddress inetAddress = InetAddress.getByName(bindAddress); ConfigurationGenerator.checkAddressReachable(inetAddress); } catch (UnknownHostException e) { ctx.trackError(PARAM_BIND_ADDRESS, "error.invalid.ip"); } catch (ConfigurationException e) { ctx.trackError(PARAM_BIND_ADDRESS, "error.already.used.ip"); } } if (ctx.hasErrors()) { currentPage.dispatchToJSP(req, resp); } else { currentPage.next().dispatchToJSP(req, resp, true); } } public void handleHomeGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); if (PackageDownloaderHelper.isPackageSelectionDone(ctx)) { navHandler.deactivatePage("PackagesSelection"); navHandler.deactivatePage("PackagesDownload"); navHandler.activatePage("PackagesSelectionDone"); } handleDefaultGET(currentPage, req, resp); } public void handleHomePOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String baseUrl = req.getParameter("baseUrl"); if (baseUrl != null && !baseUrl.isEmpty()) { if (baseUrl.endsWith("Home")) { baseUrl = baseUrl.substring(0, baseUrl.length() - 4); Context.instance(req).setBaseUrl(baseUrl); } } String browserInternetAccess = req.getParameter("browserInternetAccess"); if ("true".equals(browserInternetAccess)) { Context.instance(req).setBrowserInternetAccess(true); SimpleNavigationHandler.instance().deactivatePage("NetworkBlocked"); SimpleNavigationHandler.instance().activatePage("Connect"); } else { Context.instance(req).setBrowserInternetAccess(false); SimpleNavigationHandler.instance().activatePage("NetworkBlocked"); SimpleNavigationHandler.instance().deactivatePage("Connect"); } currentPage.next().dispatchToJSP(req, resp, true); } public void handleProxyPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Context ctx = Context.instance(req); ParamCollector collector = ctx.getCollector(); String proxyType = collector.getConfigurationParamValue("nuxeo.http.proxy.type"); if ("none".equals(proxyType)) { collector.addConfigurationParam("nuxeo.http.proxy.type", null); collector.addConfigurationParam("nuxeo.http.proxy.login", null); collector.addConfigurationParam("nuxeo.http.proxy.password", null); collector.addConfigurationParam("nuxeo.http.proxy.host", null); collector.addConfigurationParam("nuxeo.http.proxy.port", null); collector.addConfigurationParam("nuxeo.http.proxy.ntml.host", null); collector.addConfigurationParam("nuxeo.http.proxy.ntml.domain", null); if (!PackageDownloaderHelper.isPackageSelectionDone(ctx)) { PackageDownloader.instance().setProxy(null, 0, null, null, null, null); } } else { if (!NumberValidator.validate(collector.getConfigurationParam("nuxeo.http.proxy.port"))) { ctx.trackError("nuxeo.http.proxy.port", "error.nuxeo.http.proxy.port"); } if (collector.getConfigurationParam("nuxeo.http.proxy.host").isEmpty()) { ctx.trackError("nuxeo.http.proxy.host", "error.nuxeo.http.proxy.emptyHost"); } if ("anonymous".equals(proxyType)) { collector.addConfigurationParam("nuxeo.http.proxy.login", null); collector.addConfigurationParam("nuxeo.http.proxy.password", null); collector.addConfigurationParam("nuxeo.http.proxy.ntml.host", null); collector.addConfigurationParam("nuxeo.http.proxy.ntml.domain", null); if (!ctx.hasErrors()) { if (!PackageDownloaderHelper.isPackageSelectionDone(ctx)) { PackageDownloader.instance().setProxy( collector.getConfigurationParamValue("nuxeo.http.proxy.host"), Integer.parseInt(collector.getConfigurationParamValue("nuxeo.http.proxy.port")), null, null, null, null); } } } else { if (collector.getConfigurationParam("nuxeo.http.proxy.login").isEmpty()) { ctx.trackError("nuxeo.http.proxy.login", "error.nuxeo.http.proxy.emptyLogin"); } else { if (!ctx.hasErrors()) { if (!PackageDownloaderHelper.isPackageSelectionDone(ctx)) { PackageDownloader.instance().setProxy( collector.getConfigurationParamValue("nuxeo.http.proxy.host"), Integer.parseInt(collector.getConfigurationParamValue("nuxeo.http.proxy.port")), collector.getConfigurationParamValue("nuxeo.http.proxy.login"), collector.getConfigurationParamValue("nuxeo.http.proxy.password"), collector.getConfigurationParamValue("nuxeo.http.proxy.ntlm.host"), collector.getConfigurationParamValue("nuxeo.http.proxy.ntml.domain")); } } } } } if (ctx.hasErrors()) { currentPage.dispatchToJSP(req, resp); } else { currentPage.next().dispatchToJSP(req, resp, true); } } public void handleResetGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws IOException { // reset Context.reset(); SimpleNavigationHandler.reset(); PackageDownloader.reset(); // return to first page String target = "/" + req.getContextPath() + "/" + SimpleNavigationHandler.instance().getDefaultPage().getAction(); if (target.startsWith("//")) { target = target.substring(1); } resp.sendRedirect(target); } public void handlePackageOptionsResourceGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws IOException { DownloadablePackageOptions options = PackageDownloader.instance().getPackageOptions(); resp.setContentType("text/json"); resp.getWriter().write(options.asJson()); } public void handlePackagesSelectionGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { handleDefaultGET(currentPage, req, resp); } public void handlePackagesSelectionPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<String> options = new ArrayList<>(); Enumeration<String> params = req.getParameterNames(); while (params.hasMoreElements()) { String p = params.nextElement(); if ("on".equals(req.getParameter(p))) { options.add(p); } } PackageDownloader.instance().selectOptions(options); currentPage.next().dispatchToJSP(req, resp, true); } public void handlePackagesDownloadGET(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if ("true".equals(req.getParameter("startDownload"))) { PackageDownloader.instance().startDownload(); } else if (req.getParameter("reStartDownload") != null) { PackageDownloader.instance().reStartDownload(req.getParameter("reStartDownload")); } currentPage.dispatchToJSP(req, resp); } public void handlePackagesDownloadPOST(Page currentPage, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ParamCollector collector = Context.instance(req).getCollector(); String installationFilePath = new File(collector.getConfigurationParam(NUXEO_DATA_DIR), INSTALL_AFTER_RESTART).getAbsolutePath(); PackageDownloader.instance().scheduleDownloadedPackagesForInstallation(installationFilePath); PackageDownloader.reset(); currentPage.next().dispatchToJSP(req, resp, true); } }