Skip to content

Commit b969a4b

Browse files
Merge branch 'release/0.3.0'
2 parents 422d69a + a7fe127 commit b969a4b

File tree

3 files changed

+52
-12
lines changed

3 files changed

+52
-12
lines changed

pom.xml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
<modelVersion>4.0.0</modelVersion>
33
<groupId>org.cryptomator</groupId>
44
<artifactId>cli</artifactId>
5-
<version>0.2.1</version>
5+
<version>0.3.0</version>
66
<name>Cryptomator CLI</name>
77
<description>Command line program to access encrypted files via WebDAV.</description>
88
<url>https://github.com/cryptomator/cli</url>
99

1010
<properties>
1111
<java.version>1.8</java.version>
1212
<commons.cli.version>1.3.1</commons.cli.version>
13-
<cryptofs.version>1.0.1</cryptofs.version>
14-
<webdav-nio.version>0.2.3</webdav-nio.version>
13+
<cryptofs.version>1.3.1</cryptofs.version>
14+
<webdav-nio.version>0.4.0</webdav-nio.version>
1515
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1616
</properties>
1717

@@ -56,21 +56,20 @@
5656
<dependency>
5757
<groupId>org.apache.logging.log4j</groupId>
5858
<artifactId>log4j-slf4j-impl</artifactId>
59-
<version>2.7</version>
59+
<version>2.8</version>
6060
</dependency>
6161
<dependency>
6262
<groupId>org.apache.logging.log4j</groupId>
6363
<artifactId>log4j-core</artifactId>
64-
<version>2.7</version>
64+
<version>2.8</version>
6565
</dependency>
6666
</dependencies>
6767

6868
<build>
6969
<plugins>
7070
<plugin>
71-
<groupId>org.apache.maven.plugins</groupId>
7271
<artifactId>maven-compiler-plugin</artifactId>
73-
<version>3.5.1</version>
72+
<version>3.6.1</version>
7473
<configuration>
7574
<source>${java.version}</source>
7675
<target>${java.version}</target>
@@ -80,6 +79,7 @@
8079

8180
<plugin>
8281
<artifactId>maven-assembly-plugin</artifactId>
82+
<version>3.0.0</version>
8383
<executions>
8484
<execution>
8585
<id>make-assembly</id>
@@ -105,4 +105,4 @@
105105
</plugin>
106106
</plugins>
107107
</build>
108-
</project>
108+
</project>

src/main/java/org/cryptomator/cli/Args.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
*******************************************************************************/
99
package org.cryptomator.cli;
1010

11+
import java.io.IOException;
12+
import java.nio.file.Files;
13+
import java.nio.file.Path;
14+
import java.nio.file.Paths;
1115
import java.util.Properties;
1216
import java.util.Set;
1317
import java.util.stream.Collectors;
18+
import java.util.stream.Stream;
1419

1520
import org.apache.commons.cli.CommandLine;
1621
import org.apache.commons.cli.DefaultParser;
@@ -27,7 +32,8 @@ public class Args {
2732
private static final String USAGE = "java -jar cryptomator-cli.jar" //
2833
+ " --bind localhost --port 8080" //
2934
+ " --vault mySecretVault=/path/to/vault --password mySecretVault=FooBar3000" //
30-
+ " --vault myOtherVault=/path/to/other/vault --password myOtherVault=BarFoo4000";
35+
+ " --vault myOtherVault=/path/to/other/vault --password myOtherVault=BarFoo4000" //
36+
+ " --vault myThirdVault=/path/to/third/vault --passwordfile myThirdVault=/path/to/passwordfile";
3137
private static final Options OPTIONS = new Options();
3238
static {
3339
OPTIONS.addOption(Option.builder() //
@@ -56,18 +62,31 @@ public class Args {
5662
.valueSeparator() //
5763
.hasArgs() //
5864
.build());
65+
OPTIONS.addOption(Option.builder() //
66+
.longOpt("passwordfile") //
67+
.argName("Passwordfile for a vault") //
68+
.desc("Format must be vaultName=passwordfile") //
69+
.valueSeparator() //
70+
.hasArgs() //
71+
.build());
5972
}
6073

6174
private final String bindAddr;
6275
private final int port;
6376
private final Properties vaultPaths;
6477
private final Properties vaultPasswords;
78+
private final Properties vaultPasswordFiles;
79+
80+
private boolean hasPasswordOrPasswordFile(Object vaultPath) {
81+
return vaultPasswords.containsKey(vaultPath) || vaultPasswordFiles.containsKey(vaultPath);
82+
}
6583

6684
public Args(CommandLine commandLine) throws ParseException {
6785
this.bindAddr = commandLine.getOptionValue("bind", "localhost");
6886
this.port = Integer.parseInt(commandLine.getOptionValue("port", "0"));
6987
this.vaultPaths = commandLine.getOptionProperties("vault");
7088
this.vaultPasswords = commandLine.getOptionProperties("password");
89+
this.vaultPasswordFiles = commandLine.getOptionProperties("passwordfile");
7190
}
7291

7392
public String getBindAddr() {
@@ -79,14 +98,29 @@ public int getPort() {
7998
}
8099

81100
public Set<String> getVaultNames() {
82-
return vaultPaths.keySet().stream().filter(vaultPasswords::containsKey).map(String.class::cast).collect(Collectors.toSet());
101+
return vaultPaths.keySet().stream().filter(this::hasPasswordOrPasswordFile).map(String.class::cast).collect(Collectors.toSet());
83102
}
84103

85104
public String getVaultPath(String vaultName) {
86105
return vaultPaths.getProperty(vaultName);
87106
}
88107

108+
public String getVaultPasswordPath(String vaultName) {
109+
return vaultPasswordFiles.getProperty(vaultName);
110+
}
111+
89112
public String getVaultPassword(String vaultName) {
113+
if (vaultPasswords.getProperty(vaultName) == null) {
114+
Path vaultPasswordPath = Paths.get(vaultPasswordFiles.getProperty(vaultName));
115+
if (Files.isReadable(vaultPasswordPath) && Files.isRegularFile(vaultPasswordPath)) {
116+
try (Stream<String> lines = Files.lines(vaultPasswordPath)) {
117+
return lines.findFirst().get().toString();
118+
} catch (IOException e) {
119+
return null;
120+
}
121+
}
122+
return null;
123+
}
90124
return vaultPasswords.getProperty(vaultName);
91125
}
92126

src/main/java/org/cryptomator/cli/CryptomatorCli.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.cryptomator.cryptofs.CryptoFileSystemProperties;
1818
import org.cryptomator.cryptofs.CryptoFileSystemProvider;
1919
import org.cryptomator.frontend.webdav.WebDavServer;
20+
import org.cryptomator.frontend.webdav.servlet.WebDavServletController;
2021
import org.slf4j.Logger;
2122
import org.slf4j.LoggerFactory;
2223

@@ -49,14 +50,18 @@ private static void validate(Args args) throws IllegalArgumentException {
4950

5051
for (String vaultName : args.getVaultNames()) {
5152
Path vaultPath = Paths.get(args.getVaultPath(vaultName));
53+
if ((args.getVaultPasswordPath(vaultName) != null) && args.getVaultPassword(vaultName) == null) {
54+
throw new IllegalArgumentException("Cannot read password from file: " + Paths.get(args.getVaultPasswordPath(vaultName)));
55+
}
5256
if (!Files.isDirectory(vaultPath)) {
5357
throw new IllegalArgumentException("Not a directory: " + vaultPath);
5458
}
5559
}
5660
}
5761

5862
private static void startup(Args args) throws IOException {
59-
WebDavServer server = WebDavServer.create(args.getBindAddr(), args.getPort());
63+
WebDavServer server = WebDavServer.create();
64+
server.bind(args.getBindAddr(), args.getPort());
6065
server.start();
6166

6267
for (String vaultName : args.getVaultNames()) {
@@ -65,7 +70,8 @@ private static void startup(Args args) throws IOException {
6570
String vaultPassword = args.getVaultPassword(vaultName);
6671
CryptoFileSystemProperties properties = CryptoFileSystemProperties.cryptoFileSystemProperties().withPassphrase(vaultPassword).build();
6772
Path vaultRoot = CryptoFileSystemProvider.newFileSystem(vaultPath, properties).getPath("/");
68-
server.startWebDavServlet(vaultRoot, vaultName);
73+
WebDavServletController servlet = server.createWebDavServlet(vaultRoot, vaultName);
74+
servlet.start();
6975
}
7076

7177
waitForShutdown(() -> {

0 commit comments

Comments
 (0)