mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-07 16:06:08 +00:00
Fix remote path retrieval. Now it depends on webdav url to support spaces
This commit is contained in:
parent
a65a82cae0
commit
8e4f243031
@ -72,12 +72,11 @@ class ReadRemoteFolderOperation(
|
||||
if (isSuccess(status)) {
|
||||
val mFolderAndFiles = ArrayList<RemoteFile>()
|
||||
|
||||
// parse data from remote folder
|
||||
// TODO: Remove that !!
|
||||
val remoteFolder = RemoteFile.getRemoteFileFromDav(
|
||||
davResource = propfindMethod.root!!,
|
||||
userId = AccountUtils.getUserId(mAccount, mContext),
|
||||
userName = mAccount.name
|
||||
userName = mAccount.name,
|
||||
spaceWebDavUrl = spaceWebDavUrl,
|
||||
)
|
||||
mFolderAndFiles.add(remoteFolder)
|
||||
|
||||
@ -86,7 +85,8 @@ class ReadRemoteFolderOperation(
|
||||
val remoteFile = RemoteFile.getRemoteFileFromDav(
|
||||
davResource = resource,
|
||||
userId = AccountUtils.getUserId(mAccount, mContext),
|
||||
userName = mAccount.name
|
||||
userName = mAccount.name,
|
||||
spaceWebDavUrl = spaceWebDavUrl,
|
||||
)
|
||||
mFolderAndFiles.add(remoteFile)
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ package com.owncloud.android.lib.resources.files
|
||||
|
||||
import android.net.Uri
|
||||
import android.os.Parcelable
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import at.bitfire.dav4jvm.PropStat
|
||||
import at.bitfire.dav4jvm.Property
|
||||
import at.bitfire.dav4jvm.Response
|
||||
@ -100,8 +101,13 @@ data class RemoteFile(
|
||||
const val MIME_DIR = "DIR"
|
||||
const val MIME_DIR_UNIX = "httpd/unix-directory"
|
||||
|
||||
fun getRemoteFileFromDav(davResource: Response, userId: String, userName: String): RemoteFile {
|
||||
val remotePath = getRemotePathFromUrl(davResource.href, userId)
|
||||
fun getRemoteFileFromDav(
|
||||
davResource: Response,
|
||||
userId: String,
|
||||
userName: String,
|
||||
spaceWebDavUrl: String? = null
|
||||
): RemoteFile {
|
||||
val remotePath = getRemotePathFromUrl(davResource.href, userId, spaceWebDavUrl)
|
||||
val remoteFile = RemoteFile(remotePath = remotePath, owner = userName)
|
||||
val properties = getPropertiesEvenIfPostProcessing(davResource)
|
||||
|
||||
@ -164,15 +170,25 @@ data class RemoteFile(
|
||||
* Retrieves a relative path from a remote file url
|
||||
*
|
||||
*
|
||||
* Example: url:port/remote.php/dav/files/username/Documents/text.txt => /Documents/text.txt
|
||||
* Example legacy:
|
||||
* /remote.php/dav/files/username/Documents/text.txt => /Documents/text.txt
|
||||
*
|
||||
* Example spaces:
|
||||
* /dav/spaces/8871f4f3-fc6f-4a66-8bed-62f175f76f38$05bca744-d89f-4e9c-a990-25a0d7f03fe9/Documents/text.txt => /Documents/text.txt
|
||||
*
|
||||
* @param url remote file url
|
||||
* @param userId file owner
|
||||
* @param spaceWebDavUrl custom web dav url for space
|
||||
* @return remote relative path of the file
|
||||
*/
|
||||
private fun getRemotePathFromUrl(url: HttpUrl, userId: String): String {
|
||||
val davFilesPath = OwnCloudClient.WEBDAV_FILES_PATH_4_0 + userId
|
||||
val absoluteDavPath = Uri.decode(url.encodedPath)
|
||||
@VisibleForTesting
|
||||
fun getRemotePathFromUrl(
|
||||
url: HttpUrl,
|
||||
userId: String,
|
||||
spaceWebDavUrl: String? = null,
|
||||
): String {
|
||||
val davFilesPath = spaceWebDavUrl ?: (OwnCloudClient.WEBDAV_FILES_PATH_4_0 + userId)
|
||||
val absoluteDavPath = if (spaceWebDavUrl != null) Uri.decode(url.toString()) else Uri.decode(url.encodedPath)
|
||||
val pathToOc = absoluteDavPath.split(davFilesPath).first()
|
||||
return absoluteDavPath.replace(pathToOc + davFilesPath, "")
|
||||
}
|
||||
|
@ -0,0 +1,59 @@
|
||||
/* ownCloud Android Library is available under MIT license
|
||||
* Copyright (C) 2023 ownCloud GmbH.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
package com.owncloud.android.lib
|
||||
|
||||
import android.os.Build
|
||||
import com.owncloud.android.lib.resources.files.RemoteFile
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.robolectric.RobolectricTestRunner
|
||||
import org.robolectric.annotation.Config
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(sdk = [Build.VERSION_CODES.O], manifest = Config.NONE)
|
||||
class RemoteFileTest {
|
||||
|
||||
@Test
|
||||
fun getRemotePathFromUrl_legacyWebDav() {
|
||||
val httpUrlToTest = "https://server.url/remote.php/dav/files/username/Documents/text.txt".toHttpUrl()
|
||||
val expectedRemotePath = "/Documents/text.txt"
|
||||
|
||||
val actualRemotePath = RemoteFile.Companion.getRemotePathFromUrl(httpUrlToTest, "username")
|
||||
assertEquals(expectedRemotePath, actualRemotePath)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun getRemotePathFromUrl_spacesWebDav() {
|
||||
val spaceWebDavUrl = "https://server.url/dav/spaces/8871f4f3-fc6f-4a66-8bed-62f175f76f38$05bca744-d89f-4e9c-a990-25a0d7f03fe9"
|
||||
|
||||
val httpUrlToTest =
|
||||
"https://server.url/dav/spaces/8871f4f3-fc6f-4a66-8bed-62f175f76f38$05bca744-d89f-4e9c-a990-25a0d7f03fe9/Documents/text.txt".toHttpUrl()
|
||||
val expectedRemotePath = "/Documents/text.txt"
|
||||
|
||||
val actualRemotePath = RemoteFile.Companion.getRemotePathFromUrl(httpUrlToTest, "username", spaceWebDavUrl)
|
||||
assertEquals(expectedRemotePath, actualRemotePath)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user