From 4f001550f9cd8194d7662bbc18c76c53a85e6cdf Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 21 Dec 2022 17:34:23 +0100 Subject: [PATCH 01/23] Save spaces-related capabilities in database --- .../status/GetRemoteCapabilitiesOperation.kt | 2 +- .../lib/resources/status/RemoteCapability.kt | 61 ++++++++++------- .../status/responses/CapabilityResponse.kt | 66 ++++++++++++------- 3 files changed, 79 insertions(+), 50 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt index 8591a68a..dd48376e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt @@ -45,7 +45,7 @@ import java.net.URL /** * Get the Capabilities from the server - * Save in Result.getData in a RemoteCapability object + * Save Result.getData in a RemoteCapability object * * @author masensio * @author David González Verdugo diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt index ff7f5b4f..fe4c26f0 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt @@ -1,29 +1,33 @@ -/* ownCloud Android Library is available under MIT license - * @author masensio - * @author David González Verdugo - * @author Abel García de Prada - * Copyright (C) 2020 ownCloud GmbH. +/** + * ownCloud Android Library is available under MIT license * - * 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: + * @author masensio + * @author David González Verdugo + * @author Abel García de Prada + * @author Juan Carlos Garrote Gascón * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * Copyright (C) 2022 ownCloud GmbH. * - * 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. + * 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.resources.status /** @@ -33,7 +37,7 @@ data class RemoteCapability( var accountName: String = "", // Server version - var versionMayor: Int = 0, + var versionMajor: Int = 0, var versionMinor: Int = 0, var versionMicro: Int = 0, var versionString: String = "", @@ -68,7 +72,10 @@ data class RemoteCapability( var filesUndelete: CapabilityBooleanType = CapabilityBooleanType.UNKNOWN, var filesVersioning: CapabilityBooleanType = CapabilityBooleanType.UNKNOWN, val filesPrivateLinks: CapabilityBooleanType = CapabilityBooleanType.UNKNOWN, - val filesAppProviders: List?, + val filesAppProviders: List?, + + // Spaces + val spaces: RemoteSpaces?, ) { /** * Enum for Boolean Type in capabilities, with values: @@ -101,7 +108,7 @@ data class RemoteCapability( } } - data class RemoteOCISProvider( + data class RemoteAppProviders( val enabled: Boolean, val version: String, val appsUrl: String?, @@ -109,4 +116,10 @@ data class RemoteCapability( val openWebUrl: String?, val newUrl: String?, ) + + data class RemoteSpaces( + val enabled: Boolean, + val projects: Boolean, + val shareJail: Boolean, + ) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt index d4000b93..3c281b70 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt @@ -1,32 +1,35 @@ -/* ownCloud Android Library is available under MIT license - * @author Abel García de Prada - * Copyright (C) 2020 ownCloud GmbH. +/** + * ownCloud Android Library is available under MIT license * - * 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: + * @author Abel García de Prada + * @author Juan Carlos Garrote Gascón * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. + * Copyright (C) 2022 ownCloud GmbH. * - * 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. + * 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.resources.status.responses import com.owncloud.android.lib.resources.status.RemoteCapability -import com.owncloud.android.lib.resources.status.RemoteCapability.CapabilityBooleanType -import com.owncloud.android.lib.resources.status.RemoteCapability.RemoteOCISProvider +import com.owncloud.android.lib.resources.status.RemoteCapability.* import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -37,7 +40,7 @@ data class CapabilityResponse( val capabilities: Capabilities? ) { fun toRemoteCapability(): RemoteCapability = RemoteCapability( - versionMayor = serverVersion?.major ?: 0, + versionMajor = serverVersion?.major ?: 0, versionMinor = serverVersion?.minor ?: 0, versionMicro = serverVersion?.micro ?: 0, versionString = serverVersion?.string ?: "", @@ -70,10 +73,11 @@ data class CapabilityResponse( filesUndelete = CapabilityBooleanType.fromBooleanValue(capabilities?.fileCapabilities?.undelete), filesVersioning = CapabilityBooleanType.fromBooleanValue(capabilities?.fileCapabilities?.versioning), filesPrivateLinks = capabilities?.fileCapabilities?.privateLinks?.let { CapabilityBooleanType.fromBooleanValue(it) } ?: CapabilityBooleanType.UNKNOWN, - filesAppProviders = capabilities?.fileCapabilities?.appProviders?.map { it.toOCISProvider() }, + filesAppProviders = capabilities?.fileCapabilities?.appProviders?.map { it.toAppProviders() }, filesSharingFederationIncoming = CapabilityBooleanType.fromBooleanValue(capabilities?.fileSharingCapabilities?.fileSharingFederation?.incoming), filesSharingFederationOutgoing = CapabilityBooleanType.fromBooleanValue(capabilities?.fileSharingCapabilities?.fileSharingFederation?.outgoing), filesSharingUserProfilePicture = CapabilityBooleanType.fromBooleanValue(capabilities?.fileSharingCapabilities?.fileSharingUser?.profilePicture), + spaces = capabilities?.spacesCapabilities?.toSpaces(), ) } @@ -86,7 +90,9 @@ data class Capabilities( @Json(name = "files") val fileCapabilities: FileCapabilities?, @Json(name = "dav") - val davCapabilities: DavCapabilities? + val davCapabilities: DavCapabilities?, + @Json(name = "spaces") + val spacesCapabilities: SpacesCapabilities? ) @JsonClass(generateAdapter = true) @@ -182,7 +188,7 @@ data class AppProvider( @Json(name = "new_url") val newUrl: String?, ) { - fun toOCISProvider() = RemoteOCISProvider(enabled, version, appsUrl, openUrl, openWebUrl, newUrl) + fun toAppProviders() = RemoteAppProviders(enabled, version, appsUrl, openUrl, openWebUrl, newUrl) } @JsonClass(generateAdapter = true) @@ -190,6 +196,16 @@ data class DavCapabilities( val chunking: String? ) +@JsonClass(generateAdapter = true) +data class SpacesCapabilities( + val enabled: Boolean, + val projects: Boolean, + @Json(name = "share_jail") + val shareJail: Boolean, +) { + fun toSpaces() = RemoteSpaces(enabled, projects, shareJail) +} + @JsonClass(generateAdapter = true) data class ServerVersion( var major: Int?, From f0dda9eb8bbc6265dad69357ac9b5c40c03e0333 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Mon, 9 Jan 2023 13:27:33 +0100 Subject: [PATCH 02/23] Added trailing comma --- .../lib/resources/status/responses/CapabilityResponse.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt index 3c281b70..31673541 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/responses/CapabilityResponse.kt @@ -92,7 +92,7 @@ data class Capabilities( @Json(name = "dav") val davCapabilities: DavCapabilities?, @Json(name = "spaces") - val spacesCapabilities: SpacesCapabilities? + val spacesCapabilities: SpacesCapabilities?, ) @JsonClass(generateAdapter = true) From b1a3402656534e87b71e9014434d9afeddab1626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Wed, 21 Dec 2022 19:13:31 +0100 Subject: [PATCH 03/23] Create spaces fetch operation and spaces service --- .../spaces/GetRemoteSpacesOperation.kt | 103 +++++++++++++++++ .../spaces/responses/SpacesResponse.kt | 104 ++++++++++++++++++ .../spaces/services/OCSpacesService.kt | 34 ++++++ .../spaces/services/SpacesService.kt | 31 ++++++ 4 files changed, 272 insertions(+) create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt new file mode 100644 index 00000000..46e36a10 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt @@ -0,0 +1,103 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.resources.spaces + +import android.net.Uri +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.CommonOcsResponse +import com.owncloud.android.lib.resources.shares.responses.ShareeOcsResponse +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse +import com.owncloud.android.lib.resources.spaces.responses.SpacesResponseWrapper +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import timber.log.Timber +import java.lang.reflect.Type +import java.net.URL + +class GetRemoteSpacesOperation : RemoteOperation>() { + override fun run(client: OwnCloudClient): RemoteOperationResult> { + val requestUri = buildRequestUri(client.baseUri) + + val getMethod = GetMethod(URL(requestUri.toString())) + + return try { + val status = client.executeHttpMethod(getMethod) + val response = getMethod.getResponseBodyAsString() + + if (isSuccess(status)) { + onRequestSuccessful(response) + } else { + onResultUnsuccessful(getMethod, response, status) + } + } catch (e: Exception) { + Timber.e(e, "Exception while getting remote shares") + RemoteOperationResult(e) + } + } + + private fun buildRequestUri(baseUri: Uri) = + baseUri.buildUpon() + .appendEncodedPath(GRAPH_API_PATH) + .appendEncodedPath(ENDPOINT_SPACES_LIST) + .build() + + private fun parseResponse(response: String): List { + val moshi = Moshi.Builder().build() + val adapter: JsonAdapter = moshi.adapter(SpacesResponseWrapper::class.java) + return adapter.fromJson(response)?.value ?: listOf() + } + + private fun onResultUnsuccessful( + method: GetMethod, + response: String?, + status: Int + ): RemoteOperationResult> { + Timber.e("Failed response while getting spaces for user") + if (response != null) { + Timber.e("*** status code: $status; response message: $response") + } else { + Timber.e("*** status code: $status") + } + return RemoteOperationResult(method) + } + + private fun onRequestSuccessful(response: String?): RemoteOperationResult> { + val result = RemoteOperationResult>(RemoteOperationResult.ResultCode.OK) + Timber.d("Successful response: $response") + result.data = response?.let { parseResponse(it) } ?: listOf() + Timber.d("*** Fetch of spaces completed and parsed to ${result.data}") + return result + } + + private fun isSuccess(status: Int) = status == HttpConstants.HTTP_OK + + companion object { + private const val GRAPH_API_PATH = "graph/v1.0" + private const val ENDPOINT_SPACES_LIST = "me/drives" + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt new file mode 100644 index 00000000..8ccca7cc --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -0,0 +1,104 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.resources.spaces.responses + +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class SpacesResponseWrapper( + val value: List +) + +@JsonClass(generateAdapter = true) +data class SpaceResponse( + val description: String?, + val driveAlias: String, + val driveType: String, + val id: String, + val lastModifiedDateTime: String, + val name: String, + val owner: OwnerResponse, + val quota: QuotaResponse, + val root: RootResponse, + val special: List?, + val webUrl: String +) + +@JsonClass(generateAdapter = true) +data class OwnerResponse( + val user: UserResponse +) + +@JsonClass(generateAdapter = true) +data class QuotaResponse( + val remaining: Long, + val state: String, + val total: Int, + val used: Int +) + +@JsonClass(generateAdapter = true) +data class RootResponse( + val eTag: String, + val id: String, + val permissions: List?, + val webDavUrl: String +) + +@JsonClass(generateAdapter = true) +data class SpecialResponse( + val eTag: String, + val file: FileResponse, + val id: String, + val lastModifiedDateTime: String, + val name: String, + val size: Int, + val specialFolder: SpecialFolderResponse, + val webDavUrl: String +) + +@JsonClass(generateAdapter = true) +data class UserResponse( + val id: String +) + +@JsonClass(generateAdapter = true) +data class FileResponse( + val mimeType: String +) + +@JsonClass(generateAdapter = true) +data class GrantedToResponse( + val user: UserResponse +) + +@JsonClass(generateAdapter = true) +data class PermissionResponse( + val grantedTo: List, + val roles: List +) + +@JsonClass(generateAdapter = true) +data class SpecialFolderResponse( + val name: String +) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt new file mode 100644 index 00000000..2f29601d --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt @@ -0,0 +1,34 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.resources.spaces.services + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.spaces.GetRemoteSpacesOperation +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse + +class OCSpacesService(override val client: OwnCloudClient) : SpacesService { + override fun getSpaces(): RemoteOperationResult> { + return GetRemoteSpacesOperation().execute(client) + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt new file mode 100644 index 00000000..2384769c --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt @@ -0,0 +1,31 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.resources.spaces.services + +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.Service +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse + +interface SpacesService : Service { + fun getSpaces(): RemoteOperationResult> +} From 7bb94cf2896cbec5f95da5e7760523def7a44a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Fri, 23 Dec 2022 11:49:54 +0100 Subject: [PATCH 04/23] Make quota attribute nullable. Its not mandatory --- .../android/lib/resources/spaces/GetRemoteSpacesOperation.kt | 4 ---- .../android/lib/resources/spaces/responses/SpacesResponse.kt | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt index 46e36a10..35a6727b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt @@ -28,15 +28,11 @@ import com.owncloud.android.lib.common.http.HttpConstants import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod import com.owncloud.android.lib.common.operations.RemoteOperation import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.resources.CommonOcsResponse -import com.owncloud.android.lib.resources.shares.responses.ShareeOcsResponse import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse import com.owncloud.android.lib.resources.spaces.responses.SpacesResponseWrapper import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi -import com.squareup.moshi.Types import timber.log.Timber -import java.lang.reflect.Type import java.net.URL class GetRemoteSpacesOperation : RemoteOperation>() { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 8ccca7cc..7100b552 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -38,7 +38,7 @@ data class SpaceResponse( val lastModifiedDateTime: String, val name: String, val owner: OwnerResponse, - val quota: QuotaResponse, + val quota: QuotaResponse?, val root: RootResponse, val special: List?, val webUrl: String From 0d7a49b3ff6c1a87a4791c6440d52002d5d57c15 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Tue, 27 Dec 2022 15:17:44 +0100 Subject: [PATCH 05/23] Some type changes and renamings --- .../android/lib/resources/spaces/responses/SpacesResponse.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 7100b552..81bdaa21 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -53,8 +53,8 @@ data class OwnerResponse( data class QuotaResponse( val remaining: Long, val state: String, - val total: Int, - val used: Int + val total: Long, + val used: Long ) @JsonClass(generateAdapter = true) From 31ccf56e9759a2257287b5ed6c0bfbe997c77643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Tue, 10 Jan 2023 14:37:48 +0100 Subject: [PATCH 06/23] Fix parsing when space is disabled --- .../resources/spaces/responses/SpacesResponse.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 81bdaa21..09235d6e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -51,10 +51,10 @@ data class OwnerResponse( @JsonClass(generateAdapter = true) data class QuotaResponse( - val remaining: Long, - val state: String, + val remaining: Long?, + val state: String?, val total: Long, - val used: Long + val used: Long?, ) @JsonClass(generateAdapter = true) @@ -62,7 +62,8 @@ data class RootResponse( val eTag: String, val id: String, val permissions: List?, - val webDavUrl: String + val webDavUrl: String, + val deleted: DeleteResponse?, ) @JsonClass(generateAdapter = true) @@ -92,6 +93,11 @@ data class GrantedToResponse( val user: UserResponse ) +@JsonClass(generateAdapter = true) +data class DeleteResponse( + val state: String, +) + @JsonClass(generateAdapter = true) data class PermissionResponse( val grantedTo: List, From 8a4fcb6550c91b1a96ccc23896733f0b39837d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Fri, 13 Jan 2023 08:53:13 +0100 Subject: [PATCH 07/23] Support shares space --- .../lib/resources/spaces/responses/SpacesResponse.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 09235d6e..a6f08a5f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -35,13 +35,13 @@ data class SpaceResponse( val driveAlias: String, val driveType: String, val id: String, - val lastModifiedDateTime: String, + val lastModifiedDateTime: String?, val name: String, - val owner: OwnerResponse, + val owner: OwnerResponse?, val quota: QuotaResponse?, val root: RootResponse, val special: List?, - val webUrl: String + val webUrl: String, ) @JsonClass(generateAdapter = true) @@ -59,7 +59,7 @@ data class QuotaResponse( @JsonClass(generateAdapter = true) data class RootResponse( - val eTag: String, + val eTag: String?, val id: String, val permissions: List?, val webDavUrl: String, From 45f53656ba989c44c0bc7b5ce1aa261c72cf7a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Fri, 13 Jan 2023 11:27:20 +0100 Subject: [PATCH 08/23] Update permissions parsing to latest api changes Supports api renaming from grantedTo to grantedToIdentities on v1.0.1 https://github.com/owncloud/libre-graph-api/releases/tag/v1.0.1 --- .../spaces/responses/SpacesResponse.kt | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index a6f08a5f..6ce50498 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -89,8 +89,15 @@ data class FileResponse( ) @JsonClass(generateAdapter = true) -data class GrantedToResponse( - val user: UserResponse +data class IdentityPermissionResponse( + val id: String, + val displayName: String?, +) + +@JsonClass(generateAdapter = true) +data class GrantedToIdentitiesResponse( + val user: IdentityPermissionResponse?, + val group: IdentityPermissionResponse?, ) @JsonClass(generateAdapter = true) @@ -100,9 +107,18 @@ data class DeleteResponse( @JsonClass(generateAdapter = true) data class PermissionResponse( - val grantedTo: List, - val roles: List -) + val grantedTo: List?, + val grantedToIdentities: List?, + val roles: List, +) { + /** + * Supports api renaming from grantedTo to grantedToIdentities on v1.0.1 + * https://github.com/owncloud/libre-graph-api/releases/tag/v1.0.1 + */ + fun getGrantedToIdentitiesResponse(): List { + return grantedToIdentities ?: grantedTo ?: throw IllegalArgumentException("Permissions not granted to anyone") + } +} @JsonClass(generateAdapter = true) data class SpecialFolderResponse( From a65a82cae0499dfba2e0edbbfdbd71a53b8974a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Mon, 16 Jan 2023 15:32:44 +0100 Subject: [PATCH 09/23] Adapt the propfind to work with specific webdavurl from the space --- .../lib/resources/files/ReadRemoteFolderOperation.kt | 11 +++++++++-- .../lib/resources/files/services/FileService.kt | 3 ++- .../files/services/implementation/OCFileService.kt | 6 ++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt index 40747ace..ee0b0a03 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt @@ -48,7 +48,8 @@ import java.net.URL * @author David González Verdugo */ class ReadRemoteFolderOperation( - val remotePath: String + val remotePath: String, + val spaceWebDavUrl: String? = null, ) : RemoteOperation>() { /** @@ -61,7 +62,7 @@ class ReadRemoteFolderOperation( PropertyRegistry.register(OCShareTypes.Factory()) val propfindMethod = PropfindMethod( - URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath)), + getFinalWebDavUrl(), DavConstants.DEPTH_1, DavUtils.allPropset ) @@ -107,5 +108,11 @@ class ReadRemoteFolderOperation( } } + private fun getFinalWebDavUrl(): URL { + val baseWebDavUrl = spaceWebDavUrl ?: client.userFilesWebDavUri.toString() + + return URL(baseWebDavUrl + WebdavUtils.encodePath(remotePath)) + } + private fun isSuccess(status: Int): Boolean = status.isOneOf(HTTP_OK, HTTP_MULTI_STATUS) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 51a85c46..4798f234 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -61,7 +61,8 @@ interface FileService : Service { ): RemoteOperationResult fun refreshFolder( - remotePath: String + remotePath: String, + spaceWebDavUrl: String? = null, ): RemoteOperationResult> fun removeFile( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 32ac22ca..037e5ef2 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -98,10 +98,12 @@ class OCFileService(override val client: OwnCloudClient) : FileService { ).execute(client) override fun refreshFolder( - remotePath: String + remotePath: String, + spaceWebDavUrl: String?, ): RemoteOperationResult> = ReadRemoteFolderOperation( - remotePath = remotePath + remotePath = remotePath, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun removeFile( From 8e4f243031f90174c17417ad1bc8c31eef1e586b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Tue, 17 Jan 2023 16:25:09 +0100 Subject: [PATCH 10/23] Fix remote path retrieval. Now it depends on webdav url to support spaces --- .../files/ReadRemoteFolderOperation.kt | 8 +-- .../android/lib/resources/files/RemoteFile.kt | 28 +++++++-- .../owncloud/android/lib/RemoteFileTest.kt | 59 +++++++++++++++++++ 3 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 owncloudComLibrary/src/test/java/com/owncloud/android/lib/RemoteFileTest.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt index ee0b0a03..16600fe1 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.kt @@ -72,12 +72,11 @@ class ReadRemoteFolderOperation( if (isSuccess(status)) { val mFolderAndFiles = ArrayList() - // 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) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.kt index 87a6663e..791a0765 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.kt @@ -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, "") } diff --git a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/RemoteFileTest.kt b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/RemoteFileTest.kt new file mode 100644 index 00000000..6cd8febe --- /dev/null +++ b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/RemoteFileTest.kt @@ -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) + } +} From cb73d537e4b616b8aa94e85b4b6a8fbb151381ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Tue, 17 Jan 2023 18:55:35 +0100 Subject: [PATCH 11/23] Allow support to read specific file from a space --- .../files/ReadRemoteFileOperation.kt | 20 ++++++++++++++----- .../resources/files/services/FileService.kt | 3 ++- .../services/implementation/OCFileService.kt | 6 ++++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.kt index 539ea92c..cf29b60e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.kt @@ -46,7 +46,10 @@ import java.util.concurrent.TimeUnit * @author David González Verdugo */ -class ReadRemoteFileOperation(val remotePath: String) : RemoteOperation() { +class ReadRemoteFileOperation( + val remotePath: String, + val spaceWebDavUrl: String? = null, +) : RemoteOperation() { /** * Performs the read operation. @@ -57,7 +60,7 @@ class ReadRemoteFileOperation(val remotePath: String) : RemoteOperation { try { val propFind = PropfindMethod( - url = URL("${client.userFilesWebDavUri}${WebdavUtils.encodePath(remotePath)}"), + url = getFinalWebDavUrl(), depth = DEPTH_0, propertiesToRequest = DavUtils.allPropset ).apply { @@ -69,10 +72,11 @@ class ReadRemoteFileOperation(val remotePath: String) : RemoteOperation(RemoteOperationResult.ResultCode.OK).apply { @@ -88,6 +92,12 @@ class ReadRemoteFileOperation(val remotePath: String) : RemoteOperation fun readFile( - remotePath: String + remotePath: String, + spaceWebDavUrl: String? = null, ): RemoteOperationResult fun refreshFolder( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 037e5ef2..e2affc8a 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -91,10 +91,12 @@ class OCFileService(override val client: OwnCloudClient) : FileService { ).execute(client) override fun readFile( - remotePath: String + remotePath: String, + spaceWebDavUrl: String?, ): RemoteOperationResult = ReadRemoteFileOperation( - remotePath = remotePath + remotePath = remotePath, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun refreshFolder( From 2c18e7b679069d434bf329ad482e8dc31a68eeee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Tue, 17 Jan 2023 19:07:42 +0100 Subject: [PATCH 12/23] Added create folder operation support for specific space --- .../lib/resources/files/CreateRemoteFolderOperation.kt | 3 ++- .../android/lib/resources/files/services/FileService.kt | 3 ++- .../files/services/implementation/OCFileService.kt | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt index 372c8f21..22757409 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt @@ -46,7 +46,8 @@ import java.util.concurrent.TimeUnit class CreateRemoteFolderOperation( val remotePath: String, private val createFullPath: Boolean, - private val isChunksFolder: Boolean = false + private val isChunksFolder: Boolean = false, + val spaceWebDavUrl: String? = null, ) : RemoteOperation() { override fun run(client: OwnCloudClient): RemoteOperationResult { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 9ebe1994..50f4407f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -43,7 +43,8 @@ interface FileService : Service { fun createFolder( remotePath: String, createFullPath: Boolean, - isChunkFolder: Boolean = false + isChunkFolder: Boolean = false, + spaceWebDavUrl: String? = null, ): RemoteOperationResult fun downloadFile( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index e2affc8a..54113b81 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -64,12 +64,14 @@ class OCFileService(override val client: OwnCloudClient) : FileService { override fun createFolder( remotePath: String, createFullPath: Boolean, - isChunkFolder: Boolean + isChunkFolder: Boolean, + spaceWebDavUrl: String?, ): RemoteOperationResult = CreateRemoteFolderOperation( remotePath = remotePath, createFullPath = createFullPath, - isChunksFolder = isChunkFolder + isChunksFolder = isChunkFolder, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun downloadFile( From 9c844aae7e32a7e900ca79359866a8818d33123d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Wed, 18 Jan 2023 13:15:19 +0100 Subject: [PATCH 13/23] Support removal of files from specific space --- .../lib/resources/files/CreateRemoteFolderOperation.kt | 6 +++--- .../lib/resources/files/RemoveRemoteFileOperation.kt | 8 ++++---- .../files/chunks/RemoveRemoteChunksFolderOperation.kt | 3 +-- .../android/lib/resources/files/services/FileService.kt | 3 ++- .../files/services/implementation/OCFileService.kt | 6 ++++-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt index 22757409..15a9e8bc 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.kt @@ -68,13 +68,13 @@ class CreateRemoteFolderOperation( var result: RemoteOperationResult try { val webDavUri = if (isChunksFolder) { - client.uploadsWebDavUri + client.uploadsWebDavUri.toString() } else { - client.userFilesWebDavUri + spaceWebDavUrl ?: client.userFilesWebDavUri.toString() } val mkCol = MkColMethod( - URL(webDavUri.toString() + WebdavUtils.encodePath(remotePath)) + URL(webDavUri + WebdavUtils.encodePath(remotePath)) ).apply { setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS) setConnectionTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.kt index a451256a..b97b3d78 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.kt @@ -24,7 +24,6 @@ package com.owncloud.android.lib.resources.files -import android.net.Uri import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.http.HttpConstants.HTTP_NO_CONTENT import com.owncloud.android.lib.common.http.HttpConstants.HTTP_OK @@ -46,7 +45,8 @@ import java.net.URL * @author Abel García de Prada */ open class RemoveRemoteFileOperation( - private val remotePath: String + private val remotePath: String, + val spaceWebDavUrl: String? = null, ) : RemoteOperation() { override fun run(client: OwnCloudClient): RemoteOperationResult { @@ -54,7 +54,7 @@ open class RemoveRemoteFileOperation( try { val srcWebDavUri = getSrcWebDavUriForClient(client) val deleteMethod = DeleteMethod( - URL(srcWebDavUri.toString() + WebdavUtils.encodePath(remotePath)) + URL(srcWebDavUri + WebdavUtils.encodePath(remotePath)) ) val status = client.executeHttpMethod(deleteMethod) @@ -75,7 +75,7 @@ open class RemoveRemoteFileOperation( * For standard removals, we will use [OwnCloudClient.getUserFilesWebDavUri]. * In case we need a different source Uri, override this method. */ - open fun getSrcWebDavUriForClient(client: OwnCloudClient): Uri = client.userFilesWebDavUri + open fun getSrcWebDavUriForClient(client: OwnCloudClient): String = spaceWebDavUrl ?: client.userFilesWebDavUri.toString() private fun isSuccess(status: Int) = status.isOneOf(HTTP_OK, HTTP_NO_CONTENT) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.kt index 150a4dd1..b738dfbf 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.kt @@ -24,10 +24,9 @@ */ package com.owncloud.android.lib.resources.files.chunks -import android.net.Uri import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.resources.files.RemoveRemoteFileOperation class RemoveRemoteChunksFolderOperation(remotePath: String) : RemoveRemoteFileOperation(remotePath) { - override fun getSrcWebDavUriForClient(client: OwnCloudClient): Uri = client.uploadsWebDavUri + override fun getSrcWebDavUriForClient(client: OwnCloudClient): String = client.uploadsWebDavUri.toString() } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 50f4407f..2fd3c0e8 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -68,7 +68,8 @@ interface FileService : Service { ): RemoteOperationResult> fun removeFile( - remotePath: String + remotePath: String, + spaceWebDavUrl: String? = null, ): RemoteOperationResult fun renameFile( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 54113b81..8bbbc074 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -111,10 +111,12 @@ class OCFileService(override val client: OwnCloudClient) : FileService { ).execute(client) override fun removeFile( - remotePath: String + remotePath: String, + spaceWebDavUrl: String?, ): RemoteOperationResult = RemoveRemoteFileOperation( - remotePath = remotePath + remotePath = remotePath, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun renameFile( From 78665e8cb048aed8830de266c8a788bedec1e648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Thu, 19 Jan 2023 08:19:34 +0100 Subject: [PATCH 14/23] Add support for spaces web dav specific urls to the rename operation --- .../lib/resources/files/RenameRemoteFileOperation.kt | 5 +++-- .../android/lib/resources/files/services/FileService.kt | 1 + .../files/services/implementation/OCFileService.kt | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.kt index 8f669c69..9a0a4b30 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.kt @@ -48,6 +48,7 @@ class RenameRemoteFileOperation( private val oldRemotePath: String, private val newName: String, isFolder: Boolean, + val spaceWebDavUrl: String? = null, ) : RemoteOperation() { private var newRemotePath: String @@ -75,8 +76,8 @@ class RenameRemoteFileOperation( } val moveMethod: MoveMethod = MoveMethod( - url = URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(oldRemotePath)), - destinationUrl = client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(newRemotePath), + url = URL((spaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(oldRemotePath)), + destinationUrl = (spaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(newRemotePath), ).apply { setReadTimeout(RENAME_READ_TIMEOUT, TimeUnit.MILLISECONDS) setConnectionTimeout(RENAME_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 2fd3c0e8..89407585 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -77,5 +77,6 @@ interface FileService : Service { oldRemotePath: String, newName: String, isFolder: Boolean, + spaceWebDavUrl: String? = null, ): RemoteOperationResult } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 8bbbc074..e0c6a2f6 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -123,12 +123,14 @@ class OCFileService(override val client: OwnCloudClient) : FileService { oldName: String, oldRemotePath: String, newName: String, - isFolder: Boolean + isFolder: Boolean, + spaceWebDavUrl: String?, ): RemoteOperationResult = RenameRemoteFileOperation( oldName = oldName, oldRemotePath = oldRemotePath, newName = newName, - isFolder = isFolder + isFolder = isFolder, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) } From b65efc2b691dd1fe77a7d60c134a7447f8e47d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Thu, 2 Feb 2023 14:30:34 +0100 Subject: [PATCH 15/23] Allow downloads from specific WebDav urls --- .../lib/resources/files/DownloadRemoteFileOperation.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.kt index 80b9adc7..86fcde46 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.kt @@ -36,7 +36,6 @@ import java.io.BufferedInputStream import java.io.File import java.io.FileOutputStream import java.net.URL -import java.util.HashSet import java.util.concurrent.atomic.AtomicBoolean /** @@ -47,7 +46,8 @@ import java.util.concurrent.atomic.AtomicBoolean */ class DownloadRemoteFileOperation( private val remotePath: String, - localFolderPath: String + localFolderPath: String, + private val spaceWebDavUrl: String? = null, ) : RemoteOperation() { private val cancellationRequested = AtomicBoolean(false) @@ -84,7 +84,8 @@ class DownloadRemoteFileOperation( var bis: BufferedInputStream? = null var savedFile = false - val getMethod = GetMethod(URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath))) + val webDavUri = spaceWebDavUrl ?: client.userFilesWebDavUri.toString() + val getMethod = GetMethod(URL(webDavUri + WebdavUtils.encodePath(remotePath))) try { val status = client.executeHttpMethod(getMethod) From e9f291371dbe69e2784749972e159b3e2a3e33c9 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Tue, 7 Feb 2023 17:02:10 +0100 Subject: [PATCH 16/23] Move network operation adapted to spaces --- .../CheckPathExistenceRemoteOperation.kt | 19 +++++++++++-------- .../files/MoveRemoteFileOperation.kt | 13 +++++++++---- .../resources/files/services/FileService.kt | 6 ++++-- .../services/implementation/OCFileService.kt | 10 +++++++--- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt index e59388bd..d7e927be 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license -* Copyright (C) 2020 ownCloud GmbH. +* 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 @@ -41,6 +41,7 @@ import java.util.concurrent.TimeUnit * @author David A. Velasco * @author David González Verdugo * @author Abel García de Prada + * @author Juan Carlos Garrote Gascón * * @param remotePath Path to append to the URL owned by the client instance. * @param isUserLoggedIn When `true`, the username won't be added at the end of the PROPFIND url since is not @@ -48,21 +49,23 @@ import java.util.concurrent.TimeUnit */ class CheckPathExistenceRemoteOperation( val remotePath: String? = "", - val isUserLoggedIn: Boolean + val isUserLoggedIn: Boolean, + val spaceWebDavUrl: String? = null, ) : RemoteOperation() { override fun run(client: OwnCloudClient): RemoteOperationResult { - return try { - val stringUrl = - if (isUserLoggedIn) client.baseFilesWebDavUri.toString() - else client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath) + val baseStringUrl = spaceWebDavUrl ?: + if (isUserLoggedIn) client.baseFilesWebDavUri.toString() + else client.userFilesWebDavUri.toString() + val stringUrl = baseStringUrl + WebdavUtils.encodePath(remotePath) + return try { val propFindMethod = PropfindMethod(URL(stringUrl), 0, allPropset).apply { setReadTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) setConnectionTimeout(TIMEOUT.toLong(), TimeUnit.SECONDS) } - var status = client.executeHttpMethod(propFindMethod) + val status = client.executeHttpMethod(propFindMethod) /* PROPFIND method * 404 NOT FOUND: path doesn't exist, * 207 MULTI_STATUS: path exists. @@ -77,7 +80,7 @@ class CheckPathExistenceRemoteOperation( val result = RemoteOperationResult(e) Timber.e( e, - "Existence check for ${client.userFilesWebDavUri}${WebdavUtils.encodePath(remotePath)} : ${result.logMessage}" + "Existence check for $stringUrl : ${result.logMessage}" ) result } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt index 5741766a..6689c5f9 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2021 ownCloud GmbH. + * 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 @@ -38,17 +38,22 @@ import java.util.concurrent.TimeUnit /** * Remote operation moving a remote file or folder in the ownCloud server to a different folder - * in the same account. + * in the same account and space. * * Allows renaming the moving file/folder at the same time. * * @author David A. Velasco * @author David González Verdugo * @author Abel García de Prada + * @author Juan Carlos Garrote Gascón + * + * @param sourceRemotePath Remote path of the file/folder to copy. + * @param targetRemotePath Remote path desired for the file/folder to copy it. */ open class MoveRemoteFileOperation( private val sourceRemotePath: String, private val targetRemotePath: String, + private val spaceWebDavUrl: String? = null, ) : RemoteOperation() { /** @@ -73,8 +78,8 @@ open class MoveRemoteFileOperation( // so this uri has to be customizable val srcWebDavUri = getSrcWebDavUriForClient(client) val moveMethod = MoveMethod( - url = URL(srcWebDavUri.toString() + WebdavUtils.encodePath(sourceRemotePath)), - destinationUrl = client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(targetRemotePath), + url = URL((spaceWebDavUrl ?: srcWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)), + destinationUrl = (spaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), ).apply { addRequestHeaders(this) setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 89407585..25365301 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2020 ownCloud GmbH. + * 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 @@ -32,7 +32,8 @@ interface FileService : Service { fun checkPathExistence( path: String, - isUserLogged: Boolean + isUserLogged: Boolean, + spaceWebDavUrl: String? = null, ): RemoteOperationResult fun copyFile( @@ -55,6 +56,7 @@ interface FileService : Service { fun moveFile( sourceRemotePath: String, targetRemotePath: String, + spaceWebDavUrl: String?, ): RemoteOperationResult fun readFile( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index e0c6a2f6..0a7b6e1f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2022 ownCloud GmbH. + * 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 @@ -42,11 +42,13 @@ class OCFileService(override val client: OwnCloudClient) : FileService { override fun checkPathExistence( path: String, - isUserLogged: Boolean + isUserLogged: Boolean, + spaceWebDavUrl: String?, ): RemoteOperationResult = CheckPathExistenceRemoteOperation( remotePath = path, - isUserLoggedIn = isUserLogged + isUserLoggedIn = isUserLogged, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun getUrlToOpenInWeb(openWebEndpoint: String, fileId: String): RemoteOperationResult = @@ -86,10 +88,12 @@ class OCFileService(override val client: OwnCloudClient) : FileService { override fun moveFile( sourceRemotePath: String, targetRemotePath: String, + spaceWebDavUrl: String?, ): RemoteOperationResult = MoveRemoteFileOperation( sourceRemotePath = sourceRemotePath, targetRemotePath = targetRemotePath, + spaceWebDavUrl = spaceWebDavUrl, ).execute(client) override fun readFile( From a395787e0b1de4c06760f24b7e103e860b748c01 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 8 Feb 2023 13:30:22 +0100 Subject: [PATCH 17/23] Adapted copy operation for spaces --- .../files/CopyRemoteFileOperation.kt | 22 +++++++++++-------- .../resources/files/services/FileService.kt | 2 ++ .../services/implementation/OCFileService.kt | 10 ++++++--- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt index ce47a4fd..949d72e9 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2022 ownCloud GmbH. + * 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 @@ -44,25 +44,29 @@ import java.util.concurrent.TimeUnit * @author David A. Velasco * @author Christian Schabesberger * @author David González V. + * @author Juan Carlos Garrote Gascón * - * @param srcRemotePath Remote path of the file/folder to copy. + * @param sourceRemotePath Remote path of the file/folder to copy. * @param targetRemotePath Remote path desired for the file/folder to copy it. */ class CopyRemoteFileOperation( - private val srcRemotePath: String, + private val sourceRemotePath: String, private val targetRemotePath: String, + private val sourceSpaceWebDavUrl: String? = null, + private val targetSpaceWebDavUrl: String? = null, ) : RemoteOperation() { + /** * Performs the rename operation. * * @param client Client object to communicate with the remote ownCloud server. */ override fun run(client: OwnCloudClient): RemoteOperationResult { - if (targetRemotePath == srcRemotePath) { + if (targetRemotePath == sourceRemotePath && sourceSpaceWebDavUrl == targetSpaceWebDavUrl) { // nothing to do! return RemoteOperationResult(ResultCode.OK) } - if (targetRemotePath.startsWith(srcRemotePath)) { + if (targetRemotePath.startsWith(sourceRemotePath) && sourceSpaceWebDavUrl == targetSpaceWebDavUrl) { return RemoteOperationResult(ResultCode.INVALID_COPY_INTO_DESCENDANT) } @@ -70,8 +74,8 @@ class CopyRemoteFileOperation( var result: RemoteOperationResult try { val copyMethod = CopyMethod( - URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(srcRemotePath)), - client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(targetRemotePath), + URL((sourceSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)), + (targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath), ).apply { setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS) setConnectionTimeout(COPY_CONNECTION_TIMEOUT, TimeUnit.SECONDS) @@ -95,10 +99,10 @@ class CopyRemoteFileOperation( client.exhaustResponse(copyMethod.getResponseBodyAsStream()) } } - Timber.i("Copy $srcRemotePath to $targetRemotePath: ${result.logMessage}") + Timber.i("Copy $sourceRemotePath to $targetRemotePath: ${result.logMessage}") } catch (e: Exception) { result = RemoteOperationResult(e) - Timber.e(e, "Copy $srcRemotePath to $targetRemotePath: ${result.logMessage}") + Timber.e(e, "Copy $sourceRemotePath to $targetRemotePath: ${result.logMessage}") } return result } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt index 25365301..1421648b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/FileService.kt @@ -39,6 +39,8 @@ interface FileService : Service { fun copyFile( sourceRemotePath: String, targetRemotePath: String, + sourceSpaceWebDavUrl: String?, + targetSpaceWebDavUrl: String?, ): RemoteOperationResult fun createFolder( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt index 0a7b6e1f..8ec44d46 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/services/implementation/OCFileService.kt @@ -56,11 +56,15 @@ class OCFileService(override val client: OwnCloudClient) : FileService { override fun copyFile( sourceRemotePath: String, - targetRemotePath: String + targetRemotePath: String, + sourceSpaceWebDavUrl: String?, + targetSpaceWebDavUrl: String?, ): RemoteOperationResult = CopyRemoteFileOperation( - srcRemotePath = sourceRemotePath, - targetRemotePath = targetRemotePath + sourceRemotePath = sourceRemotePath, + targetRemotePath = targetRemotePath, + sourceSpaceWebDavUrl = sourceSpaceWebDavUrl, + targetSpaceWebDavUrl = targetSpaceWebDavUrl, ).execute(client) override fun createFolder( From e6f3fd2e1650877722684606239b7901f87ee6b4 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 15 Feb 2023 14:54:59 +0100 Subject: [PATCH 18/23] Upload workers and network operations adapted to spaces --- .../resources/files/UploadFileFromFileSystemOperation.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadFileFromFileSystemOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadFileFromFileSystemOperation.kt index 93a2357a..a863a37b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadFileFromFileSystemOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadFileFromFileSystemOperation.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2022 ownCloud GmbH. + * 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 @@ -48,6 +48,7 @@ import java.util.concurrent.atomic.AtomicBoolean * @author masensio * @author David González Verdugo * @author Abel García de Prada + * @author Juan Carlos Garrote Gascón */ open class UploadFileFromFileSystemOperation( val localPath: String, @@ -55,6 +56,7 @@ open class UploadFileFromFileSystemOperation( val mimeType: String, val lastModifiedTimestamp: String, val requiredEtag: String?, + val spaceWebDavUrl: String? = null, ) : RemoteOperation() { protected val cancellationRequested = AtomicBoolean(false) @@ -97,7 +99,8 @@ open class UploadFileFromFileSystemOperation( synchronized(dataTransferListener) { it.addDatatransferProgressListeners(dataTransferListener) } } - putMethod = PutMethod(URL(client.userFilesWebDavUri.toString() + WebdavUtils.encodePath(remotePath)), fileRequestBody!!).apply { + val baseStringUrl = spaceWebDavUrl ?: client.userFilesWebDavUri.toString() + putMethod = PutMethod(URL(baseStringUrl + WebdavUtils.encodePath(remotePath)), fileRequestBody!!).apply { retryOnConnectionFailure = false if (!requiredEtag.isNullOrBlank()) { addRequestHeader(HttpConstants.IF_MATCH_HEADER, requiredEtag) From 2458db1828082bbbb4be71b2800862998681e9a9 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Wed, 15 Feb 2023 15:02:08 +0100 Subject: [PATCH 19/23] Fix to KtLint report --- .../lib/resources/files/CheckPathExistenceRemoteOperation.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt index d7e927be..dd7d0a56 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CheckPathExistenceRemoteOperation.kt @@ -54,9 +54,8 @@ class CheckPathExistenceRemoteOperation( ) : RemoteOperation() { override fun run(client: OwnCloudClient): RemoteOperationResult { - val baseStringUrl = spaceWebDavUrl ?: - if (isUserLoggedIn) client.baseFilesWebDavUri.toString() - else client.userFilesWebDavUri.toString() + val baseStringUrl = spaceWebDavUrl ?: if (isUserLoggedIn) client.baseFilesWebDavUri.toString() + else client.userFilesWebDavUri.toString() val stringUrl = baseStringUrl + WebdavUtils.encodePath(remotePath) return try { From 0017079a6921c88bc8ea11d512b488bba8d0bda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Wed, 1 Mar 2023 13:36:29 +0100 Subject: [PATCH 20/23] Allow retrieval of several instances from webfinger --- ...t => GetInstancesViaWebfingerOperation.kt} | 27 ++++++++----------- .../webfinger/services/WebfingerService.kt | 5 ++-- .../implementation/OCWebfingerService.kt | 14 ++++------ 3 files changed, 19 insertions(+), 27 deletions(-) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/{GetOCInstanceViaWebfingerOperation.kt => GetInstancesViaWebfingerOperation.kt} (83%) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt similarity index 83% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperation.kt rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt index 42ee4b12..8439d0d0 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt @@ -36,11 +36,11 @@ import com.squareup.moshi.Moshi import timber.log.Timber import java.net.URL -class GetOCInstanceViaWebfingerOperation( +class GetInstancesViaWebfingerOperation( private val lockupServerDomain: String, private val rel: String, private val resource: String, -) : RemoteOperation() { +) : RemoteOperation>() { private fun buildRequestUri() = Uri.parse(lockupServerDomain).buildUpon() @@ -61,30 +61,25 @@ class GetOCInstanceViaWebfingerOperation( method: HttpMethod, response: String?, status: Int - ): RemoteOperationResult { + ): RemoteOperationResult> { Timber.e("Failed requesting webfinger info") if (response != null) { Timber.e("*** status code: $status; response message: $response") } else { Timber.e("*** status code: $status") } - return RemoteOperationResult(method) + return RemoteOperationResult>(method) } - private fun onRequestSuccessful(rawResponse: String): RemoteOperationResult { + private fun onRequestSuccessful(rawResponse: String): RemoteOperationResult> { val response = parseResponse(rawResponse) - for (i in response.links) { - if (i.rel == rel) { - val operationResult = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) - operationResult.data = i.href - return operationResult - } - } - Timber.e("Could not find ownCloud relevant information in webfinger response: $rawResponse") - throw java.lang.Exception("Could not find ownCloud relevant information in webfinger response") + Timber.d("Successful Webfinger request: $response") + val operationResult = RemoteOperationResult>(RemoteOperationResult.ResultCode.OK) + operationResult.data = response.links.map { it.href } + return operationResult } - override fun run(client: OwnCloudClient): RemoteOperationResult { + override fun run(client: OwnCloudClient): RemoteOperationResult> { val requestUri = buildRequestUri() val getMethod = GetMethod(URL(requestUri.toString())) return try { @@ -98,7 +93,7 @@ class GetOCInstanceViaWebfingerOperation( } } catch (e: Exception) { Timber.e(e, "Requesting webfinger info failed") - RemoteOperationResult(e) + RemoteOperationResult>(e) } } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt index 4e057beb..ada5c6d0 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt @@ -21,9 +21,10 @@ import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.operations.RemoteOperationResult interface WebfingerService { - fun getInstanceFromWebfinger( + fun getInstancesFromWebfinger( lookupServer: String, username: String, + rel: String, client: OwnCloudClient, - ): RemoteOperationResult + ): RemoteOperationResult> } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt index 3eab83d4..9ea1147b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt @@ -19,20 +19,16 @@ package com.owncloud.android.lib.resources.webfinger.services.implementation import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.resources.webfinger.GetOCInstanceViaWebfingerOperation +import com.owncloud.android.lib.resources.webfinger.GetInstancesViaWebfingerOperation import com.owncloud.android.lib.resources.webfinger.services.WebfingerService class OCWebfingerService : WebfingerService { - override fun getInstanceFromWebfinger( + override fun getInstancesFromWebfinger( lookupServer: String, username: String, + rel: String, client: OwnCloudClient, - ): RemoteOperationResult = - GetOCInstanceViaWebfingerOperation(lookupServer, OWNCLOUD_REL, username).execute(client) - - companion object { - private const val OWNCLOUD_REL = "http://webfinger.owncloud/rel/server-instance" - } - + ): RemoteOperationResult> = + GetInstancesViaWebfingerOperation(lookupServer, rel, username).execute(client) } From ff90598a2d0fba2b6e6782286bbad179fdc22f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Wed, 8 Mar 2023 16:38:46 +0100 Subject: [PATCH 21/23] Rename WebFinger classes to make them consistent --- .../webfinger/GetInstancesViaWebfingerOperation.kt | 14 +++++++------- .../webfinger/responses/WebfingerResponse.kt | 4 ++-- .../webfinger/services/WebfingerService.kt | 6 +++--- .../services/implementation/OCWebfingerService.kt | 12 ++++++------ .../webfinger/responses/WebfingerResponseTest.kt | 6 +++--- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt index 8439d0d0..2517b14b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt @@ -31,12 +31,12 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod import com.owncloud.android.lib.common.http.methods.nonwebdav.HttpMethod import com.owncloud.android.lib.common.operations.RemoteOperation import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.resources.webfinger.responses.WebfingerJrdResponse +import com.owncloud.android.lib.resources.webfinger.responses.WebFingerResponse import com.squareup.moshi.Moshi import timber.log.Timber import java.net.URL -class GetInstancesViaWebfingerOperation( +class GetInstancesViaWebFingerOperation( private val lockupServerDomain: String, private val rel: String, private val resource: String, @@ -51,9 +51,9 @@ class GetInstancesViaWebfingerOperation( private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK - private fun parseResponse(response: String): WebfingerJrdResponse { + private fun parseResponse(response: String): WebFingerResponse { val moshi = Moshi.Builder().build() - val adapter = moshi.adapter(WebfingerJrdResponse::class.java) + val adapter = moshi.adapter(WebFingerResponse::class.java) return adapter.fromJson(response)!! } @@ -62,7 +62,7 @@ class GetInstancesViaWebfingerOperation( response: String?, status: Int ): RemoteOperationResult> { - Timber.e("Failed requesting webfinger info") + Timber.e("Failed requesting WebFinger info") if (response != null) { Timber.e("*** status code: $status; response message: $response") } else { @@ -73,7 +73,7 @@ class GetInstancesViaWebfingerOperation( private fun onRequestSuccessful(rawResponse: String): RemoteOperationResult> { val response = parseResponse(rawResponse) - Timber.d("Successful Webfinger request: $response") + Timber.d("Successful WebFinger request: $response") val operationResult = RemoteOperationResult>(RemoteOperationResult.ResultCode.OK) operationResult.data = response.links.map { it.href } return operationResult @@ -92,7 +92,7 @@ class GetInstancesViaWebfingerOperation( onResultUnsuccessful(getMethod, response, status) } } catch (e: Exception) { - Timber.e(e, "Requesting webfinger info failed") + Timber.e(e, "Requesting WebFinger info failed") RemoteOperationResult>(e) } } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt index 45e85a75..d7e5a6bb 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt @@ -27,13 +27,13 @@ package com.owncloud.android.lib.resources.webfinger.responses import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class WebfingerJrdResponse( +data class WebFingerResponse( val subject: String, val links: List ) @JsonClass(generateAdapter = true) data class LinkItem( + val rel: String, val href: String, - val rel: String ) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt index ada5c6d0..f12e87fa 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt @@ -20,10 +20,10 @@ package com.owncloud.android.lib.resources.webfinger.services import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.operations.RemoteOperationResult -interface WebfingerService { - fun getInstancesFromWebfinger( +interface WebFingerService { + fun getInstancesFromWebFinger( lookupServer: String, - username: String, + resource: String, rel: String, client: OwnCloudClient, ): RemoteOperationResult> diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt index 9ea1147b..3f0ac4d9 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt @@ -19,16 +19,16 @@ package com.owncloud.android.lib.resources.webfinger.services.implementation import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.resources.webfinger.GetInstancesViaWebfingerOperation -import com.owncloud.android.lib.resources.webfinger.services.WebfingerService +import com.owncloud.android.lib.resources.webfinger.GetInstancesViaWebFingerOperation +import com.owncloud.android.lib.resources.webfinger.services.WebFingerService -class OCWebfingerService : WebfingerService { +class OCWebFingerService : WebFingerService { - override fun getInstancesFromWebfinger( + override fun getInstancesFromWebFinger( lookupServer: String, - username: String, + resource: String, rel: String, client: OwnCloudClient, ): RemoteOperationResult> = - GetInstancesViaWebfingerOperation(lookupServer, rel, username).execute(client) + GetInstancesViaWebFingerOperation(lookupServer, rel, resource).execute(client) } diff --git a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt index 2d0c6235..bed95002 100644 --- a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt +++ b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt @@ -8,15 +8,15 @@ import org.junit.Before import org.junit.Test import java.io.File -class WebfingerResponseTest { - lateinit var adapter: JsonAdapter +class WebFingerResponseTest { + lateinit var adapter: JsonAdapter private fun loadResponses(fileName: String) = adapter.fromJson(File(fileName).readText()) @Before fun prepare() { val moshi = Moshi.Builder().build() - adapter = moshi.adapter(WebfingerJrdResponse::class.java) + adapter = moshi.adapter(WebFingerResponse::class.java) } @Test From b660ee98fd3e667d283a6004022435aa1be95c61 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Thu, 9 Mar 2023 09:37:09 +0100 Subject: [PATCH 22/23] Rename files to be the same as the classes they contain --- .../responses/{WebfingerResponse.kt => WebFingerResponse.kt} | 0 .../services/{WebfingerService.kt => WebFingerService.kt} | 0 .../{OCWebfingerService.kt => OCWebFingerService.kt} | 0 .../{WebfingerResponseTest.kt => WebFingerResponseTest.kt} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/{WebfingerResponse.kt => WebFingerResponse.kt} (100%) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/{WebfingerService.kt => WebFingerService.kt} (100%) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/{OCWebfingerService.kt => OCWebFingerService.kt} (100%) rename owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/{WebfingerResponseTest.kt => WebFingerResponseTest.kt} (100%) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebFingerResponse.kt similarity index 100% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponse.kt rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/responses/WebFingerResponse.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebFingerService.kt similarity index 100% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebfingerService.kt rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/WebFingerService.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebFingerService.kt similarity index 100% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebfingerService.kt rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/services/implementation/OCWebFingerService.kt diff --git a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebFingerResponseTest.kt similarity index 100% rename from owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebfingerResponseTest.kt rename to owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/responses/WebFingerResponseTest.kt From 159dcd6d68983ba63db235819061531f29558e62 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Thu, 9 Mar 2023 09:43:07 +0100 Subject: [PATCH 23/23] Rename file to be the same as the class it contains --- ...WebfingerOperation.kt => GetInstancesViaWebFingerOperation.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/{GetInstancesViaWebfingerOperation.kt => GetInstancesViaWebFingerOperation.kt} (100%) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebFingerOperation.kt similarity index 100% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebfingerOperation.kt rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/webfinger/GetInstancesViaWebFingerOperation.kt