package org.panbox.desktop.windows.client; import java.io.File; import java.io.FileNotFoundException; import java.lang.reflect.InvocationTargetException; import java.rmi.RemoteException; import javax.naming.ConfigurationException; import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Logger; import org.panbox.core.crypto.AbstractObfuscatorFactory; import org.panbox.core.crypto.FileObfuscatorFactory; import org.panbox.core.crypto.randomness.SecureRandomWrapper; import org.panbox.core.exception.ObfuscationException; import org.panbox.core.exception.RandomDataGenerationException; import org.panbox.core.keymgmt.VolumeParams; import org.panbox.core.vfs.backend.VirtualVolume; import org.panbox.desktop.common.sharemgmt.AbstractPanboxService; import org.panbox.desktop.common.vfs.PanboxFS; import org.panbox.desktop.common.vfs.backend.IRootVolume; import org.panbox.desktop.common.vfs.backend.VFSShare; import org.panbox.desktop.common.vfs.backend.VirtualRootVolume; import org.panbox.desktop.common.vfs.backend.dropbox.DropboxVirtualVolume; import org.panbox.desktop.windows.vfs.VFSManager; public class PanboxWindowsService extends AbstractPanboxService { private static final Logger logger = Logger.getLogger("org.panbox"); public void startService() { if (!VFSManager.isRunning()) { try { SecureRandomWrapper.getInstance(); AbstractObfuscatorFactory.getFactory(FileObfuscatorFactory.class); VFSManager.getInstance().startVFS(); } catch (ConfigurationException | IllegalArgumentException | IllegalAccessException | InvocationTargetException | ClassNotFoundException | InstantiationException | RandomDataGenerationException ex) { logger.error( "PanboxWindowsService : startupVFS : Caught exception from VFSManager", ex); shutdownService(); System.exit(-1); } } } public void shutdownService() { try { int tries = 3; while (VFSManager.isRunning() && tries > 0) { logger.debug("PanboxWindowsService : stopService : Can not stop service, because VFS is still running! Will stop it now! Tries: " + tries); VFSManager.getInstance().stopVFS(); Thread.sleep(1000); --tries; } if (VFSManager.isRunning()) { logger.error("PanboxWindowsService : stopService : Stopping VFS failed! Will not shut down service!"); System.exit(-1); } } catch (ConfigurationException | IllegalArgumentException | IllegalAccessException | InvocationTargetException | InterruptedException ex) { logger.error( "PanboxWindowsService : startupVFS : Caught exception from VFSManager", ex); shutdownService(); System.exit(-1); } } @Override public String getOnlineFilename(VolumeParams p, String fileName) throws RemoteException, FileNotFoundException, ObfuscationException { String shareid = FilenameUtils.getName(p.path); // Dropbox share name String path = File.separator + fileName; PanboxFS fs; try { fs = VFSManager.getInstance().getVFS(); String obf = fs.backingStorage.obfuscatePath(path, false); String windowsPath = obf.replace(p.shareName, shareid); return windowsPath.replace("\\", "/"); } catch (ConfigurationException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { throw new RemoteException("Error obtaining VFS manager instance", e); } } @Override protected VirtualVolume getVirtualVolume(VolumeParams p) throws FileNotFoundException { VirtualVolume virtualVolume = null; switch (p.type) { case FOLDER: // same case DROPBOX: virtualVolume = new DropboxVirtualVolume(p.path); // TODO: Refactor to generic virtualvolume instead of dropbox break; } return virtualVolume; } @Override protected void registerShare(VFSShare vfsShare, VolumeParams p) { IRootVolume vrv = VirtualRootVolume.getInstance(); if (vrv.existsAndChanged(vfsShare)) { vrv.removeShare(p.shareName); vrv.registerShare(vfsShare); } else { vrv.registerShare(vfsShare); } } @Override protected boolean unregisterShare(VolumeParams p) { return VirtualRootVolume.getInstance().removeShare(p.shareName); } }