From 45df2d6605ec343b5e8c95d7ba5ab3595cb49e3c Mon Sep 17 00:00:00 2001 From: Philipp Crocoll Date: Mon, 15 Nov 2021 09:32:02 +0100 Subject: [PATCH] preserve filename case in Dropbox when uploading files, closes https://github.com/PhilippC/keepass2android/issues/898 --- .../javafilestorage/DropboxV2Storage.java | 27 ++++++++++++++++++- .../javafilestorage/JavaFileStorage.java | 2 ++ .../javafilestoragetest/MainActivity.java | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/DropboxV2Storage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/DropboxV2Storage.java index 0ae835b1..2ce9c166 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/DropboxV2Storage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/DropboxV2Storage.java @@ -192,7 +192,30 @@ public class DropboxV2Storage extends JavaFileStorageBase { ByteArrayInputStream bis = new ByteArrayInputStream(data); try { - path = removeProtocol(path); + + //try to get the file id from the path and use that to create the uploadBuilder. This should preserve the case of the path. + String id = null; + + try { + id = getFileEntry(path).userData; + } + catch (Exception e) + { + //ignore. file might not exist yet. + } + + if (id != null && id.length() > 0) + { + path = id; + } + else + { + path = removeProtocol(path); + } + + + + dbxClient.files().uploadBuilder(path).withMode(WriteMode.OVERWRITE).uploadAndFinish(bis); @@ -416,6 +439,7 @@ public class DropboxV2Storage extends JavaFileStorageBase fileEntry.sizeInBytes = fm.getSize(); fileEntry.isDirectory = false; fileEntry.lastModifiedTime = fm.getServerModified().getTime(); + fileEntry.userData = fm.getId(); } else if (e instanceof DeletedMetadata) { @@ -428,6 +452,7 @@ public class DropboxV2Storage extends JavaFileStorageBase fileEntry.path = getProtocolId()+"://"+ e.getPathLower(); fileEntry.displayName = e.getName(); + //Log.d("JFS","fileEntry="+fileEntry); //Log.d("JFS","Ok. Dir="+fileEntry.isDirectory); return fileEntry; diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java index 49019bfd..3875fdc1 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/JavaFileStorage.java @@ -48,6 +48,8 @@ public class FileEntry { public boolean canWrite; public long sizeInBytes; public String displayName; + + public String userData; //can be set by the storage implementation public FileEntry() { diff --git a/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java index 3fab6709..fcbe46c1 100644 --- a/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java +++ b/src/java/JavaFileStorageTest-AS/app/src/main/java/com/crocoapps/javafilestoragetest/MainActivity.java @@ -557,7 +557,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag } });*/ - storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "3s86datjhkihwyc", !simulateRestart); + storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); //storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart); //storageToTest = new DropboxAppFolderFileStorage(ctx,"ax0268uydp1ya57", "3s86datjhkihwyc", true);