/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and/or its affiliates * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech * Jens Reimann <jreimann@redhat.com> - Fix possible NPE, cleanup *******************************************************************************/ package org.eclipse.kura.web; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletException; import org.eclipse.kura.configuration.ConfigurableComponent; import org.eclipse.kura.configuration.KuraConfigReadyEvent; import org.eclipse.kura.crypto.CryptoService; import org.eclipse.kura.system.SystemService; import org.eclipse.kura.web.server.GwtCertificatesServiceImpl; import org.eclipse.kura.web.server.GwtCloudServiceImpl; import org.eclipse.kura.web.server.GwtComponentServiceImpl; import org.eclipse.kura.web.server.GwtDeviceServiceImpl; import org.eclipse.kura.web.server.GwtNetworkServiceImpl; import org.eclipse.kura.web.server.GwtPackageServiceImpl; import org.eclipse.kura.web.server.GwtSecurityServiceImpl; import org.eclipse.kura.web.server.GwtSecurityTokenServiceImpl; import org.eclipse.kura.web.server.GwtSettingServiceImpl; import org.eclipse.kura.web.server.GwtSnapshotServiceImpl; import org.eclipse.kura.web.server.GwtSslServiceImpl; import org.eclipse.kura.web.server.GwtStatusServiceImpl; import org.eclipse.kura.web.server.servlet.DeviceSnapshotsServlet; import org.eclipse.kura.web.server.servlet.FileServlet; import org.eclipse.kura.web.server.servlet.SkinServlet; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; import org.osgi.service.event.EventProperties; import org.osgi.service.http.HttpContext; import org.osgi.service.http.HttpService; import org.osgi.service.http.NamespaceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Console implements ConfigurableComponent { private static final Logger s_logger = LoggerFactory.getLogger(Console.class); private static final String SERVLET_ALIAS_ROOT = "servlet.alias.root"; private static final String APP_ROOT = "app.root"; private static final String CONSOLE_PASSWORD = "console.password.value"; private static final String CONSOLE_USERNAME = "console.username.value"; private static String s_aliasRoot; private static String s_appRoot; private static ComponentContext s_context; private HttpService m_httpService; private SystemService m_systemService; private CryptoService m_cryptoService; private Map<String, Object> m_properties; private EventAdmin m_eventAdmin; private AuthenticationManager authMgr; // ---------------------------------------------------------------- // // Dependencies // // ---------------------------------------------------------------- public void setHttpService(HttpService httpService) { this.m_httpService = httpService; } public void unsetHttpService(HttpService httpService) { this.m_httpService = null; } public void setSystemService(SystemService systemService) { this.m_systemService = systemService; } public void unsetSystemService(SystemService systemService) { this.m_systemService = null; } public void setCryptoService(CryptoService cryptoService) { this.m_cryptoService = cryptoService; } public void unsetCryptoService(CryptoService cryptoService) { this.m_cryptoService = null; } public void setEventAdminService(EventAdmin eventAdmin) { this.m_eventAdmin = eventAdmin; } public void unsetEventAdminService(EventAdmin eventAdmin) { this.m_eventAdmin = null; } // ---------------------------------------------------------------- // // Activation APIs // // ---------------------------------------------------------------- protected void activate(ComponentContext context, Map<String, Object> properties) { try { // Check if web interface is enabled. boolean webEnabled = Boolean.parseBoolean(this.m_systemService.getKuraWebEnabled()); if (webEnabled) { s_logger.info("activate..."); s_context = context; s_aliasRoot = (String) properties.get(SERVLET_ALIAS_ROOT); s_appRoot = (String) properties.get(APP_ROOT); String servletRoot = s_aliasRoot; this.m_properties = new HashMap<String, Object>(); Iterator<String> keys = properties.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); Object value = properties.get(key); this.m_properties.put(key, value); } Object pwdProp = properties.get(CONSOLE_PASSWORD); char[] propertyPassword = null; if (pwdProp instanceof char[]) { propertyPassword = (char[]) properties.get(CONSOLE_PASSWORD); } else { propertyPassword = properties.get(CONSOLE_PASSWORD).toString().toCharArray(); } try { propertyPassword = this.m_cryptoService.decryptAes(propertyPassword); } catch (Exception e) { } Object value = properties.get(CONSOLE_PASSWORD); char[] decryptedPassword = null; try { decryptedPassword = this.m_cryptoService.decryptAes(((String) value).toCharArray()); } catch (Exception e) { decryptedPassword = value.toString().toCharArray(); } propertyPassword = this.m_cryptoService.sha1Hash(new String(decryptedPassword)).toCharArray(); String registeredUsername = (String) properties.get(CONSOLE_USERNAME); this.authMgr = new AuthenticationManager(registeredUsername, propertyPassword); initHTTPService(this.authMgr, servletRoot); Map<String, Object> props = new HashMap<String, Object>(); props.put("kura.version", this.m_systemService.getKuraVersion()); EventProperties eventProps = new EventProperties(props); s_logger.info("postInstalledEvent() :: posting KuraConfigReadyEvent"); this.m_eventAdmin.postEvent(new Event(KuraConfigReadyEvent.KURA_CONFIG_EVENT_READY_TOPIC, eventProps)); } else { s_logger.info("Web interface disabled in Kura properties file."); } } catch (Throwable t) { s_logger.warn("Error Registering Web Resources", t); } } protected void updated(Map<String, Object> properties) { boolean webEnabled = Boolean.parseBoolean(this.m_systemService.getKuraWebEnabled()); if (!webEnabled) { return; } char[] propertyPassword = null; String registeredUsername = (String) properties.get(CONSOLE_USERNAME); this.authMgr.updateUsername(registeredUsername); try { Object value = properties.get(CONSOLE_PASSWORD); char[] decryptedPassword = null; try { decryptedPassword = this.m_cryptoService.decryptAes(((String) value).toCharArray()); } catch (Exception e) { decryptedPassword = value.toString().toCharArray(); } propertyPassword = this.m_cryptoService.sha1Hash(new String(decryptedPassword)).toCharArray(); this.authMgr.updatePassword(propertyPassword); } catch (Exception e) { s_logger.warn("Error Updating Web properties", e); } } protected void deactivate(BundleContext context) { s_logger.info("deactivate..."); s_context = null; unregisterServlet(); } // ---------------------------------------------------------------- // // Private methods // // ---------------------------------------------------------------- private void unregisterServlet() { String servletRoot = s_aliasRoot; this.m_httpService.unregister("/"); this.m_httpService.unregister(s_appRoot); this.m_httpService.unregister(s_aliasRoot); this.m_httpService.unregister(servletRoot + "/status"); this.m_httpService.unregister(servletRoot + "/device"); this.m_httpService.unregister(servletRoot + "/network"); this.m_httpService.unregister(servletRoot + "/component"); this.m_httpService.unregister(servletRoot + "/package"); this.m_httpService.unregister(servletRoot + "/snapshot"); this.m_httpService.unregister(servletRoot + "/setting"); this.m_httpService.unregister(servletRoot + "/file"); this.m_httpService.unregister(servletRoot + "/device_snapshots"); this.m_httpService.unregister(servletRoot + "/skin"); } public static BundleContext getBundleContext() { return s_context.getBundleContext(); } public static String getApplicationRoot() { return s_appRoot; } public static String getServletRoot() { return s_aliasRoot; } private void initHTTPService(AuthenticationManager authMgr, String servletRoot) throws NamespaceException, ServletException { // Initialize HttpService HttpContext httpCtx = new SecureBasicHttpContext(this.m_httpService.createDefaultHttpContext(), authMgr); this.m_httpService.registerResources("/", "www", httpCtx); this.m_httpService.registerResources(s_appRoot, "www/denali.html", httpCtx); this.m_httpService.registerResources(s_aliasRoot, "www" + s_aliasRoot, httpCtx); this.m_httpService.registerServlet(servletRoot + "/xsrf", new GwtSecurityTokenServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/status", new GwtStatusServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/device", new GwtDeviceServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/network", new GwtNetworkServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/component", new GwtComponentServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/package", new GwtPackageServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/snapshot", new GwtSnapshotServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/setting", new GwtSettingServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/certificate", new GwtCertificatesServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/security", new GwtSecurityServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/file", new FileServlet(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/device_snapshots", new DeviceSnapshotsServlet(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/skin", new SkinServlet(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/ssl", new GwtSslServiceImpl(), null, httpCtx); this.m_httpService.registerServlet(servletRoot + "/cloudservices", new GwtCloudServiceImpl(), null, httpCtx); } }