/****************************************************************************** * * * Copyright 2016 Subterranean Security * * * * 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. * * * *****************************************************************************/ package com.subterranean_security.crimson.viewer; import java.awt.GraphicsEnvironment; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.sql.SQLException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.subterranean_security.crimson.core.Common; import com.subterranean_security.crimson.core.misc.EH; import com.subterranean_security.crimson.core.storage.BasicDatabase; import com.subterranean_security.crimson.core.storage.StorageFacility; import com.subterranean_security.crimson.core.util.LogUtil; import com.subterranean_security.crimson.core.util.Native; import com.subterranean_security.crimson.universal.Universal; import com.subterranean_security.crimson.universal.Universal.Instance; import com.subterranean_security.crimson.universal.stores.DatabaseStore; import com.subterranean_security.crimson.universal.stores.PrefStore; import com.subterranean_security.crimson.viewer.net.ViewerConnectionStore; import com.subterranean_security.crimson.viewer.store.LocalServerStore; import com.subterranean_security.crimson.viewer.ui.UIUtil; import com.subterranean_security.crimson.viewer.ui.common.panels.sl.MovablePanel; import com.subterranean_security.crimson.viewer.ui.screen.eula.EULADialog; import com.subterranean_security.crimson.viewer.ui.screen.login.LoginDialog; import com.subterranean_security.crimson.viewer.ui.screen.main.MainFrame; import aurelienribon.slidinglayout.SLAnimator; import aurelienribon.tweenengine.Tween; public class Viewer { private static final Logger log = LoggerFactory.getLogger(Viewer.class); public static void main(String[] argv) { if (GraphicsEnvironment.isHeadless()) { System.out.println("Error: headless graphics environment detected!"); return; } LogUtil.configure(); // Establish the custom fallback exception handler Thread.setDefaultUncaughtExceptionHandler(new EH()); // Establish the custom shutdown hook Runtime.getRuntime().addShutdownHook(new ShutdownHook()); // Initialize preference storage initializePreferences(); // Check for other instances if (PrefStore.getPref().isLocked()) { System.exit(0); } else { PrefStore.getPref().lock(); } // Load native libraries Native.Loader.load(); // Initialize database initializeDatabase(); // Make platform specific UI tweaks UIUtil.adaptPlatform(); // Show the EULA if needed try { if (PrefStore.getPref().getBoolean(PrefStore.PTag.GENERAL_EULA_SHOW) && !Universal.isDebug) { EULADialog eula = new EULADialog(true); eula.setLocationRelativeTo(null); eula.setVisible(true); synchronized (eula) { try { eula.wait(); } catch (InterruptedException e) { return; } } if (eula.accepted) { PrefStore.getPref().putBoolean(PrefStore.PTag.GENERAL_EULA_SHOW, false); } eula = null; } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } boolean localServerFound = ViewerState.findLocalServerInstance(); if (LocalServerStore.bundledServer.exists() && !localServerFound) { // LocalServerStore.startLocalServer(); } // initialize sliding layout Tween.registerAccessor(MovablePanel.class, new MovablePanel.Accessor()); SLAnimator.start(); loadState(); // Initialize connection stores ViewerConnectionStore.initialize(); // show login dialog LoginDialog login = new LoginDialog(LocalServerStore.bundledServer.exists() && !localServerFound); login.setVisible(true); try { synchronized (login) { login.wait(); } } catch (InterruptedException e) { return; } login = null; // Show the main interface MainFrame.main.setLocationRelativeTo(null); MainFrame.main.setVisible(true); MainFrame.main.invokeAfterload(); } private static void initializeDatabase() { StorageFacility sf = new BasicDatabase(Viewer.class.getName(), new File(Common.Directories.base + "/var/viewer.db")); try { sf.initialize(); } catch (ClassNotFoundException e) { log.error("Failed to load SQLite dependancy"); System.exit(0); } catch (IOException e) { log.error("Failed to write database"); System.exit(0); } catch (SQLException e) { log.error("SQL error: {}", e.getMessage()); System.exit(0); } DatabaseStore.setFacility(sf); } private static void initializePreferences() { PrefStore.loadPreferences(Instance.VIEWER); } public static void loadJar(String path) throws Exception { File target = new File(path); System.out.println("Loading: " + target.getAbsolutePath()); if (!target.exists()) { throw new Exception(); } Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); method.setAccessible(true); method.invoke(ClassLoader.getSystemClassLoader(), new Object[] { target.toURI().toURL() }); } public static void loadState() { try { ViewerState.trialMode = DatabaseStore.getDatabase().getString("serial").isEmpty(); } catch (Exception e) { ViewerState.trialMode = true; } } }