- Single Jetty instnace (fixes #19)

This commit is contained in:
Sebastian Stenzel
2015-01-15 12:27:10 +01:00
parent f0fa4fcf3d
commit 0aef60efc4
11 changed files with 143 additions and 62 deletions
@@ -23,6 +23,7 @@ import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.ui.settings.Settings;
import org.cryptomator.ui.util.ActiveWindowStyleSupport;
import org.cryptomator.ui.util.TrayIconUtil;
import org.cryptomator.webdav.WebDavServer;
import org.eclipse.jetty.util.ConcurrentHashSet;
public class MainApplication extends Application {
@@ -37,6 +38,7 @@ public class MainApplication extends Application {
@Override
public void start(final Stage primaryStage) throws IOException {
WebDavServer.getInstance().start();
chooseNativeStylesheet();
final ResourceBundle rb = ResourceBundle.getBundle("localization");
final FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/main.fxml"), rb);
@@ -67,6 +69,7 @@ public class MainApplication extends Application {
private void quit() {
Platform.runLater(() -> {
WebDavServer.getInstance().stop();
CLEAN_SHUTDOWN_PERFORMER.run();
Settings.save();
Platform.exit();
@@ -27,6 +27,7 @@ import javafx.util.Duration;
import org.cryptomator.crypto.CryptorIOSampling;
import org.cryptomator.ui.model.Directory;
import org.cryptomator.webdav.WebDavServer;
public class UnlockedController implements Initializable {
@@ -123,7 +124,7 @@ public class UnlockedController implements Initializable {
public void setDirectory(Directory directory) {
this.directory = directory;
final String msg = String.format(rb.getString("unlocked.messageLabel.runningOnPort"), directory.getServer().getPort());
final String msg = String.format(rb.getString("unlocked.messageLabel.runningOnPort"), WebDavServer.getInstance().getPort());
messageLabel.setText(msg);
if (directory.getCryptor() instanceof CryptorIOSampling) {
@@ -17,6 +17,7 @@ import org.cryptomator.ui.util.mount.CommandFailedException;
import org.cryptomator.ui.util.mount.WebDavMount;
import org.cryptomator.ui.util.mount.WebDavMounter;
import org.cryptomator.webdav.WebDavServer;
import org.cryptomator.webdav.WebDavServer.ServletLifeCycleAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,20 +30,20 @@ public class Directory implements Serializable {
private static final long serialVersionUID = 3754487289683599469L;
private static final Logger LOG = LoggerFactory.getLogger(Directory.class);
private final WebDavServer server = new WebDavServer();
private final Cryptor cryptor = SamplingDecorator.decorate(new Aes256Cryptor());
private final ObjectProperty<Boolean> unlocked = new SimpleObjectProperty<Boolean>(this, "unlocked", Boolean.FALSE);
private final Runnable shutdownTask = new ShutdownTask();
private final Path path;
private boolean verifyFileIntegrity;
private ServletLifeCycleAdapter webDavServlet;
private WebDavMount webDavMount;
private final Runnable shutdownTask = new ShutdownTask();
public Directory(final Path path) {
if (!Files.isDirectory(path)) {
throw new IllegalArgumentException("Not a directory: " + path);
}
this.path = path;
}
public boolean containsMasterKey() throws IOException {
@@ -50,7 +51,11 @@ public class Directory implements Serializable {
}
public synchronized boolean startServer() {
if (server.start(path.toString(), verifyFileIntegrity, cryptor)) {
if (webDavServlet != null && webDavServlet.isRunning()) {
return false;
}
webDavServlet = WebDavServer.getInstance().createServlet(path, verifyFileIntegrity, cryptor);
if (webDavServlet.start()) {
MainApplication.addShutdownTask(shutdownTask);
return true;
} else {
@@ -58,18 +63,21 @@ public class Directory implements Serializable {
}
}
public synchronized void stopServer() {
if (server.isRunning()) {
public void stopServer() {
if (webDavServlet != null && webDavServlet.isRunning()) {
MainApplication.removeShutdownTask(shutdownTask);
this.unmount();
server.stop();
webDavServlet.stop();
cryptor.swipeSensitiveData();
}
}
public boolean mount() {
if (webDavServlet == null || !webDavServlet.isRunning()) {
return false;
}
try {
webDavMount = WebDavMounter.mount(server.getPort());
webDavMount = WebDavMounter.mount(webDavServlet.getServletUri());
return true;
} catch (CommandFailedException e) {
LOG.warn("mount failed", e);
@@ -127,10 +135,6 @@ public class Directory implements Serializable {
this.unlocked.set(unlocked);
}
public WebDavServer getServer() {
return server;
}
/* hashcode/equals */
@Override
@@ -8,6 +8,8 @@
******************************************************************************/
package org.cryptomator.ui.util.mount;
import java.net.URI;
/**
* A WebDavMounter acting as fallback if no other mounter works.
*
@@ -21,7 +23,7 @@ final class FallbackWebDavMounter implements WebDavMounterStrategy {
}
@Override
public WebDavMount mount(int localPort) {
public WebDavMount mount(URI uri) {
displayMountInstructions();
return new WebDavMount() {
@Override
@@ -9,6 +9,8 @@
******************************************************************************/
package org.cryptomator.ui.util.mount;
import java.net.URI;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.ui.util.command.Script;
@@ -30,16 +32,16 @@ final class LinuxGvfsWebDavMounter implements WebDavMounterStrategy {
}
@Override
public WebDavMount mount(int localPort) throws CommandFailedException {
public WebDavMount mount(URI uri) throws CommandFailedException {
final Script mountScript = Script.fromLines(
"set -x",
"gvfs-mount \"dav://[::1]:$PORT\"",
"xdg-open \"$URI\"")
.addEnv("PORT", String.valueOf(localPort));
"gvfs-mount \"dav:$DAV_SSP\"",
"xdg-open \"dav:$DAV_SSP\"")
.addEnv("DAV_SSP", uri.getRawSchemeSpecificPart());
final Script unmountScript = Script.fromLines(
"set -x",
"gvfs-mount -u \"dav://[::1]:$PORT\"")
.addEnv("URI", String.valueOf(localPort));
"gvfs-mount -u \"dav:$DAV_SSP\"")
.addEnv("$DAV_SSP", uri.getRawSchemeSpecificPart());
mountScript.execute();
return new WebDavMount() {
@Override
@@ -9,6 +9,8 @@
******************************************************************************/
package org.cryptomator.ui.util.mount;
import java.net.URI;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.ui.util.command.Script;
@@ -20,13 +22,14 @@ final class MacOsXWebDavMounter implements WebDavMounterStrategy {
}
@Override
public WebDavMount mount(int localPort) throws CommandFailedException {
final String path = "/Volumes/Cryptomator" + localPort;
public WebDavMount mount(URI uri) throws CommandFailedException {
final String path = "/Volumes/Cryptomator" + uri.getRawPath().replace('/', '_');
final Script mountScript = Script.fromLines(
"mkdir \"$MOUNT_PATH\"",
"mount_webdav -S -v Cryptomator \"[::1]:$PORT\" \"$MOUNT_PATH\"",
"mount_webdav -S -v Cryptomator \"[::1]:$PORT$DAV_PATH\" \"$MOUNT_PATH\"",
"open \"$MOUNT_PATH\"")
.addEnv("PORT", String.valueOf(localPort))
.addEnv("PORT", String.valueOf(uri.getPort()))
.addEnv("DAV_PATH", uri.getRawPath())
.addEnv("MOUNT_PATH", path);
final Script unmountScript = Script.fromLines(
"umount $MOUNT_PATH")
@@ -9,6 +9,8 @@
******************************************************************************/
package org.cryptomator.ui.util.mount;
import java.net.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,12 +25,12 @@ public final class WebDavMounter {
/**
* Tries to mount a given webdav share.
*
* @param localPort local TCP port of the webdav share
* @param uri URI of the webdav share
* @return a {@link WebDavMount} representing the mounted share
* @throws CommandFailedException if the mount operation fails
*/
public static WebDavMount mount(int localPort) throws CommandFailedException {
return chooseStrategy().mount(localPort);
public static WebDavMount mount(URI uri) throws CommandFailedException {
return chooseStrategy().mount(uri);
}
private static WebDavMounterStrategy chooseStrategy() {
@@ -9,6 +9,7 @@
******************************************************************************/
package org.cryptomator.ui.util.mount;
import java.net.URI;
/**
* A strategy able to mount a webdav share and display it to the user.
@@ -25,10 +26,10 @@ interface WebDavMounterStrategy {
/**
* Tries to mount a given webdav share.
*
* @param localPort local TCP port of the webdav share
* @param uri URI of the webdav share
* @return a {@link WebDavMount} representing the mounted share
* @throws CommandFailedException if the mount operation fails
*/
WebDavMount mount(int localPort) throws CommandFailedException;
WebDavMount mount(URI uri) throws CommandFailedException;
}
@@ -11,6 +11,7 @@ package org.cryptomator.ui.util.mount;
import static org.cryptomator.ui.util.command.Script.fromLines;
import java.net.URI;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -36,8 +37,10 @@ final class WindowsWebDavMounter implements WebDavMounterStrategy {
}
@Override
public WebDavMount mount(int localPort) throws CommandFailedException {
final Script mountScript = fromLines("net use * http://0--1.ipv6-literal.net:%PORT% /persistent:no").addEnv("PORT", String.valueOf(localPort));
public WebDavMount mount(URI uri) throws CommandFailedException {
final Script mountScript = fromLines("net use * http://0--1.ipv6-literal.net:%PORT%%DAV_PATH% /persistent:no")
.addEnv("PORT", String.valueOf(uri.getPort()))
.addEnv("DAV_PATH", uri.getRawPath());
final CommandResult mountResult = mountScript.execute(30, TimeUnit.SECONDS);
final String driveLetter = getDriveLetter(mountResult.getStdOut());
final Script unmountScript = fromLines("net use " + driveLetter + " /delete").addEnv("DRIVE_LETTER", driveLetter);