Skip to content

Commit 029b2e5

Browse files
committed
Metadata file/directory extension is .uvf.
1 parent f26423b commit 029b2e5

File tree

9 files changed

+73
-30
lines changed

9 files changed

+73
-30
lines changed

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/AbstractVault.java

+6
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@ public boolean contains(final Path file) {
282282
return false;
283283
}
284284

285+
public abstract String getRegularFileExtension();
286+
287+
public abstract String getDirectoryMetadataFilename();
288+
289+
public abstract String getBackupDirectoryMetadataFilename();
290+
285291
@Override
286292
public synchronized void close() {
287293
if(this.isUnlocked()) {

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/CryptoVault.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ public class CryptoVault extends AbstractVault {
9797
private static final String JSON_KEY_CIPHERCONFIG = "cipherCombo";
9898
private static final String JSON_KEY_SHORTENING_THRESHOLD = "shorteningThreshold";
9999

100+
private static final String REGULAR_FILE_EXTENSION = ".c9r";
101+
private static final String FILENAME_DIRECTORYID = "dir";
102+
private static final String DIRECTORY_METADATA_FILENAME = String.format("%s%s", FILENAME_DIRECTORYID, REGULAR_FILE_EXTENSION);
103+
private static final String BACKUP_FILENAME_DIRECTORYID = "dirid";
104+
private static final String BACKUP_DIRECTORY_METADATA_FILENAME = String.format("%s%s", BACKUP_FILENAME_DIRECTORYID, REGULAR_FILE_EXTENSION);
105+
100106
/**
101107
* Root of vault directory
102108
*/
@@ -119,7 +125,6 @@ public class CryptoVault extends AbstractVault {
119125
private final byte[] pepper;
120126

121127
public CryptoVault(final Path home) {
122-
// UVF: readVaultConfig - do we need to try multiple file names for dection "masterkey.cryptomator" and "vault.uvf"?
123128
this(home, DefaultVaultRegistry.DEFAULT_MASTERKEY_FILE_NAME, DEFAULT_VAULTCONFIG_FILE_NAME, VAULT_PEPPER);
124129
}
125130

@@ -336,7 +341,7 @@ protected CryptoDirectory createDirectoryProvider(final VaultConfig vaultConfig,
336341
case VAULT_VERSION_DEPRECATED:
337342
return new CryptoDirectoryV6Provider(vault, filenameProvider, filenameCryptor);
338343
default:
339-
return new CryptoDirectoryV7Provider(vault, filenameProvider, filenameCryptor);
344+
return new CryptoDirectoryV7Provider(this, filenameProvider, filenameCryptor);
340345
}
341346
}
342347

@@ -428,6 +433,21 @@ public int getNonceSize() {
428433
return nonceSize;
429434
}
430435

436+
@Override
437+
public String getRegularFileExtension() {
438+
return REGULAR_FILE_EXTENSION;
439+
}
440+
441+
@Override
442+
public String getDirectoryMetadataFilename() {
443+
return DIRECTORY_METADATA_FILENAME;
444+
}
445+
446+
@Override
447+
public String getBackupDirectoryMetadataFilename() {
448+
return BACKUP_DIRECTORY_METADATA_FILENAME;
449+
}
450+
431451
@Override
432452
public boolean equals(final Object o) {
433453
if(this == o) {

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/UVFVault.java

+22-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public class UVFVault extends AbstractVault {
4141

4242
private static final Logger log = LogManager.getLogger(UVFVault.class);
4343

44+
private static final String REGULAR_FILE_EXTENSION = ".uvf";
45+
private static final String FILENAME_DIRECTORYID = "dir";
46+
private static final String DIRECTORY_METADATA_FILENAME = String.format("%s%s", FILENAME_DIRECTORYID, REGULAR_FILE_EXTENSION);
47+
private static final String BACKUP_FILENAME_DIRECTORYID = "dirid";
48+
private static final String BACKUP_DIRECTORY_METADATA_FILENAME = String.format("%s%s", BACKUP_FILENAME_DIRECTORYID, REGULAR_FILE_EXTENSION);
49+
4450
/**
4551
* Root of vault directory
4652
*/
@@ -84,7 +90,7 @@ public UVFVault load(final Session<?> session, final PasswordCallback prompt) th
8490
this.cryptor = provider.provide(masterKey, FastSecureRandomProvider.get().provide());
8591
this.fileNameCryptor = new CryptorCache(cryptor.fileNameCryptor(masterKey.firstRevision())); // TODO revision eventually depends on location - safe?
8692
this.filenameProvider = new CryptoFilenameV7Provider(Integer.MAX_VALUE); // TODO there is no shortening in UVF defined yet
87-
this.directoryProvider = new CryptoDirectoryUVFProvider(vault, filenameProvider, fileNameCryptor);
93+
this.directoryProvider = new CryptoDirectoryUVFProvider(this, filenameProvider, fileNameCryptor);
8894
this.nonceSize = 12;
8995
return this;
9096
}
@@ -153,6 +159,21 @@ public int getVersion() {
153159
return VAULT_VERSION;
154160
}
155161

162+
@Override
163+
public String getRegularFileExtension() {
164+
return REGULAR_FILE_EXTENSION;
165+
}
166+
167+
@Override
168+
public String getDirectoryMetadataFilename() {
169+
return DIRECTORY_METADATA_FILENAME;
170+
}
171+
172+
@Override
173+
public String getBackupDirectoryMetadataFilename() {
174+
return BACKUP_DIRECTORY_METADATA_FILENAME;
175+
}
176+
156177
@Override
157178
public boolean equals(final Object o) {
158179
if(this == o) {

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDeleteV7Feature.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import ch.cyberduck.core.Session;
2424
import ch.cyberduck.core.cryptomator.AbstractVault;
2525
import ch.cyberduck.core.cryptomator.CryptoFilename;
26-
import ch.cyberduck.core.cryptomator.impl.CryptoDirectoryV7Provider;
2726
import ch.cyberduck.core.exception.AccessDeniedException;
2827
import ch.cyberduck.core.exception.BackgroundException;
2928
import ch.cyberduck.core.exception.NotfoundException;
@@ -63,7 +62,7 @@ public void delete(final Map<Path, TransferStatus> files, final PasswordCallback
6362
if(!f.equals(vault.getHome())) {
6463
final Path encrypt = vault.encrypt(session, f);
6564
if(f.isDirectory()) {
66-
final Path backup = new Path(encrypt, CryptoDirectoryV7Provider.BACKUP_DIRECTORY_METADATAFILE,
65+
final Path backup = new Path(encrypt, vault.getBackupDirectoryMetadataFilename(),
6766
EnumSet.of(AbstractPath.Type.file));
6867
try {
6968
log.debug("Deleting directory id backup file {}", backup);
@@ -88,7 +87,7 @@ public void delete(final Map<Path, TransferStatus> files, final PasswordCallback
8887
}
8988
final Path metadata = vault.encrypt(session, f, true);
9089
if(f.isDirectory()) {
91-
final Path metadataFile = new Path(metadata, CryptoDirectoryV7Provider.DIRECTORY_METADATAFILE, EnumSet.of(Path.Type.file));
90+
final Path metadataFile = new Path(metadata, vault.getDirectoryMetadataFilename(), EnumSet.of(Path.Type.file));
9291
log.debug("Add metadata file {}", metadataFile);
9392
metadataFiles.add(metadataFile);
9493
metadataFiles.add(metadata);

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoDirectoryV7Feature.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import ch.cyberduck.core.UUIDRandomStringService;
2222
import ch.cyberduck.core.cryptomator.AbstractVault;
2323
import ch.cyberduck.core.cryptomator.ContentWriter;
24-
import ch.cyberduck.core.cryptomator.impl.CryptoDirectoryV7Provider;
2524
import ch.cyberduck.core.cryptomator.random.RandomNonceGenerator;
2625
import ch.cyberduck.core.exception.BackgroundException;
2726
import ch.cyberduck.core.features.Directory;
@@ -46,11 +45,11 @@ public class CryptoDirectoryV7Feature<Reply> implements Directory<Reply> {
4645
private final RandomStringService random = new UUIDRandomStringService();
4746

4847
public CryptoDirectoryV7Feature(final Session<?> session, final Directory<Reply> delegate,
49-
final Write<Reply> writer, final AbstractVault cryptomator) {
48+
final Write<Reply> writer, final AbstractVault vault) {
5049
this.session = session;
5150
this.writer = writer;
5251
this.delegate = delegate;
53-
this.vault = cryptomator;
52+
this.vault = vault;
5453
}
5554

5655
@Override
@@ -61,7 +60,7 @@ public Path mkdir(final Path folder, final TransferStatus status) throws Backgro
6160
final Path directoryMetadataFolder = session._getFeature(Directory.class).mkdir(vault.encrypt(session, folder, true),
6261
new TransferStatus().withRegion(status.getRegion()));
6362
final Path directoryMetadataFile = new Path(directoryMetadataFolder,
64-
CryptoDirectoryV7Provider.DIRECTORY_METADATAFILE,
63+
vault.getDirectoryMetadataFilename(),
6564
EnumSet.of(Path.Type.file));
6665
log.debug("Write metadata {} for folder {}", directoryMetadataFile, folder);
6766
new ContentWriter(session).write(directoryMetadataFile, directoryId);

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/features/CryptoMoveV7Feature.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import ch.cyberduck.core.Path;
2121
import ch.cyberduck.core.Session;
2222
import ch.cyberduck.core.cryptomator.AbstractVault;
23-
import ch.cyberduck.core.cryptomator.impl.CryptoDirectoryV7Provider;
2423
import ch.cyberduck.core.exception.BackgroundException;
2524
import ch.cyberduck.core.exception.InvalidFilenameException;
2625
import ch.cyberduck.core.features.Delete;
@@ -37,10 +36,10 @@ public class CryptoMoveV7Feature implements Move {
3736
private final Move proxy;
3837
private final AbstractVault vault;
3938

40-
public CryptoMoveV7Feature(final Session<?> session, final Move delegate, final AbstractVault cryptomator) {
39+
public CryptoMoveV7Feature(final Session<?> session, final Move delegate, final AbstractVault vault) {
4140
this.session = session;
4241
this.proxy = delegate;
43-
this.vault = cryptomator;
42+
this.vault = vault;
4443
}
4544

4645
@Override
@@ -51,8 +50,8 @@ public Path move(final Path file, final Path renamed, final TransferStatus statu
5150
final Path target = proxy.move(sourceEncrypted, targetEncrypted, status, callback, connectionCallback);
5251
if(file.isDirectory()) {
5352
if(!proxy.isRecursive(file, renamed)) {
54-
proxy.move(new Path(sourceEncrypted, CryptoDirectoryV7Provider.DIRECTORY_METADATAFILE, EnumSet.of(Path.Type.file)),
55-
new Path(targetEncrypted, CryptoDirectoryV7Provider.DIRECTORY_METADATAFILE, EnumSet.of(Path.Type.file)),
53+
proxy.move(new Path(sourceEncrypted, vault.getDirectoryMetadataFilename(), EnumSet.of(Path.Type.file)),
54+
new Path(targetEncrypted, vault.getBackupDirectoryMetadataFilename(), EnumSet.of(Path.Type.file)),
5655
new TransferStatus(status), callback, connectionCallback);
5756
}
5857
vault.getDirectoryProvider().delete(file);

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/impl/CryptoDirectoryUVFProvider.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import ch.cyberduck.core.Path;
1919
import ch.cyberduck.core.Session;
2020
import ch.cyberduck.core.SimplePathPredicate;
21+
import ch.cyberduck.core.cryptomator.AbstractVault;
2122
import ch.cyberduck.core.cryptomator.CryptoFilename;
2223
import ch.cyberduck.core.cryptomator.CryptorCache;
2324
import ch.cyberduck.core.exception.BackgroundException;
@@ -26,9 +27,9 @@ public class CryptoDirectoryUVFProvider extends CryptoDirectoryV7Provider {
2627

2728
private final Path home;
2829

29-
public CryptoDirectoryUVFProvider(final Path vault, final CryptoFilename filenameProvider, final CryptorCache filenameCryptor) {
30+
public CryptoDirectoryUVFProvider(final AbstractVault vault, final CryptoFilename filenameProvider, final CryptorCache filenameCryptor) {
3031
super(vault, filenameProvider, filenameCryptor);
31-
this.home = vault;
32+
this.home = vault.getHome();
3233
}
3334

3435
@Override

cryptomator/src/main/java/ch/cyberduck/core/cryptomator/impl/CryptoDirectoryV7Provider.java

+7-10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import ch.cyberduck.core.RandomStringService;
2020
import ch.cyberduck.core.Session;
2121
import ch.cyberduck.core.UUIDRandomStringService;
22+
import ch.cyberduck.core.cryptomator.AbstractVault;
2223
import ch.cyberduck.core.cryptomator.ContentReader;
2324
import ch.cyberduck.core.cryptomator.CryptoFilename;
2425
import ch.cyberduck.core.cryptomator.CryptorCache;
@@ -36,27 +37,23 @@
3637
public class CryptoDirectoryV7Provider extends CryptoDirectoryV6Provider {
3738
private static final Logger log = LogManager.getLogger(CryptoDirectoryV7Provider.class);
3839

39-
public static final String EXTENSION_REGULAR = ".c9r";
40-
public static final String FILENAME_DIRECTORYID = "dir";
41-
public static final String DIRECTORY_METADATAFILE = String.format("%s%s", FILENAME_DIRECTORYID, EXTENSION_REGULAR);
42-
public static final String BACKUP_FILENAME_DIRECTORYID = "dirid";
43-
public static final String BACKUP_DIRECTORY_METADATAFILE = String.format("%s%s", BACKUP_FILENAME_DIRECTORYID, EXTENSION_REGULAR);
44-
4540
private final CryptoFilename filenameProvider;
4641
private final CryptorCache filenameCryptor;
42+
private final AbstractVault vault;
4743

4844
private final RandomStringService random
4945
= new UUIDRandomStringService();
5046

51-
public CryptoDirectoryV7Provider(final Path vault, final CryptoFilename filenameProvider, final CryptorCache filenameCryptor) {
52-
super(vault, filenameProvider, filenameCryptor);
47+
public CryptoDirectoryV7Provider(final AbstractVault vault, final CryptoFilename filenameProvider, final CryptorCache filenameCryptor) {
48+
super(vault.getHome(), filenameProvider, filenameCryptor);
5349
this.filenameProvider = filenameProvider;
5450
this.filenameCryptor = filenameCryptor;
51+
this.vault = vault;
5552
}
5653

5754
@Override
5855
public String toEncrypted(final Session<?> session, final byte[] directoryId, final String filename, final EnumSet<Path.Type> type) throws BackgroundException {
59-
final String ciphertextName = filenameCryptor.encryptFilename(BaseEncoding.base64Url(), filename, directoryId) + EXTENSION_REGULAR;
56+
final String ciphertextName = filenameCryptor.encryptFilename(BaseEncoding.base64Url(), filename, directoryId) + vault.getRegularFileExtension();
6057
log.debug("Encrypted filename {} to {}", filename, ciphertextName);
6158
return filenameProvider.deflate(session, ciphertextName);
6259
}
@@ -69,7 +66,7 @@ protected byte[] load(final Session<?> session, final Path directory) throws Bac
6966
// Read directory id from file
7067
try {
7168
log.debug("Read directory ID for folder {} from {}", directory, ciphertextName);
72-
final Path metadataFile = new Path(metadataParent, CryptoDirectoryV7Provider.DIRECTORY_METADATAFILE, EnumSet.of(Path.Type.file, Path.Type.encrypted));
69+
final Path metadataFile = new Path(metadataParent, vault.getDirectoryMetadataFilename(), EnumSet.of(Path.Type.file, Path.Type.encrypted));
7370
return new ContentReader(session).readBytes(metadataFile);
7471
}
7572
catch(NotfoundException e) {

cryptomator/src/test/java/ch/cyberduck/core/cryptomator/impl/CryptoDirectoryV7ProviderTest.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import ch.cyberduck.core.Path;
2121
import ch.cyberduck.core.TestProtocol;
2222
import ch.cyberduck.core.cryptomator.CryptoDirectory;
23+
import ch.cyberduck.core.cryptomator.CryptoVault;
2324
import ch.cyberduck.core.cryptomator.CryptorCache;
2425
import ch.cyberduck.core.exception.NotfoundException;
2526

@@ -42,7 +43,7 @@ public void testToEncryptedInvalidArgument() throws Exception {
4243
final CryptorProvider crypto = CryptorProvider.forScheme(CryptorProvider.Scheme.SIV_GCM);
4344
final SecureRandom random = new SecureRandom();
4445
final Cryptor cryptor = crypto.provide(PerpetualMasterkey.generate(random), random);
45-
final CryptoDirectory provider = new CryptoDirectoryV7Provider(home, new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
46+
final CryptoDirectory provider = new CryptoDirectoryV7Provider(new CryptoVault(home), new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
4647
provider.toEncrypted(new NullSession(new Host(new TestProtocol())), null, new Path("/vault/f", EnumSet.of(Path.Type.file)));
4748
}
4849

@@ -52,7 +53,7 @@ public void testToEncryptedInvalidPath() throws Exception {
5253
final CryptorProvider crypto = CryptorProvider.forScheme(CryptorProvider.Scheme.SIV_GCM);
5354
final SecureRandom random = new SecureRandom();
5455
final Cryptor cryptor = crypto.provide(PerpetualMasterkey.generate(random), random);
55-
final CryptoDirectory provider = new CryptoDirectoryV7Provider(home, new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
56+
final CryptoDirectory provider = new CryptoDirectoryV7Provider(new CryptoVault(home), new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
5657
provider.toEncrypted(new NullSession(new Host(new TestProtocol())), null, new Path("/", EnumSet.of(Path.Type.directory)));
5758
}
5859

@@ -63,7 +64,7 @@ public void testToEncryptedDirectory() throws Exception {
6364
final CryptorProvider crypto = CryptorProvider.forScheme(CryptorProvider.Scheme.SIV_GCM);
6465
final SecureRandom random = new SecureRandom();
6566
final Cryptor cryptor = crypto.provide(PerpetualMasterkey.generate(random), random);
66-
final CryptoDirectory provider = new CryptoDirectoryV7Provider(home, new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
67+
final CryptoDirectory provider = new CryptoDirectoryV7Provider(new CryptoVault(home), new CryptoFilenameV7Provider(), new CryptorCache(cryptor.fileNameCryptor()));
6768
assertNotNull(provider.toEncrypted(session, null, home));
6869
final Path f = new Path("/vault/f", EnumSet.of(Path.Type.directory));
6970
assertNotNull(provider.toEncrypted(session, null, f));

0 commit comments

Comments
 (0)