From ff4acdfe13030849ad26d8471a345dbc6878c691 Mon Sep 17 00:00:00 2001 From: Kalyn Stricklin Date: Wed, 30 Jul 2025 20:19:21 -0500 Subject: [PATCH] Updated landing page service to include all services, and moved error page handling to admin module --- .../sensorhub/impl/service/HttpServer.java | 4 + .../java/org/sensorhub/ui/AdminUIModule.java | 14 +- .../java/org/sensorhub/ui/LandingServlet.java | 6 +- .../main/java/org/sensorhub/ui/LandingUI.java | 386 ++++++++---------- .../resources/icons/OpenSensorHub-Logo.png | Bin 0 -> 36109 bytes 5 files changed, 201 insertions(+), 209 deletions(-) create mode 100644 sensorhub-webui-core/src/main/resources/icons/OpenSensorHub-Logo.png diff --git a/sensorhub-core/src/main/java/org/sensorhub/impl/service/HttpServer.java b/sensorhub-core/src/main/java/org/sensorhub/impl/service/HttpServer.java index 7ec8e8241..890d0b056 100644 --- a/sensorhub-core/src/main/java/org/sensorhub/impl/service/HttpServer.java +++ b/sensorhub-core/src/main/java/org/sensorhub/impl/service/HttpServer.java @@ -534,4 +534,8 @@ public boolean isAuthEnabled() { return config.authMethod != AuthMethod.NONE; } + + public ServletContextHandler getServletHandler() { + return servletHandler; + } } diff --git a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/AdminUIModule.java b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/AdminUIModule.java index 738640cad..40bc36438 100644 --- a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/AdminUIModule.java +++ b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/AdminUIModule.java @@ -21,6 +21,7 @@ import java.util.logging.LogManager; import com.vaadin.server.VaadinServlet; +import org.eclipse.jetty.servlet.ErrorPageErrorHandler; import org.sensorhub.api.comm.CommProviderConfig; import org.sensorhub.api.comm.NetworkConfig; import org.sensorhub.api.common.SensorHubException; @@ -41,6 +42,7 @@ import org.sensorhub.impl.datastore.view.ObsSystemDatabaseViewConfig; import org.sensorhub.impl.security.BasicSecurityRealmConfig; import org.sensorhub.impl.service.AbstractHttpServiceModule; +import org.sensorhub.impl.service.HttpServer; import org.sensorhub.impl.service.HttpServerConfig; import org.sensorhub.impl.service.sos.SOSServiceConfig; import org.sensorhub.impl.service.sps.SPSServiceConfig; @@ -164,12 +166,13 @@ protected void doStart() throws SensorHubException Map initLandingParams = new HashMap<>(); initLandingParams.put(SERVLET_PARAM_UI_CLASS, LandingUI.class.getCanonicalName()); + if (config.widgetSet != null) initLandingParams.put(WIDGETSET, config.widgetSet); initLandingParams.put("productionMode", "true"); // set to false to compile theme on-the-fly initLandingParams.put("heartbeatInterval", Integer.toString(HEARTBEAT_INTERVAL)); // deploy servlet // HACK: we have to disable std err to hide message due to Vaadin duplicate implementation of SL4J - // Note that this may hide error messages in other modules now that startup sequence is multithreaded + // Note that this may hide error messages in oth er modules now that startup sequence is multithreaded PrintStream oldStdErr = System.err; System.setErr(new PrintStream(new OutputStream() { @Override @@ -184,6 +187,15 @@ public void write(int b) { } adminUIServlet.getServletContext().setAttribute(SERVLET_PARAM_MODULE, this); landingServlet.getServletContext().setAttribute(SERVLET_PARAM_MODULE, this); httpServer.addServletSecurity("/*", true); + + var server = getParentHub().getModuleRegistry().getModuleByType(HttpServer.class); + + ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); + errorHandler.addErrorPage(400, "/error/invalid"); + errorHandler.addErrorPage(403, "/error/forbidden"); + errorHandler.addErrorPage(404, "/error/notfound"); + + server.getServletHandler().setErrorHandler(errorHandler); } else { httpServer.deployServlet(adminUIServlet, initParams, "/admin/*", "/VAADIN/*"); diff --git a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingServlet.java b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingServlet.java index 6908cbd20..01540ae52 100644 --- a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingServlet.java +++ b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingServlet.java @@ -58,7 +58,7 @@ protected void service(HttpServletRequest request, HttpServletResponse response) } if (!isIgnored(uri) && !hasAccess(request)) { - log.debug("Access Denied: Redirecting to " + redirectURL); + log.warn("Access Denied: Redirecting to " + redirectURL); response.sendRedirect(redirectURL); return; } @@ -68,7 +68,7 @@ protected void service(HttpServletRequest request, HttpServletResponse response) } catch (SecurityException e) { - log.debug("Access Forbidden: " + e.getMessage()); + log.warn("Access Forbidden: " + e.getMessage()); response.sendRedirect(redirectURL); } finally { securityHandler.clearCurrentUser(); @@ -103,7 +103,7 @@ private boolean hasAccess(HttpServletRequest request) { log.debug("Verifying permissions for "+ path); if (path.equals("/sensorhub/sos") && request.getQueryString() == null) { - log.debug("Blocked direct access to /sensorhub/sos with no query parameters."); + log.warn("Blocked direct access to /sensorhub/sos with no query parameters."); return false; } diff --git a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingUI.java b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingUI.java index aa31fc325..0b782040e 100644 --- a/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingUI.java +++ b/sensorhub-webui-core/src/main/java/org/sensorhub/ui/LandingUI.java @@ -11,21 +11,25 @@ import org.sensorhub.api.ISensorHub; import org.sensorhub.api.security.IPermission; import org.sensorhub.api.service.HttpServiceConfig; +import org.sensorhub.api.service.IServiceModule; import org.sensorhub.impl.module.ModuleRegistry; -import org.sensorhub.impl.service.consys.ConSysApiService; -import org.sensorhub.impl.service.sos.SOSService; +import org.sensorhub.impl.service.AbstractHttpServiceModule; import org.slf4j.Logger; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; -import java.util.ArrayList; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; import java.util.concurrent.Flow; /** * @author Kalyn Stricklin * @since Feb 2025 */ -@Theme("valo") + +@Theme("sensorhub") @Title("OpenSensorHub Landing Page") public class LandingUI extends UI{ @@ -34,12 +38,9 @@ public class LandingUI extends UI{ transient Logger log; transient ModuleRegistry moduleRegistry; transient AdminUISecurity securityHandler; - private String ip; - String hostname; - String user; transient Flow.Subscription moduleEventsSub; - + private final Map panelMap = new HashMap<>(); @Override protected void init(VaadinRequest vaadinRequest) { @@ -59,7 +60,6 @@ protected void init(VaadinRequest vaadinRequest) { //request logInitRequest(vaadinRequest); - //main layout VerticalLayout content = new VerticalLayout(); content.setSizeFull(); @@ -67,194 +67,63 @@ protected void init(VaadinRequest vaadinRequest) { content.setMargin(false); setContent(content); - //header Component header = buildHeader(); content.addComponent(header); content.setComponentAlignment(header, Alignment.TOP_CENTER); - - // logout button - Button logoutButton = new Button("Logout"); - logoutButton.setDescription("Logout from OSH node"); - logoutButton.setIcon(FontAwesome.SIGN_OUT); - logoutButton.addStyleName(ValoTheme.BUTTON_LARGE); - logoutButton.setWidth("200px"); - - getParentHub().getSecurityManager(); - logoutButton.addClickListener(new Button.ClickListener() { - @Override - public void buttonClick(Button.ClickEvent event) - { - final ConfirmDialog popup = new ConfirmDialog("Are you sure you want to logout?"); - popup.addCloseListener(new Window.CloseListener() { - @Override - public void windowClose(Window.CloseEvent e) - { - if (popup.isConfirmed()) - { - - - //disconnect from module registry - // unregister from module registry events - if (moduleEventsSub != null) - moduleEventsSub.cancel(); - - VaadinServletRequest request = (VaadinServletRequest) VaadinService.getCurrentRequest(); - HttpSession httpSession = request.getSession(false); - - if(httpSession != null){ - httpSession.invalidate(); - - } - - System.out.println("log out session: "+ getUI().getSession()); - getUI().getSession().close(); - - //set page to /sensorhub/logout - getUI().getPage().setLocation("/sensorhub/logout"); - - - } - } - }); - - addWindow(popup); - } - }); - + //logout button + Component logoutButton = createLogoutButton(); content.addComponent(logoutButton); content.setComponentAlignment(logoutButton, Alignment.TOP_CENTER); - - //create grid layout for buttons GridLayout grid = new GridLayout(2,2); grid.setMargin(true); grid.setSpacing(true); - //get all permissions avail - var permissions = getParentHub().getSecurityManager().getAllModulePermissions(); - - boolean hasWebAdmin = false; - boolean hasDiscovery = false; - boolean hasSos = false; - boolean hasCsapi = false; - - //iterate over permissions and add the card if permission - for(IPermission permission: permissions){ - -// boolean hasPermission = getParentModule().getSecurityHandler().hasPermission(permission); -// -// -// if(!hasPermission){ -// continue; -// } - - //check parenthub modules as well - - var modules = getParentHub().getModuleRegistry().getLoadedModules(); - - for(var module : modules){ - String permissionName = permission.getName(); - if (permissionName.contains("webadmin") && !hasWebAdmin && module instanceof AdminUIModule) { - var permissionsList = permission.getChildren().values(); + var modules = getParentHub().getModuleRegistry().getLoadedModules(); - var allowedPermissionsList = new ArrayList(); + for(var module : modules){ - for(IPermission perm: permissionsList){ + if(!(module instanceof AbstractHttpServiceModule) && !(module instanceof IServiceModule) || panelMap.containsKey(module.getClass().getCanonicalName())) + continue; - boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(perm); - - if(hasPerm){ - allowedPermissionsList.add(perm); - } - } - if(!allowedPermissionsList.isEmpty()){ - - grid.addComponent(createPanel("Admin Panel", "/admin", allowedPermissionsList.toString())); - hasWebAdmin = true; - } + //iterate over permissions and add the card if permission + Collection allModulePermissions = module.getParentHub().getSecurityManager().getAllModulePermissions(); + // check if module has any permissions + List matchingPerms = new ArrayList<>(); + for(IPermission permission: allModulePermissions) { + if (permission.getName().contains(module.getConfiguration().id)) { + matchingPerms.add(permission); } - else if (permissionName.contains("discoveryService") && !hasDiscovery && module.getClass().getSimpleName().equals("DiscoveryService")) { - var permissionsList = permission.getChildren().values(); - - var allowedPermissionsList = new ArrayList(); - - for(IPermission perm: permissionsList){ - - for(IPermission permChildren: perm.getChildren().values()){ - boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(permChildren); - - if(hasPerm){ - allowedPermissionsList.add(permChildren); - } - } - } - if(!allowedPermissionsList.isEmpty()){ - String path = ((HttpServiceConfig) module.getConfiguration()).endPoint; - - grid.addComponent(createPanel("Discovery Service", path, allowedPermissionsList.toString())); - hasDiscovery = true; - } - } - else if (permissionName.contains("sos") && !hasSos && module instanceof SOSService) { - var permissionsList = permission.getChildren().values(); - - var allowedPermissionsList = new ArrayList(); - - for(IPermission perm: permissionsList){ - - for(IPermission permChildren: perm.getChildren().values()){ - boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(permChildren); - - if(hasPerm){ - allowedPermissionsList.add(permChildren); - } - } - - } - if(!allowedPermissionsList.isEmpty()){ - String path = ((SOSService) module).getConfiguration().endPoint; - grid.addComponent(createPanel("SOS Service", path, allowedPermissionsList.toString())); - hasSos = true; - } + } - } - else if (permissionName.contains("csapi") && !hasCsapi && module instanceof ConSysApiService) { - var permissionsList = permission.getChildren().values(); + // check for allowed permissions + List allowedPermissions = new ArrayList<>(); + for(IPermission permission: matchingPerms) { + allowedPermissions.addAll(getAllowedPermissions(permission)); + } - var allowedPermissionsList = new ArrayList(); - for(IPermission perm: permissionsList){ + // if the system has permissions but the user is denied dont add panel + if(allowedPermissions.isEmpty() && !matchingPerms.isEmpty()) + continue; - boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(perm); + String path = null; - if(hasPerm){ - allowedPermissionsList.add(perm); - } -// for(IPermission permChildren: perm.getChildren().values()){ -// log.debug("perm children: {}", permChildren); -// boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(permChildren); -// -// if(hasPerm){ -// allowedPermissionsList.add(permChildren); -// } -// -// } - - } - if(!allowedPermissionsList.isEmpty()){ - String path = ((ConSysApiService) module).getConfiguration().endPoint; - grid.addComponent(createPanel("Connected Systems", path, allowedPermissionsList.toString())); - hasCsapi = true; - } - } - } + if(module instanceof AdminUIModule) + path = "/admin"; + else if(module.getConfiguration() instanceof HttpServiceConfig) + path = ((HttpServiceConfig) module.getConfiguration()).endPoint; +// else if(module.getConfiguration() instanceof ServiceConfig) +// path = null; + grid.addComponent(createPanel(module.getName(), path, allowedPermissions.toString())); + panelMap.put(module.getClass().getCanonicalName(), module); } if (grid.getComponentCount() > 0) { @@ -266,19 +135,16 @@ else if (permissionName.contains("csapi") && !hasCsapi && module instanceof ConS } } - - protected void logInitRequest(VaadinRequest req){ if(log.isInfoEnabled()){ - ip = req.getRemoteAddr(); //getRemoteHost + String ip = req.getRemoteAddr(); //getRemoteHost - hostname = VaadinRequest.getCurrent().getHeader("host"); //returns ip:port + String hostname = VaadinRequest.getCurrent().getHeader("host"); //returns ip:port - user = req.getRemoteUser() != null ? req.getRemoteUser() : "anon"; + String user = req.getRemoteUser() != null ? req.getRemoteUser() : "anon"; log.info("New login to landing page (from ip={}, port={}, user={})", ip, hostname, user); } - } /** @@ -291,6 +157,9 @@ private Panel createPanel(String title, String path, String permissions) { panel.setStyleName(Reindeer.PANEL_LIGHT); VerticalLayout layout = new VerticalLayout(); + layout.setSizeFull(); + layout.setMargin(true); + layout.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER); String titleHtml = "" - + "
" - + permissions - + "
"; +// String permissionsHtml = "" +// + "
" +// + permissions +// + "
"; - Label permissionsText = new Label(permissionsHtml, ContentMode.HTML); - layout.addComponents(titleLabel, button); +// Label permissionsText = new Label(permissionsHtml, ContentMode.HTML); // layout.addComponents(titleLabel, permissionsText, button); - layout.setComponentAlignment(titleLabel, Alignment.MIDDLE_CENTER); - layout.setComponentAlignment(button, Alignment.BOTTOM_CENTER); - + layout.addComponents(titleLabel, button); panel.setContent(layout); return panel; } - /** - * Helper to build vaadin buttons + * Builds the endpoint component + * @param endpoint + * @return button or label */ - private Component buildButtons(String endpoint) { - + private Component buildEndpointComponent(String endpoint) { Button button = new Button("VIEW"); button.addStyleNames(ValoTheme.BUTTON_LARGE, ValoTheme.BUTTON_ICON_ALIGN_RIGHT); - String baseUrl = Page.getCurrent().getLocation().getScheme() + "://" + Page.getCurrent().getLocation().getAuthority(); - String url = baseUrl + "/sensorhub" + endpoint; + String title = "No accessible endpoint"; + + String titleHtml = "" + + "
" + + title + + "
"; + + Label textLabel = new Label(titleHtml, ContentMode.HTML); + // validate endpoint and pass back the button or the label + boolean validPath = false; + + if(endpoint != null){ + try{ + String baseUrl = Page.getCurrent().getLocation().getScheme() + "://" + Page.getCurrent().getLocation().getAuthority(); + String url = baseUrl + "/sensorhub" + endpoint; + URL myurl = new URL(url); + +// HttpURLConnection huc = (HttpURLConnection) myurl.openConnection(); +// huc.setRequestMethod("GET"); +// huc.connect(); +// if(huc.getResponseCode() == 200) + validPath = true; + + //add navigation to button + button.addClickListener(event ->{ + getUI().getPage().open(url, "_blank"); + }); + + } catch (MalformedURLException e) { + log.warn("Invalid URL for module: {}" , e.getMessage()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - //navigate to path based on btn - button.addClickListener(event ->{ - getUI().getPage().open(url, "_blank"); - }); - return button; + return validPath ? button : textLabel; } - private Component buildHeader() { + /** + * builds the header with the osh logo + * @return header + */ + private Component buildHeader() { Image osh_logo = new Image(); osh_logo.setSource(new ClassResource("/icons/OpenSensorHub-Logo.png")); @@ -359,17 +259,93 @@ private Component buildHeader() { } + /** + * builds the component for logout button + * @return button + */ + private Component createLogoutButton(){ + // logout button + Button logoutButton = new Button("Logout"); + logoutButton.setDescription("Logout from OSH node"); + logoutButton.setIcon(FontAwesome.SIGN_OUT); + logoutButton.addStyleName(ValoTheme.BUTTON_LARGE); + logoutButton.setWidth("200px"); + + getParentHub().getSecurityManager(); + logoutButton.addClickListener(new Button.ClickListener() { + @Override + public void buttonClick(Button.ClickEvent event) + { + final ConfirmDialog popup = new ConfirmDialog("Are you sure you want to logout?"); + popup.addCloseListener(new Window.CloseListener() { + @Override + public void windowClose(Window.CloseEvent e) + { + if (popup.isConfirmed()) + { + + + //disconnect from module registry + // unregister from module registry events + if (moduleEventsSub != null) + moduleEventsSub.cancel(); + + VaadinServletRequest request = (VaadinServletRequest) VaadinService.getCurrentRequest(); + HttpSession httpSession = request.getSession(false); + + if(httpSession != null){ + httpSession.invalidate(); + + } + + log.debug("log out session: "+ getUI().getSession()); + getUI().getSession().close(); + + //set page to /sensorhub/logout + getUI().getPage().setLocation("/sensorhub/logout"); + + + } + } + }); + + addWindow(popup); + } + }); + + return logoutButton; + } + + /** + * checks to see if given permissions are authorized to access for each module + * @param permission + * @return + */ + private List getAllowedPermissions(IPermission permission){ + + var permissionList = permission.getChildren().values(); + List allowedPermissionsList = new ArrayList(); + + for(IPermission perm: permissionList){ + boolean hasPerm = getParentModule().getSecurityHandler().hasPermission(perm); + + if(hasPerm){ + allowedPermissionsList.add(perm); + } + } + + return allowedPermissionsList; + } + + public ISensorHub getParentHub() { return hub; } - public AdminUIModule getParentModule() { return service; } -} - - +} \ No newline at end of file diff --git a/sensorhub-webui-core/src/main/resources/icons/OpenSensorHub-Logo.png b/sensorhub-webui-core/src/main/resources/icons/OpenSensorHub-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c5641a61d3b66ddb9a385b76aa1045c8b13e624 GIT binary patch literal 36109 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