diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java index 8f80f693b..9dba19a37 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeStrategy.java @@ -41,6 +41,7 @@ public abstract class UpgradeStrategy { * Upgrades a vault. Might take a moment, should be run in a background thread. */ public void upgrade(Vault vault, CharSequence passphrase) throws UpgradeFailedException { + LOG.info("Upgrading {} from {} to {}.", vault.path().getValue(), vaultVersionBeforeUpgrade, vaultVersionAfterUpgrade); Cryptor cryptor = null; try { final Path masterkeyFile = vault.path().getValue().resolve(Constants.MASTERKEY_FILENAME); @@ -49,12 +50,14 @@ public abstract class UpgradeStrategy { // create backup, as soon as we know the password was correct: final Path masterkeyBackupFile = vault.path().getValue().resolve(Constants.MASTERKEY_BACKUP_FILENAME); Files.copy(masterkeyFile, masterkeyBackupFile, StandardCopyOption.REPLACE_EXISTING); + LOG.info("Backuped masterkey."); // do stuff: upgrade(vault, cryptor); // write updated masterkey file: final byte[] upgradedMasterkeyFileContents = cryptor.writeKeysToMasterkeyFile(passphrase, vaultVersionAfterUpgrade).serialize(); final Path masterkeyFileAfterUpgrade = vault.path().getValue().resolve(Constants.MASTERKEY_FILENAME); // path may have changed Files.write(masterkeyFileAfterUpgrade, upgradedMasterkeyFileContents, StandardOpenOption.TRUNCATE_EXISTING); + LOG.info("Updated masterkey."); } catch (InvalidPassphraseException e) { throw new UpgradeFailedException(localization.getString("unlock.errorMessage.wrongPassword")); } catch (UnsupportedVaultFormatException e) { diff --git a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java index 487f98b85..0629083d6 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java +++ b/main/ui/src/main/java/org/cryptomator/ui/model/UpgradeVersion4to5.java @@ -57,6 +57,8 @@ class UpgradeVersion4to5 extends UpgradeStrategy { public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (BASE32_PATTERN.matcher(file.getFileName().toString()).find() && attrs.size() > cryptor.fileHeaderCryptor().headerSize()) { migrate(file, attrs, cryptor); + } else { + LOG.info("Skipping irrelevant file {}.", file); } return FileVisitResult.CONTINUE; } @@ -70,18 +72,20 @@ class UpgradeVersion4to5 extends UpgradeStrategy { } private void migrate(Path file, BasicFileAttributes attrs, Cryptor cryptor) throws IOException { + LOG.info("Starting migration of {}...", file); try (FileChannel ch = FileChannel.open(file, StandardOpenOption.READ, StandardOpenOption.WRITE)) { // read header: ByteBuffer headerBuf = ByteBuffer.allocate(cryptor.fileHeaderCryptor().headerSize()); ch.read(headerBuf); headerBuf.flip(); + LOG.info("\tHeader read"); FileHeader header = cryptor.fileHeaderCryptor().decryptHeader(headerBuf); long cleartextSize = header.getFilesize(); if (cleartextSize < 0) { - LOG.info("Skipping already migrated file {}.", file); + LOG.info("\tSkipping already migrated file"); return; } else if (cleartextSize > attrs.size()) { - LOG.warn("Skipping file {} with invalid file size {}/{}", file, cleartextSize, attrs.size()); + LOG.warn("\tSkipping file with invalid file size {}/{}", cleartextSize, attrs.size()); return; } int headerSize = cryptor.fileHeaderCryptor().headerSize(); @@ -93,12 +97,13 @@ class UpgradeVersion4to5 extends UpgradeStrategy { long newAdditionalCiphertextBytes = newCiphertextSize % ciphertextChunkSize; if (newAdditionalCiphertextBytes == 0) { // (new) last block is already correct. just truncate: - LOG.info("Migrating {} of cleartext size {}: Truncating to new ciphertext size: {}", file, cleartextSize, newEOF); + LOG.info("\tMigrating cleartext size {}: Truncating to new ciphertext size: {}", cleartextSize, newEOF); ch.truncate(newEOF); + LOG.info("\tFile truncated"); } else { // last block may contain padding and needs to be re-encrypted: long lastChunkIdx = newFullChunks; - LOG.info("Migrating {} of cleartext size {}: Re-encrypting chunk {}. New ciphertext size: {}", file, cleartextSize, lastChunkIdx, newEOF); + LOG.info("\tMigrating cleartext size {}: Re-encrypting chunk {}. New ciphertext size: {}", cleartextSize, lastChunkIdx, newEOF); long beginOfLastChunk = headerSize + lastChunkIdx * ciphertextChunkSize; assert beginOfLastChunk < newEOF; int lastCleartextChunkLength = (int) (cleartextSize % cleartextChunkSize); @@ -116,15 +121,18 @@ class UpgradeVersion4to5 extends UpgradeStrategy { ch.truncate(beginOfLastChunk); ch.write(newLastChunkCiphertext); } else { - LOG.error("Reached EOF at position {}/{}", beginOfLastChunk, newEOF); + LOG.error("\tReached EOF at position {}/{}", beginOfLastChunk, newEOF); return; // must exit method before changing header! } + LOG.info("\tReencrypted last block"); } header.setFilesize(-1l); ByteBuffer newHeaderBuf = cryptor.fileHeaderCryptor().encryptHeader(header); ch.position(0); ch.write(newHeaderBuf); + LOG.info("\tUpdated header"); } + LOG.info("Finished migration of {}.", file); } }