From b1ae048239d5fa7e4f07887663383635863a0554 Mon Sep 17 00:00:00 2001 From: Jim Kirisame Date: Thu, 2 Apr 2026 09:30:34 +0800 Subject: [PATCH] Preserve original file extension in WebDAV temporary files Some WebDAV providers do not support changing file extensions. This change modifies the temporary file naming to insert the .tmp suffix before the extension instead of after it, e.g. file.kdbx becomes file.tmp.abc12345.kdbx instead of file.kdbx.tmp.abc12345. --- .../javafilestorage/WebDavStorage.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java index 686e1283e..211c32bc1 100644 --- a/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java +++ b/src/java/JavaFileStorage/app/src/main/java/keepass2android/javafilestorage/WebDavStorage.java @@ -389,9 +389,24 @@ public void uploadFile(String path, byte[] data, boolean writeTransactional) if (writeTransactional) { - String randomSuffix = ".tmp." + generateRandomHexString(8); - uploadFile(path + randomSuffix, data, false); - renameOrMoveWebDavResource(path+randomSuffix, path, true); + // Generate a unique temporary file suffix + String tempSuffix = ".tmp." + generateRandomHexString(8); + String tempPath; + + // Preserve the original file extension for WebDAV providers that don't support + // changing extensions. Insert temp suffix before the extension instead of after it. + // Example: "file.kdbx" -> "file.tmp.abc12345.kdbx" (instead of "file.kdbx.tmp.abc12345") + int lastDot = path.lastIndexOf('.'); + int lastSlash = path.lastIndexOf('/'); + if (lastDot > lastSlash && lastDot >= 0) { + // File has an extension: insert temp suffix before the extension + tempPath = path.substring(0, lastDot) + tempSuffix + path.substring(lastDot); + } else { + // No extension: append temp suffix at the end + tempPath = path + tempSuffix; + } + uploadFile(tempPath, data, false); + renameOrMoveWebDavResource(tempPath, path, true); return; }