Browse Source

Merge branch 'release/1.3.0-rc6'

Sebastian Stenzel 8 years ago
parent
commit
7b7684f0af

+ 1 - 1
main/ant-kit/pom.xml

@@ -8,7 +8,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>ant-kit</artifactId>
 	<packaging>pom</packaging>

+ 4 - 4
main/ant-kit/src/main/resources/build.xml

@@ -29,13 +29,13 @@
 				<fx:association mimetype="application/x-vnd.cryptomator-vault-metadata" extension="cryptomator" description="Cryptomator Vault Metadata" />
 			</fx:info>
 			<fx:platform j2se="8.0">
-				<fx:property name="cryptomator.logPath" value="~/.Cryptomator/cryptomator.log" />
-				<fx:property name="cryptomator.upgradeLogPath" value="~/.Cryptomator/upgrade.log" />
+				<fx:property name="logback.configurationFile" value="logback.xml" />
 				<fx:property name="cryptomator.settingsPath" value="~/.Cryptomator/settings.json" />
 				<fx:property name="cryptomator.ipcPortPath" value="~/.Cryptomator/ipcPort.bin" />
 				<fx:jvmarg value="-Xmx512m"/>
 			</fx:platform>
 			<fx:resources>
+				<fx:fileset dir="." type="data" includes="logback.xml" />
 				<fx:fileset dir="antbuild" type="jar" includes="Cryptomator-${project.version}.jar" />
 				<fx:fileset dir="libs" type="jar" includes="*.jar" excludes="launcher-${project.version}.jar"/>
 				<fx:fileset dir="fixed-binaries" type="data" includes="linux-launcher-*" arch=""/>
@@ -53,13 +53,13 @@
 				<fx:association mimetype="application/x-vnd.cryptomator-vault-metadata" extension="cryptomator" description="Cryptomator Vault Metadata" />
 			</fx:info>
 			<fx:platform j2se="8.0">
-				<fx:property name="cryptomator.logPath" value="~/.Cryptomator/cryptomator.log" />
-				<fx:property name="cryptomator.upgradeLogPath" value="~/.Cryptomator/upgrade.log" />
+				<fx:property name="logback.configurationFile" value="logback.xml" />
 				<fx:property name="cryptomator.settingsPath" value="~/.Cryptomator/settings.json" />
 				<fx:property name="cryptomator.ipcPortPath" value="~/.Cryptomator/ipcPort.bin" />
 				<fx:jvmarg value="-Xmx512m"/>
 			</fx:platform>
 			<fx:resources>
+				<fx:fileset dir="." type="data" includes="logback.xml" />
 				<fx:fileset dir="antbuild" type="jar" includes="Cryptomator-${project.version}.jar" />
 				<fx:fileset dir="libs" type="jar" includes="*.jar" excludes="launcher-${project.version}.jar"/>
 				<fx:fileset dir="fixed-binaries" type="data" includes="linux-launcher-*" arch=""/>

+ 43 - 0
main/ant-kit/src/main/resources/logback.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE xml>
+<configuration scan="true" debug="true">
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${user.home}/.Cryptomator/cryptomator.log</file>
+		<append>false</append>
+		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+			<fileNamePattern>${user.home}/.Cryptomator/cryptomator%i.log</fileNamePattern>
+			<minIndex>0</minIndex>
+			<maxIndex>9</maxIndex>
+		</rollingPolicy>
+		<triggeringPolicy class="org.cryptomator.logging.LaunchBasedTriggeringPolicy" />
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+		</encoder>
+	</appender>
+	
+	<appender name="UPGRADE_FILE" class="ch.qos.logback.core.FileAppender">
+		<file>${user.home}/.Cryptomator/cryptomator.log</file>
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.cryptomator" level="INFO" />
+	<logger name="org.eclipse.jetty.server.Server" level="INFO" />
+	<logger name="org.cryptomator.ui.model" level="INFO">
+		<appender-ref ref="UPGRADE_FILE" />
+	</logger>
+
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="FILE" />
+	</root>
+
+</configuration>

+ 1 - 6
main/commons/pom.xml

@@ -10,7 +10,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>commons</artifactId>
 	<name>Cryptomator Commons</name>
@@ -40,11 +40,6 @@
 			<groupId>com.google.dagger</groupId>
 			<artifactId>dagger</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.google.dagger</groupId>
-			<artifactId>dagger-compiler</artifactId>
-			<scope>provided</scope>
-		</dependency>
 		
 		<!-- Logging -->
 		<dependency>

+ 3 - 0
main/commons/src/main/java/org/cryptomator/common/settings/SettingsProvider.java

@@ -97,6 +97,9 @@ public class SettingsProvider implements Provider<Settings> {
 		try (InputStream in = Files.newInputStream(settingsPath, StandardOpenOption.READ); //
 				Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
 			settings = gson.fromJson(reader, Settings.class);
+			if (settings == null) {
+				throw new IOException("Unexpected EOF");
+			}
 			LOG.info("Settings loaded from " + settingsPath);
 		} catch (IOException e) {
 			LOG.info("Failed to load settings, creating new one.");

+ 1 - 1
main/jacoco-report/pom.xml

@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>jacoco-report</artifactId>
 	<name>Cryptomator Code Coverage Report</name>

+ 7 - 6
main/keychain/pom.xml

@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>keychain</artifactId>
 	<name>System Keychain Access</name>
@@ -25,17 +25,18 @@
 			<groupId>org.cryptomator</groupId>
 			<artifactId>jni</artifactId>
 		</dependency>
+		
+		<!-- Google -->
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+		</dependency>
 
 		<!-- DI -->
 		<dependency>
 			<groupId>com.google.dagger</groupId>
 			<artifactId>dagger</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.google.dagger</groupId>
-			<artifactId>dagger-compiler</artifactId>
-			<scope>provided</scope>
-		</dependency>
 		
 		<!-- Logging -->
 		<dependency>

+ 5 - 14
main/launcher/pom.xml

@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>launcher</artifactId>
 	<name>Cryptomator Launcher</name>
@@ -34,24 +34,15 @@
 			<groupId>com.google.dagger</groupId>
 			<artifactId>dagger</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.google.dagger</groupId>
-			<artifactId>dagger-compiler</artifactId>
-			<scope>provided</scope>
-		</dependency>
 
 		<!-- Logging -->
 		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-slf4j-impl</artifactId>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-core</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.logging.log4j</groupId>
-			<artifactId>log4j-jul</artifactId>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
 		</dependency>
 	</dependencies>
 </project>

+ 3 - 2
main/launcher/src/main/java/org/cryptomator/launcher/InterProcessCommunicator.java

@@ -49,6 +49,7 @@ abstract class InterProcessCommunicator implements InterProcessCommunicationProt
 
 	// visible for testing
 	static InterProcessCommunicator start(Path portFilePath, InterProcessCommunicationProtocol endpoint) throws IOException {
+		System.setProperty("java.rmi.server.hostname", "localhost");
 		// try to connect to existing server:
 		int port = readPort(portFilePath);
 		LOG.debug("Connecting to running process on TCP port {}...", port);
@@ -95,7 +96,7 @@ abstract class InterProcessCommunicator implements InterProcessCommunicationProt
 			if (port == 0) {
 				throw new ConnectException("Can not connect to port 0.");
 			}
-			Registry registry = LocateRegistry.getRegistry(port);
+			Registry registry = LocateRegistry.getRegistry("localhost", port);
 			this.remote = (IpcProtocolRemote) registry.lookup(RMI_NAME);
 		}
 
@@ -127,7 +128,7 @@ abstract class InterProcessCommunicator implements InterProcessCommunicationProt
 		private final IpcProtocolRemoteImpl remote;
 
 		private ServerCommunicator(InterProcessCommunicationProtocol delegate) throws IOException {
-			this.socket = new ServerSocket(0, Byte.MAX_VALUE, InetAddress.getLocalHost());
+			this.socket = new ServerSocket(0, Byte.MAX_VALUE, InetAddress.getByName("localhost"));
 			RMIClientSocketFactory csf = RMISocketFactory.getDefaultSocketFactory();
 			SingletonServerSocketFactory ssf = new SingletonServerSocketFactory(socket);
 			this.registry = LocateRegistry.createRegistry(0, csf, ssf);

+ 0 - 132
main/launcher/src/main/java/org/cryptomator/logging/ConfigurableFileAppender.java

@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Sebastian Stenzel and others.
- * This file is licensed under the terms of the MIT license.
- * See the LICENSE.txt file for more info.
- *
- * Contributors:
- *     Sebastian Stenzel - initial API and implementation
- *******************************************************************************/
-package org.cryptomator.logging;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.net.URISyntaxException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.SystemUtils;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.Core;
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
-import org.apache.logging.log4j.core.appender.FileManager;
-import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
-import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.util.Strings;
-
-/**
- * A preconfigured FileAppender only relying on a configurable system property, e.g. <code>-Dcryptomator.logPath=/var/log/cryptomator.log</code>.<br/>
- * Other than the normal {@link org.apache.logging.log4j.core.appender.FileAppender} paths can be resolved relative to the users home directory.
- */
-@Plugin(name = ConfigurableFileAppender.PLUGIN_NAME, category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
-public class ConfigurableFileAppender extends AbstractOutputStreamAppender<FileManager> {
-
-	static final String PLUGIN_NAME = "ConfigurableFile";
-	private static final Pattern DRIVE_LETTER_WITH_PRECEEDING_SLASH = Pattern.compile("^/[A-Z]:", Pattern.CASE_INSENSITIVE);
-
-	private ConfigurableFileAppender(String name, Layout<? extends Serializable> layout, Filter filter, boolean ignoreExceptions, boolean immediateFlush, FileManager manager) {
-		super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
-		LOGGER.info("Logging to " + manager.getFileName());
-	}
-
-	@PluginBuilderFactory
-	public static <B extends Builder<B>> B newBuilder() {
-		return new Builder<B>().asBuilder();
-	}
-
-	/**
-	 * Builds ConfigurableFileAppender instances.
-	 * 
-	 * @param <B>
-	 *            The type to build
-	 */
-	public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B> //
-			implements org.apache.logging.log4j.core.util.Builder<ConfigurableFileAppender> {
-
-		@Required(message = "No system property name containing the log file path provided.")
-		@PluginBuilderAttribute("pathPropertyName")
-		private String pathPropertyName;
-
-		@PluginBuilderAttribute
-		private boolean append = true;
-
-		@Override
-		public ConfigurableFileAppender build() {
-			final String pathProperty = System.getProperty(pathPropertyName);
-			if (Strings.isEmpty(pathProperty)) {
-				LOGGER.warn("No log file location provided in system property \"" + pathPropertyName + "\"");
-				return null;
-			}
-
-			final Path filePath = parsePath(pathProperty);
-			if (filePath == null) {
-				LOGGER.warn("Invalid path \"" + pathProperty + "\"");
-				return null;
-			}
-
-			if (!Files.exists(filePath.getParent())) {
-				try {
-					Files.createDirectories(filePath.getParent());
-				} catch (IOException e) {
-					LOGGER.error("Could not create parent directories for log file located at " + filePath.toString(), e);
-					return null;
-				}
-			}
-
-			FileManager manager = FileManager.getFileManager(filePath.toString(), append, false, isBufferedIo(), true, null, getOrCreateLayout(), getBufferSize(), getConfiguration());
-			return new ConfigurableFileAppender(getName(), getLayout(), getFilter(), isIgnoreExceptions(), isImmediateFlush(), manager);
-		}
-
-		public B withPathPropertyName(String pathPropertyName) {
-			this.pathPropertyName = pathPropertyName;
-			return asBuilder();
-		}
-
-		public B withAppend(boolean append) {
-			this.append = append;
-			return asBuilder();
-		}
-
-	}
-
-	private static Path parsePath(String path) {
-		if (path.startsWith("~/")) {
-			// home-dir-relative Path:
-			final Path userHome = FileSystems.getDefault().getPath(SystemUtils.USER_HOME);
-			return userHome.resolve(path.substring(2));
-		} else if (path.startsWith("/")) {
-			// absolute Path:
-			return FileSystems.getDefault().getPath(path);
-		} else {
-			// relative Path:
-			try {
-				String jarFileLocation = ConfigurableFileAppender.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
-				if (SystemUtils.IS_OS_WINDOWS && DRIVE_LETTER_WITH_PRECEEDING_SLASH.matcher(jarFileLocation).find()) {
-					// on windows we need to remove a preceeding slash from "/C:/foo/bar":
-					jarFileLocation = jarFileLocation.substring(1);
-				}
-				final Path workingDir = FileSystems.getDefault().getPath(jarFileLocation).getParent();
-				return workingDir.resolve(path);
-			} catch (URISyntaxException e) {
-				LOGGER.error("Unable to resolve working directory ", e);
-				return null;
-			}
-		}
-	}
-
-}

+ 18 - 17
main/launcher/src/main/java/org/cryptomator/logging/DebugMode.java

@@ -6,29 +6,27 @@
 package org.cryptomator.logging;
 
 import static java.util.Arrays.asList;
-import static org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME;
 
 import java.util.Collection;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.cryptomator.common.settings.Settings;
-import org.slf4j.Logger;
+import org.slf4j.ILoggerFactory;
 import org.slf4j.LoggerFactory;
 
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+
 @Singleton
 public class DebugMode {
 
-	private static final Logger LOG = LoggerFactory.getLogger(DebugMode.class);
+	private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(DebugMode.class);
 
 	private static final Collection<LoggerUpgrade> LOGGER_UPGRADES = asList( //
-			loggerUpgrade(ROOT_LOGGER_NAME, Level.INFO), //
+			loggerUpgrade(org.slf4j.Logger.ROOT_LOGGER_NAME, Level.INFO), //
 			loggerUpgrade("org.cryptomator", Level.TRACE), //
 			loggerUpgrade("org.eclipse.jetty.server.Server", Level.DEBUG) //
 	);
@@ -48,10 +46,13 @@ public class DebugMode {
 	}
 
 	private void enable() {
-		LoggerContext context = (LoggerContext) LogManager.getContext(false);
-		Configuration config = context.getConfiguration();
-		LOGGER_UPGRADES.forEach(loggerUpgrade -> loggerUpgrade.execute(config));
-		context.updateLoggers();
+		ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
+		if (loggerFactory instanceof LoggerContext) {
+			LoggerContext context = (LoggerContext) loggerFactory;
+			LOGGER_UPGRADES.forEach(loggerUpgrade -> loggerUpgrade.execute(context));
+		} else {
+			LOG.warn("SLF4J not bound to Logback.");
+		}
 	}
 
 	private static LoggerUpgrade loggerUpgrade(String loggerName, Level minLevel) {
@@ -68,10 +69,10 @@ public class DebugMode {
 			this.level = minLevel;
 		}
 
-		public void execute(Configuration config) {
-			LoggerConfig loggerConfig = config.getLoggerConfig(loggerName);
-			if (loggerConfig.getLevel().isMoreSpecificThan(level)) {
-				loggerConfig.setLevel(level);
+		public void execute(LoggerContext context) {
+			Logger logger = context.getLogger(loggerName);
+			if (logger != null && logger.getEffectiveLevel().isGreaterOrEqual(level)) {
+				logger.setLevel(level);
 			}
 		}
 

+ 20 - 0
main/launcher/src/main/java/org/cryptomator/logging/LaunchBasedTriggeringPolicy.java

@@ -0,0 +1,20 @@
+package org.cryptomator.logging;
+
+import java.io.File;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import ch.qos.logback.core.rolling.TriggeringPolicyBase;
+
+/**
+ * Triggers a roll-over on the first log event, so each launched application instance will rotate the log.
+ */
+public class LaunchBasedTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
+
+	private final AtomicBoolean shouldTrigger = new AtomicBoolean(true);
+
+	@Override
+	public boolean isTriggeringEvent(File activeFile, E event) {
+		return shouldTrigger.get() && shouldTrigger.getAndSet(false);
+	}
+
+}

+ 0 - 49
main/launcher/src/main/resources/log4j2.xml

@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Copyright (c) 2014 Markus Kreusch
-  This file is licensed under the terms of the MIT license.
-  See the LICENSE.txt file for more info.
-  
-  Contributors:
-      Markus Kreusch - switched to log4j 2
--->
-<Configuration status="WARN" packages="org.cryptomator.logging">
-
-	<Appenders>
-		<Console name="StdOut" target="SYSTEM_OUT">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT" />
-		</Console>
-		<Console name="StdErr" target="SYSTEM_ERR">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
-		</Console>
-		<ConfigurableFile name="DefaultLog" pathPropertyName="cryptomator.logPath" append="false">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-		</ConfigurableFile>
-		<ConfigurableFile name="UpgradeLog" pathPropertyName="cryptomator.upgradeLogPath" append="true">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-		</ConfigurableFile>
-	</Appenders>
-
-	<Loggers>
-		<!--
-			= NOTE =
-			All loggers below are set to info.
-			This is required to allow changing the levels of the loggers programmatically.
-		-->
-		<Logger name="org.cryptomator" level="INFO" />
-		<Logger name="org.eclipse.jetty.server.Server" level="INFO" />
-		<Logger name="org.cryptomator.ui.model" level="INFO">
-			<AppenderRef ref="UpgradeLog" />
-		</Logger>
-		
-		<!-- defaults: -->
-		<Root level="INFO">
-			<AppenderRef ref="StdOut" />
-			<AppenderRef ref="StdErr" />
-			<AppenderRef ref="DefaultLog" />
-		</Root>
-	</Loggers>
-
-</Configuration>

+ 33 - 0
main/launcher/src/test/java/org/cryptomator/logging/LaunchBasedTriggeringPolicyTest.java

@@ -0,0 +1,33 @@
+package org.cryptomator.logging;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class LaunchBasedTriggeringPolicyTest {
+
+	@Test
+	public void testTriggerOnceAndNeverAgain() {
+		LaunchBasedTriggeringPolicy<Object> policy = new LaunchBasedTriggeringPolicy<>();
+		File activeFile = Mockito.mock(File.class);
+		Object event = Mockito.mock(Object.class);
+
+		// 1st invocation
+		boolean triggered = policy.isTriggeringEvent(activeFile, event);
+		Assert.assertTrue(triggered);
+
+		// 2nd invocation
+		triggered = policy.isTriggeringEvent(activeFile, event);
+		Assert.assertFalse(triggered);
+
+		// 3rd invocation
+		triggered = policy.isTriggeringEvent(activeFile, event);
+		Assert.assertFalse(triggered);
+
+		Mockito.verifyZeroInteractions(activeFile);
+		Mockito.verifyZeroInteractions(event);
+	}
+
+}

+ 0 - 33
main/launcher/src/test/resources/log4j2.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Copyright (c) 2014 Markus Kreusch
-  This file is licensed under the terms of the MIT license.
-  See the LICENSE.txt file for more info.
-  
-  Contributors:
-      Markus Kreusch - switched to log4j 2
--->
-<Configuration status="WARN" packages="org.cryptomator.logging">
-
-	<Appenders>
-		<Console name="StdOut" target="SYSTEM_OUT">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT" />
-		</Console>
-		<Console name="StdErr" target="SYSTEM_ERR">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
-		</Console>
-	</Appenders>
-
-	<Loggers>
-		<Logger name="org.cryptomator" level="DEBUG" />
-		
-		<!-- defaults: -->
-		<Root level="INFO">
-			<AppenderRef ref="StdOut" />
-			<AppenderRef ref="StdErr" />
-		</Root>
-	</Loggers>
-
-</Configuration>

+ 20 - 0
main/launcher/src/test/resources/logback-test.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE xml>
+<!-- log config used during unit tests and starts from IDE. For production please specify -Dlogback.configurationFile=/path/to/config -->
+<configuration>
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.cryptomator" level="DEBUG" />
+	<logger name="org.eclipse.jetty" level="INFO" />
+	<logger name="org.eclipse.jetty.server.Server" level="DEBUG" />
+	<logger name="org.apache" level="INFO" />
+
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+	</root>
+</configuration>

+ 16 - 14
main/pom.xml

@@ -6,7 +6,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.cryptomator</groupId>
 	<artifactId>main</artifactId>
-	<version>1.3.0-rc5</version>
+	<version>1.3.0-rc6</version>
 	<packaging>pom</packaging>
 	<name>Cryptomator</name>
 
@@ -29,10 +29,10 @@
 		<!-- dependency versions -->
 		<cryptomator.cryptolib.version>1.1.1</cryptomator.cryptolib.version>
 		<cryptomator.cryptofs.version>1.2.2</cryptomator.cryptofs.version>
-		<cryptomator.webdav.version>0.6.0</cryptomator.webdav.version>
+		<cryptomator.webdav.version>0.6.1</cryptomator.webdav.version>
 		<cryptomator.jni.version>1.0.2</cryptomator.jni.version>
-		<log4j.version>2.8.1</log4j.version> <!-- keep in sync with https://github.com/edwgiz/maven-shaded-log4j-transformer (used in uber-jar), or wait for https://issues.apache.org/jira/browse/LOG4J2-954 fix -->
 		<slf4j.version>1.7.25</slf4j.version>
+		<logback.version>1.2.2</logback.version>
 		<junit.version>4.12</junit.version>
 		<junit.hierarchicalrunner.version>4.12.1</junit.hierarchicalrunner.version>
 		<hamcrest.version>1.3</hamcrest.version> <!-- keep in sync with version required by JUnit -->
@@ -119,19 +119,14 @@
 				<version>${slf4j.version}</version>
 			</dependency>
 			<dependency>
-				<groupId>org.apache.logging.log4j</groupId>
-				<artifactId>log4j-core</artifactId>
-				<version>${log4j.version}</version>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-core</artifactId>
+				<version>${logback.version}</version>
 			</dependency>
 			<dependency>
-				<groupId>org.apache.logging.log4j</groupId>
-				<artifactId>log4j-slf4j-impl</artifactId>
-				<version>${log4j.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.logging.log4j</groupId>
-				<artifactId>log4j-jul</artifactId>
-				<version>${log4j.version}</version>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-classic</artifactId>
+				<version>${logback.version}</version>
 			</dependency>
 
 			<!-- commons -->
@@ -331,6 +326,13 @@
 				<configuration>
 					<source>1.8</source>
 					<target>1.8</target>
+					<annotationProcessorPaths>
+						<path>
+							<groupId>com.google.dagger</groupId>
+							<artifactId>dagger-compiler</artifactId>
+							<version>${dagger.version}</version>
+						</path>
+					</annotationProcessorPaths>
 				</configuration>
 			</plugin>
 		</plugins>

+ 1 - 10
main/uber-jar/pom.xml

@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>uber-jar</artifactId>
 	<name>Single über jar with all dependencies</name>
@@ -41,17 +41,8 @@
 								<Implementation-Version>${project.version}</Implementation-Version>
 							</manifestEntries>
 						</transformer>
-						<transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer">
-						</transformer>
 					</transformers>
 				</configuration>
-				<dependencies>
-					<dependency>
-						<groupId>com.github.edwgiz</groupId>
-						<artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
-						<version>${log4j.version}</version>
-					</dependency>
-				</dependencies>
 			</plugin>
 		</plugins>
 	</build>

+ 0 - 33
main/uber-jar/src/main/resources/log4j2.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Copyright (c) 2014 Markus Kreusch
-  This file is licensed under the terms of the MIT license.
-  See the LICENSE.txt file for more info.
-  
-  Contributors:
-      Markus Kreusch - switched to log4j 2
--->
-<Configuration status="WARN">
-
-	<Appenders>
-		<Console name="StdOut" target="SYSTEM_OUT">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT" />
-		</Console>
-		<Console name="StdErr" target="SYSTEM_ERR">
-			<PatternLayout pattern="%16d %-5p [%c{1}:%L] %m%n" />
-			<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
-		</Console>
-	</Appenders>
-
-	<Loggers>
-		<Logger name="org.cryptomator" level="DEBUG" />
-		
-		<!-- defaults: -->
-		<Root level="INFO">
-			<AppenderRef ref="StdOut" />
-			<AppenderRef ref="StdErr" />
-		</Root>
-	</Loggers>
-
-</Configuration>

+ 20 - 0
main/uber-jar/src/main/resources/logback.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE xml>
+<!-- log config used during unit tests and starts from IDE. For production please specify -Dlogback.configurationFile=/path/to/config -->
+<configuration>
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<logger name="org.cryptomator" level="DEBUG" />
+	<logger name="org.eclipse.jetty" level="INFO" />
+	<logger name="org.eclipse.jetty.server.Server" level="INFO" />
+	<logger name="org.apache" level="INFO" />
+
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+	</root>
+</configuration>

+ 1 - 6
main/ui/pom.xml

@@ -12,7 +12,7 @@
 	<parent>
 		<groupId>org.cryptomator</groupId>
 		<artifactId>main</artifactId>
-		<version>1.3.0-rc5</version>
+		<version>1.3.0-rc6</version>
 	</parent>
 	<artifactId>ui</artifactId>
 	<name>Cryptomator GUI</name>
@@ -84,11 +84,6 @@
 			<groupId>com.google.dagger</groupId>
 			<artifactId>dagger</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.google.dagger</groupId>
-			<artifactId>dagger-compiler</artifactId>
-			<scope>provided</scope>
-		</dependency>
 
 		<!-- Zxcvbn -->
 		<dependency>

+ 4 - 4
main/ui/src/main/java/org/cryptomator/ui/l10n/Localization.java

@@ -46,21 +46,21 @@ public class Localization extends ResourceBundle {
 
 			String language = Locale.getDefault().getLanguage();
 			String region = Locale.getDefault().getCountry();
-			LOG.info("Detected language \"{}\" and region \"{}\"", language, region);
+			LOG.debug("Detected language \"{}\" and region \"{}\"", language, region);
 
 			ResourceBundle localizationBundle = null;
 			if (StringUtils.isNotEmpty(language) && StringUtils.isNotEmpty(region)) {
 				String file = String.format(LOCALIZATION_FILENAME_FMT, language + "_" + region);
-				LOG.info("Attempting to load localization from: {}", file);
+				LOG.trace("Attempting to load localization from: {}", file);
 				localizationBundle = loadLocalizationFile(file);
 			}
 			if (StringUtils.isNotEmpty(language) && localizationBundle == null) {
 				String file = String.format(LOCALIZATION_FILENAME_FMT, language);
-				LOG.info("Attempting to load localization from: {}", file);
+				LOG.trace("Attempting to load localization from: {}", file);
 				localizationBundle = loadLocalizationFile(file);
 			}
 			if (localizationBundle == null) {
-				LOG.info("No localization found. Falling back to default language.");
+				LOG.debug("No localization found. Falling back to default language.");
 				localizationBundle = this.fallback;
 			}
 			this.localized = Objects.requireNonNull(localizationBundle);

+ 1 - 0
main/ui/src/main/java/org/cryptomator/ui/model/AutoUnlocker.java

@@ -69,6 +69,7 @@ public class AutoUnlocker {
 		char[] storedPw = keychainAccess.get().loadPassphrase(vault.getId());
 		if (storedPw == null) {
 			LOG.warn("No passphrase stored in keychain for vault registered for auto unlocking: {}", vault.getPath());
+			return;
 		}
 		try {
 			vault.unlock(CharBuffer.wrap(storedPw));

+ 1 - 1
main/ui/src/main/java/org/cryptomator/ui/model/Vault.java

@@ -216,7 +216,7 @@ public class Vault {
 		return vaultSettings;
 	}
 
-	public String getWebDavUrl() {
+	public synchronized String getWebDavUrl() {
 		return servlet.getServletRootUri().toString();
 	}
 

+ 3 - 3
main/ui/src/main/resources/localization/en.txt

@@ -15,7 +15,7 @@ main.addDirectory.contextMenu.new=Create New Vault
 main.addDirectory.contextMenu.open=Open Existing Vault
 main.directoryList.remove.confirmation.title=Remove Vault
 main.directoryList.remove.confirmation.header=Do you really want to remove this vault?
-main.directoryList.remove.confirmation.content=The vault will only be removed from the list. To permanently delete it, please delete the files from your filesystem.
+main.directoryList.remove.confirmation.content=The vault will only be removed from the list. To permanently delete it, please delete the vault from your filesystem.
 
 # welcome.fxml
 welcome.checkForUpdates.label.currentlyChecking=Checking for Updates...
@@ -69,7 +69,7 @@ unlock.button.advancedOptions.show=More Options
 unlock.button.advancedOptions.hide=Less Options
 unlock.savePassword.delete.confirmation.title=Delete Saved Password
 unlock.savePassword.delete.confirmation.header=Do you really want to delete the saved password of this vault?
-unlock.savePassword.delete.confirmation.content=The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save password" option enabled.
+unlock.savePassword.delete.confirmation.content=The saved password of this vault will be immediately deleted from your system keychain. If you'd like to save your password again, you'd have to unlock your vault with the "Save Password" option enabled.
 unlock.choicebox.winDriveLetter.auto=Assign automatically
 unlock.errorMessage.wrongPassword=Wrong password
 unlock.errorMessage.mountingFailed=Mounting failed. See log file for details.
@@ -99,7 +99,7 @@ unlocked.label.statsDecrypted=decrypted
 unlocked.ioGraph.yAxis.label=Throughput (MiB/s)
 unlocked.lock.force.confirmation.title=Locking of %1$s failed
 unlocked.lock.force.confirmation.header=Do you want to force locking?
-unlocked.lock.force.confirmation.content=This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost. 
+unlocked.lock.force.confirmation.content=This may be because other programs are still accessing files in the vault or because some other problem occurred.\n\nPrograms still accessing the files may not work correctly and data not already written by those programs may be lost.
 
 # settings.fxml
 settings.version.label=Version %s