Эх сурвалжийг харах

Merge pull request #4470 from stephanritscher/master

Normalize local target path in auto upload
Tobias Kaminsky 5 жил өмнө
parent
commit
a1c28f93d6

+ 5 - 2
src/main/java/com/owncloud/android/utils/FileStorageUtils.java

@@ -54,6 +54,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import androidx.annotation.Nullable;
 import androidx.core.app.ActivityCompat;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -164,7 +165,7 @@ public final class FileStorageUtils {
      */
     public static String getInstantUploadFilePath(Locale current,
                                                   String remotePath,
-                                                  String fileName,
+                                                  @Nullable String fileName,
                                                   long dateTaken,
                                                   Boolean subfolderByDate) {
         String subPath = "";
@@ -172,7 +173,9 @@ public final class FileStorageUtils {
             subPath = getSubPathFromDate(dateTaken, current);
         }
 
-        return remotePath + OCFile.PATH_SEPARATOR + subPath + (fileName == null ? "" : fileName);
+        // Path must be normalized; otherwise the next RefreshFolderOperation has a mismatch and deletes the local file.
+        return (remotePath + OCFile.PATH_SEPARATOR + subPath + (fileName == null ? "" : fileName))
+            .replaceAll(OCFile.PATH_SEPARATOR + "+", OCFile.PATH_SEPARATOR);
     }
 
 

+ 101 - 0
src/test/java/com/nextcloud/client/utils/FileStorageUtilsTest.kt

@@ -0,0 +1,101 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2019 Tobias Kaminsky
+ * Copyright (C) 2019 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.client.utils
+
+import com.owncloud.android.utils.FileStorageUtils
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import java.util.Locale
+
+class FileStorageUtilsTest {
+    @Test
+    fun testInstantUploadPathNullFilename() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            null,
+            123123123L,
+            false)
+        val expected = "/subfolder/"
+
+        assertEquals(expected, result)
+    }
+
+    @Test
+    fun testInstantUploadPathNullEmptyDate() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            "file.pdf",
+            0,
+            true)
+        val expected = "/subfolder/file.pdf"
+
+        assertEquals(expected, result)
+    }
+
+    @Test
+    fun testInstantUploadPath() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            "file.pdf",
+            123123123L,
+            false)
+        val expected = "/subfolder/file.pdf"
+
+        assertEquals(expected, result)
+    }
+
+    @Test
+    fun testInstantUploadPathWithSubfolderByDate() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            "file.pdf",
+            1569918628000,
+            true)
+        val expected = "/subfolder/2019/10/file.pdf"
+
+        assertEquals(expected, result)
+    }
+
+    @Test
+    fun testInstantUploadPathWithSubfolderFile() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            "/sub/file.pdf",
+            123123123L,
+            false)
+        val expected = "/subfolder/sub/file.pdf"
+
+        assertEquals(expected, result)
+    }
+
+    @Test
+    fun testInstantUploadPathWithSubfolderByDateWithSubfolderFile() {
+        val result = FileStorageUtils.getInstantUploadFilePath(Locale.ROOT,
+            "/subfolder/",
+            "/sub/file.pdf",
+            1569918628000,
+            true)
+        val expected = "/subfolder/2019/10/sub/file.pdf"
+
+        assertEquals(expected, result)
+    }
+}