mirror of https://github.com/qortal/qortal
catbref
5 years ago
8 changed files with 196 additions and 46 deletions
@ -0,0 +1,85 @@ |
|||||||
|
package org.qora.ui; |
||||||
|
|
||||||
|
import org.eclipse.jetty.rewrite.handler.RedirectPatternRule; |
||||||
|
import org.eclipse.jetty.rewrite.handler.RewriteHandler; |
||||||
|
import org.eclipse.jetty.server.Server; |
||||||
|
import org.eclipse.jetty.server.handler.InetAccessHandler; |
||||||
|
import org.eclipse.jetty.servlet.DefaultServlet; |
||||||
|
import org.eclipse.jetty.servlet.FilterHolder; |
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler; |
||||||
|
import org.eclipse.jetty.servlet.ServletHolder; |
||||||
|
import org.eclipse.jetty.servlets.CrossOriginFilter; |
||||||
|
import org.qora.settings.Settings; |
||||||
|
|
||||||
|
public class UiService { |
||||||
|
|
||||||
|
private final Server server; |
||||||
|
|
||||||
|
public UiService() { |
||||||
|
// Create bundled UI server
|
||||||
|
this.server = new Server(Settings.getInstance().getUiPort()); |
||||||
|
|
||||||
|
// IP address based access control
|
||||||
|
InetAccessHandler accessHandler = new InetAccessHandler(); |
||||||
|
for (String pattern : Settings.getInstance().getUiWhitelist()) { |
||||||
|
accessHandler.include(pattern); |
||||||
|
} |
||||||
|
this.server.setHandler(accessHandler); |
||||||
|
|
||||||
|
// URL rewriting
|
||||||
|
RewriteHandler rewriteHandler = new RewriteHandler(); |
||||||
|
accessHandler.setHandler(rewriteHandler); |
||||||
|
|
||||||
|
// Context
|
||||||
|
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); |
||||||
|
context.setContextPath("/"); |
||||||
|
rewriteHandler.setHandler(context); |
||||||
|
|
||||||
|
// Cross-origin resource sharing
|
||||||
|
FilterHolder corsFilterHolder = new FilterHolder(CrossOriginFilter.class); |
||||||
|
corsFilterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*"); |
||||||
|
corsFilterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET, POST, DELETE"); |
||||||
|
corsFilterHolder.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM, "false"); |
||||||
|
context.addFilter(corsFilterHolder, "/*", null); |
||||||
|
|
||||||
|
// Bundled-UI static content servlet
|
||||||
|
ServletHolder uiServlet = new ServletHolder("bundled-ui", DefaultServlet.class); |
||||||
|
ClassLoader loader = this.getClass().getClassLoader(); |
||||||
|
uiServlet.setInitParameter("resourceBase", loader.getResource("bundled-ui/").toString()); |
||||||
|
uiServlet.setInitParameter("dirAllowed", "true"); |
||||||
|
uiServlet.setInitParameter("pathInfoOnly", "true"); |
||||||
|
context.addServlet(uiServlet, "/*"); |
||||||
|
|
||||||
|
rewriteHandler.addRule(new RedirectPatternRule("", "/home.html")); // redirect to bundled UI start page
|
||||||
|
} |
||||||
|
|
||||||
|
private static UiService instance; |
||||||
|
|
||||||
|
public static UiService getInstance() { |
||||||
|
if (instance == null) { |
||||||
|
instance = new UiService(); |
||||||
|
} |
||||||
|
|
||||||
|
return instance; |
||||||
|
} |
||||||
|
|
||||||
|
public void start() { |
||||||
|
try { |
||||||
|
// Start server
|
||||||
|
server.start(); |
||||||
|
} catch (Exception e) { |
||||||
|
// Failed to start
|
||||||
|
throw new RuntimeException("Failed to start bundled UI", e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void stop() { |
||||||
|
try { |
||||||
|
// Stop server
|
||||||
|
server.stop(); |
||||||
|
} catch (Exception e) { |
||||||
|
// Failed to stop
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package org.qora.utils; |
||||||
|
|
||||||
|
import java.awt.Desktop; |
||||||
|
import java.net.URI; |
||||||
|
import java.net.URISyntaxException; |
||||||
|
import java.net.URL; |
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager; |
||||||
|
import org.apache.logging.log4j.Logger; |
||||||
|
|
||||||
|
public class URLViewer { |
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(URLViewer.class); |
||||||
|
|
||||||
|
public static void openWebpage(URI uri) { |
||||||
|
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; |
||||||
|
|
||||||
|
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) { |
||||||
|
try { |
||||||
|
desktop.browse(uri); |
||||||
|
} catch (Exception e) { |
||||||
|
LOGGER.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static void openWebpage(URL url) { |
||||||
|
try { |
||||||
|
openWebpage(url.toURI()); |
||||||
|
} catch (URISyntaxException e) { |
||||||
|
LOGGER.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue