From 43a58e2fb183c491e972d7871c51c87ee2af5c2a Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:11:04 +0100 Subject: [PATCH 01/13] Extend OCCapability to include (default) files download limit Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../nextcloud/extensions/ParcelExtensions.kt | 20 +++++++++++++++++++ .../android/lib/resources/shares/OCShare.kt | 6 ++++++ .../GetCapabilitiesRemoteOperation.java | 20 +++++++++++++++++++ .../lib/resources/status/OCCapability.kt | 4 ++++ 4 files changed, 50 insertions(+) create mode 100644 library/src/main/java/com/nextcloud/extensions/ParcelExtensions.kt diff --git a/library/src/main/java/com/nextcloud/extensions/ParcelExtensions.kt b/library/src/main/java/com/nextcloud/extensions/ParcelExtensions.kt new file mode 100644 index 0000000000..ae1957b927 --- /dev/null +++ b/library/src/main/java/com/nextcloud/extensions/ParcelExtensions.kt @@ -0,0 +1,20 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.extensions + +import android.os.Build +import android.os.Parcel +import java.io.Serializable + +inline fun Parcel.readSerializableCompat(): T? = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + readSerializable(T::class.java.classLoader, T::class.java) + } else { + @Suppress("DEPRECATION") + readSerializable() as? T + } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.kt b/library/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.kt index 76f46e9c5d..31aacfa9b4 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.kt @@ -12,6 +12,8 @@ package com.owncloud.android.lib.resources.shares import android.os.Parcel import android.os.Parcelable +import com.nextcloud.android.lib.resources.files.FileDownloadLimit +import com.nextcloud.extensions.readSerializableCompat import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.files.FileUtils import java.io.Serializable @@ -70,6 +72,7 @@ class OCShare : var mimetype: String? = null var ownerDisplayName: String? = null var isFavorite = false + var fileDownloadLimit: FileDownloadLimit? = null constructor() : super() { resetData() @@ -110,6 +113,7 @@ class OCShare : isHasPreview = false mimetype = "" ownerDisplayName = "" + fileDownloadLimit = null } /** @@ -149,6 +153,7 @@ class OCShare : isHasPreview = source.readInt() == 1 mimetype = source.readString() ownerDisplayName = source.readString() + fileDownloadLimit = source.readSerializableCompat() } override fun describeContents(): Int = this.hashCode() @@ -178,6 +183,7 @@ class OCShare : dest.writeInt(if (isHasPreview) 1 else 0) dest.writeString(mimetype) dest.writeString(ownerDisplayName) + dest.writeSerializable(fileDownloadLimit) } companion object { diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java index acd225b18e..5a5c3f7068 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java @@ -166,6 +166,10 @@ public class GetCapabilitiesRemoteOperation extends RemoteOperation { private static final String FORBIDDEN_FILENAME_EXTENSIONS = "forbidden_filename_extensions"; private static final String FORBIDDEN_FILENAME_BASE_NAMES = "forbidden_filename_basenames"; + // files download limits + private static final String NODE_FILES_DOWNLOAD_LIMIT = "downloadlimit"; + private static final String FILES_DOWNLOAD_LIMIT_DEFAULT = "default-limit"; + private OCCapability currentCapability = null; public GetCapabilitiesRemoteOperation() { @@ -734,6 +738,22 @@ private OCCapability parseResponse(String response) throws JSONException { } else { capability.setSecurityGuard(CapabilityBooleanType.FALSE); } + + // files download limits + if (respCapabilities.has(NODE_FILES_DOWNLOAD_LIMIT)) { + JSONObject filesDownloadLimitCapability = respCapabilities.getJSONObject(NODE_FILES_DOWNLOAD_LIMIT); + + if (filesDownloadLimitCapability.getBoolean(PROPERTY_ENABLED)) { + capability.setFilesDownloadLimit(CapabilityBooleanType.TRUE); + } else { + capability.setFilesDownloadLimit(CapabilityBooleanType.FALSE); + } + + if (filesDownloadLimitCapability.has(FILES_DOWNLOAD_LIMIT_DEFAULT)) { + int defaultDownloadLimit = filesDownloadLimitCapability.getInt(FILES_DOWNLOAD_LIMIT_DEFAULT); + capability.setFilesDownloadLimitDefault(defaultDownloadLimit); + } + } } Log_OC.d(TAG, "*** Get Capabilities completed "); diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt index e6bdf3903b..c2d089c29d 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt @@ -110,6 +110,10 @@ class OCCapability { var forbiddenFilenameExtensionJson: String? = null var forbiddenFilenameBaseNamesJson: String? = null + // files download limits + var filesDownloadLimit = CapabilityBooleanType.UNKNOWN + var filesDownloadLimitDefault = 0 + // Etag for capabilities var etag: String? = "" From 5074667a0e894fbe8daab03d8cb701a05f014354 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:17:20 +0100 Subject: [PATCH 02/13] Implement remote operations for files download limit Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../lib/resources/files/FileDownloadLimit.kt | 16 +++++ .../GetFilesDownloadLimitRemoteOperation.kt | 72 +++++++++++++++++++ ...RemoveFilesDownloadLimitRemoteOperation.kt | 51 +++++++++++++ .../SetFilesDownloadLimitRemoteOperation.kt | 54 ++++++++++++++ 4 files changed, 193 insertions(+) create mode 100644 library/src/main/java/com/nextcloud/android/lib/resources/files/FileDownloadLimit.kt create mode 100644 library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt create mode 100644 library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt create mode 100644 library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/FileDownloadLimit.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/FileDownloadLimit.kt new file mode 100644 index 0000000000..0718aec108 --- /dev/null +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/FileDownloadLimit.kt @@ -0,0 +1,16 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.android.lib.resources.files + +import java.io.Serializable + +data class FileDownloadLimit( + val token: String, + val limit: Int, + val count: Int +) : Serializable diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt new file mode 100644 index 0000000000..b2dbde5e9a --- /dev/null +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt @@ -0,0 +1,72 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.android.lib.resources.files + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.network.WebdavEntry +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.OCSRemoteOperation +import org.apache.commons.httpclient.HttpStatus +import org.apache.jackrabbit.webdav.DavConstants +import org.apache.jackrabbit.webdav.client.methods.PropFindMethod +import org.apache.jackrabbit.webdav.property.DavPropertyNameSet +import org.apache.jackrabbit.webdav.xml.Namespace + +class GetFilesDownloadLimitRemoteOperation + @JvmOverloads + constructor( + val remotePath: String, + val subfiles: Boolean = false + ) : OCSRemoteOperation>() { + @Deprecated("Deprecated in Java") + override fun run(client: OwnCloudClient): RemoteOperationResult> { + var result: RemoteOperationResult> + var propFindMethod: PropFindMethod? = null + val propSet = DavPropertyNameSet() + val depth = if (subfiles) DavConstants.DEPTH_1 else DavConstants.DEPTH_0 + + propSet.add( + WebdavEntry.EXTENDED_PROPERTY_FILE_DOWNLOAD_LIMITS, + Namespace.getNamespace(WebdavEntry.NAMESPACE_NC) + ) + + try { + propFindMethod = PropFindMethod(client.getFilesDavUri(remotePath), propSet, depth) + + val status = client.executeMethod(propFindMethod) + + if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) { + val response = propFindMethod.responseBodyAsMultiStatus + + val fileDownloadLimits = + response.responses.flatMap { + val webdavEntry = WebdavEntry(it, client.filesDavUri.encodedPath!!) + webdavEntry.fileDownloadLimit + } + + result = RemoteOperationResult(true, propFindMethod) + result.resultData = fileDownloadLimits + } else { + result = RemoteOperationResult(false, propFindMethod) + client.exhaustResponse(propFindMethod.responseBodyAsStream) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while reading download limit", e) + } finally { + propFindMethod?.releaseConnection() + } + + return result + } + + companion object { + private val TAG = GetFilesDownloadLimitRemoteOperation::class.java.simpleName + } + } diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt new file mode 100644 index 0000000000..a4e25f230e --- /dev/null +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt @@ -0,0 +1,51 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.android.lib.resources.files + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.OCSRemoteOperation +import org.apache.commons.httpclient.HttpStatus + +class RemoveFilesDownloadLimitRemoteOperation( + val token: String +) : OCSRemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult + var deleteMethod: DeleteMethod? = null + + try { + val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + JSON_FORMAT + deleteMethod = DeleteMethod(url, true) + + val status = deleteMethod.execute(client) + + if (status == HttpStatus.SC_OK) { + result = RemoteOperationResult(true, deleteMethod) + } else { + result = RemoteOperationResult(false, deleteMethod) + Log_OC.e(TAG, "Failed to remove download limit") + Log_OC.e(TAG, "*** status code: " + status + "; response: " + deleteMethod.getResponseBodyAsString()) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while removing download limit", e) + } finally { + deleteMethod?.releaseConnection() + } + + return result + } + + companion object { + private val TAG = RemoveFilesDownloadLimitRemoteOperation::class.java.simpleName + private const val FILES_DOWNLOAD_LIMIT_ENDPOINT = "/ocs/v2.php/apps/files_downloadlimit/api/v1/%s/limit" + } +} diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt new file mode 100644 index 0000000000..b6bf4bcfa0 --- /dev/null +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt @@ -0,0 +1,54 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.nextcloud.android.lib.resources.files + +import com.nextcloud.common.JSONRequestBody +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.PutMethod +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.OCSRemoteOperation +import org.apache.commons.httpclient.HttpStatus + +class SetFilesDownloadLimitRemoteOperation( + val token: String, + val limit: Int +) : OCSRemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult + var putMethod: PutMethod? = null + + try { + val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + val jsonRequestBody = JSONRequestBody("limit", limit.toString()) + putMethod = PutMethod(url, true, jsonRequestBody.get()) + + val status = putMethod.execute(client) + + if (status == HttpStatus.SC_OK) { + result = RemoteOperationResult(true, putMethod) + } else { + result = RemoteOperationResult(false, putMethod) + Log_OC.e(TAG, "Failed to set download limit") + Log_OC.e(TAG, "*** status code: " + status + "; response: " + putMethod.getResponseBodyAsString()) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while setting download limit", e) + } finally { + putMethod?.releaseConnection() + } + + return result + } + + companion object { + private val TAG = SetFilesDownloadLimitRemoteOperation::class.java.simpleName + private const val FILES_DOWNLOAD_LIMIT_ENDPOINT = "/ocs/v2.php/apps/files_downloadlimit/api/v1/%s/limit" + } +} From e62670ca928a53b7bb1be9013bf0a9f52087ba09 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:42:31 +0100 Subject: [PATCH 03/13] Extend RemoteFile and WebdavEntry for files download limit Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../android/lib/common/network/WebdavEntry.kt | 48 ++++++++++++++++++- .../lib/common/network/WebdavUtils.java | 1 + .../lib/resources/files/model/RemoteFile.kt | 4 ++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/owncloud/android/lib/common/network/WebdavEntry.kt b/library/src/main/java/com/owncloud/android/lib/common/network/WebdavEntry.kt index 442fda4c3d..978a3e9651 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/network/WebdavEntry.kt +++ b/library/src/main/java/com/owncloud/android/lib/common/network/WebdavEntry.kt @@ -11,6 +11,7 @@ package com.owncloud.android.lib.common.network import android.net.Uri import com.google.gson.Gson +import com.nextcloud.android.lib.resources.files.FileDownloadLimit import com.nextcloud.extensions.fromDavProperty import com.nextcloud.extensions.processXmlData import com.owncloud.android.lib.common.utils.Log_OC @@ -96,6 +97,7 @@ class WebdavEntry constructor( private set var livePhoto: String? = null private set + var fileDownloadLimit = emptyList() private val gson = Gson() @@ -114,7 +116,7 @@ class WebdavEntry constructor( path = uri!!.split(splitElement.toRegex(), limit = 2).toTypedArray()[1].replace("//", "/") var status = ms.status[0].statusCode - if (status == CODE_PROP_NOT_FOUND) { + if (status == CODE_PROP_NOT_FOUND && ms.status.size > 1) { status = ms.status[1].statusCode } val propSet = ms.getProperties(status) @@ -464,6 +466,19 @@ class WebdavEntry constructor( false } + // NC files download limits property: + prop = propSet[EXTENDED_PROPERTY_FILE_DOWNLOAD_LIMITS, ncNamespace] + if (prop != null && prop.value != null) { + if (prop.value is ArrayList<*>) { + val list = prop.value as ArrayList<*> + fileDownloadLimit = list.mapNotNull { extractFileDownloadLimit(it as Element) } + } else { + extractFileDownloadLimit(prop.value as Element)?.let { + fileDownloadLimit = listOf(it) + } + } + } + parseLockProperties(ncNamespace, propSet) } else { Log_OC.e("WebdavEntry", "General error, no status for webdav response") @@ -564,6 +579,35 @@ class WebdavEntry constructor( return ShareType.NO_SHARED } + private fun extractFileDownloadLimit(element: Element): FileDownloadLimit? { + val token = + element + .getElementsByTagNameNS(NAMESPACE_NC, "token") + ?.item(0) + ?.firstChild + ?.nodeValue + val limit = + element + .getElementsByTagNameNS(NAMESPACE_NC, "limit") + ?.item(0) + ?.firstChild + ?.nodeValue + ?.toIntOrNull() + val count = + element + .getElementsByTagNameNS(NAMESPACE_NC, "count") + ?.item(0) + ?.firstChild + ?.nodeValue + ?.toIntOrNull() + + return if (token != null && limit != null && count != null) { + FileDownloadLimit(token, limit, count) + } else { + null + } + } + fun decodedPath(): String = Uri.decode(path) val isDirectory: Boolean @@ -623,6 +667,8 @@ class WebdavEntry constructor( const val EXTENDED_PROPERTY_HIDDEN = "hidden" const val EXTENDED_PROPERTY_METADATA_LIVE_PHOTO = "metadata-files-live-photo" + const val EXTENDED_PROPERTY_FILE_DOWNLOAD_LIMITS = "share-download-limits" + const val EXTENDED_PROPERTY_METADATA_PHOTOS_SIZE = "metadata-photos-size" const val EXTENDED_PROPERTY_METADATA_PHOTOS_GPS = "metadata-photos-gps" const val TRASHBIN_FILENAME = "trashbin-filename" diff --git a/library/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java b/library/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java index 40cd11fea2..e15e02b0f8 100644 --- a/library/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java +++ b/library/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java @@ -123,6 +123,7 @@ public static DavPropertyNameSet getAllPropSet() { propSet.add(WebdavEntry.EXTENDED_PROPERTY_METADATA_PHOTOS_GPS, ncNamespace); propSet.add(WebdavEntry.EXTENDED_PROPERTY_METADATA_LIVE_PHOTO, ncNamespace); propSet.add(WebdavEntry.EXTENDED_PROPERTY_HIDDEN, ncNamespace); + propSet.add(WebdavEntry.EXTENDED_PROPERTY_FILE_DOWNLOAD_LIMITS, ncNamespace); return propSet; } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/model/RemoteFile.kt b/library/src/main/java/com/owncloud/android/lib/resources/files/model/RemoteFile.kt index f35e1304f2..052ce8e14a 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/files/model/RemoteFile.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/files/model/RemoteFile.kt @@ -8,6 +8,7 @@ package com.owncloud.android.lib.resources.files.model import android.os.Parcel import android.os.Parcelable +import com.nextcloud.android.lib.resources.files.FileDownloadLimit import com.owncloud.android.lib.common.network.WebdavEntry import com.owncloud.android.lib.common.network.WebdavEntry.MountType import com.owncloud.android.lib.resources.files.FileUtils @@ -57,6 +58,7 @@ class RemoteFile : var geoLocation: GeoLocation? = null var hidden = false var livePhoto: String? = null + var fileDownloadLimit: List = emptyList() constructor() { resetData() @@ -112,6 +114,7 @@ class RemoteFile : geoLocation = we.geoLocation livePhoto = we.livePhoto hidden = we.hidden + fileDownloadLimit = we.fileDownloadLimit } /** @@ -144,6 +147,7 @@ class RemoteFile : tags = null hidden = false livePhoto = null + fileDownloadLimit = emptyList() } /** From 341502cb678c9f184e3fe54f7e9e0a824821af51 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:43:31 +0100 Subject: [PATCH 04/13] Extend ArrayListExtensions.kt Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../java/com/nextcloud/extensions/ArrayListExtensions.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/nextcloud/extensions/ArrayListExtensions.kt b/library/src/main/java/com/nextcloud/extensions/ArrayListExtensions.kt index 4d36f58cb3..3e53e9b152 100644 --- a/library/src/main/java/com/nextcloud/extensions/ArrayListExtensions.kt +++ b/library/src/main/java/com/nextcloud/extensions/ArrayListExtensions.kt @@ -16,17 +16,14 @@ inline fun ArrayList<*>.processXmlData(tagName: String): T? { val element = it as? Element if (element != null && element.tagName == tagName) { val textContent = element.firstChild.textContent - return when (T::class) { Float::class -> { - val floatValue = textContent.toFloatOrNull() - if (floatValue != null) floatValue as T else null + textContent.toFloatOrNull() as? T } Double::class -> { - val doubleValue = textContent.toDoubleOrNull() - if (doubleValue != null) doubleValue as T else null + textContent.toDoubleOrNull() as? T } - else -> return null + else -> textContent as? T } } } From 5bf45ce022bef52a924156a59cce7a5da406de98 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Mon, 13 Jan 2025 11:34:20 +0100 Subject: [PATCH 05/13] Refactor GetSharesForFileRemoteOperation.java Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../GetSharesForFileRemoteOperation.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/shares/GetSharesForFileRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/shares/GetSharesForFileRemoteOperation.java index b579e65ba9..8ee72cc598 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/shares/GetSharesForFileRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/shares/GetSharesForFileRemoteOperation.java @@ -19,12 +19,14 @@ import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; +import java.util.List; + /** * Provide a list shares for a specific file. * The input is the full path of the desired file. * The output is a list of everyone who has the file shared with them. */ -public class GetSharesForFileRemoteOperation extends RemoteOperation { +public class GetSharesForFileRemoteOperation extends RemoteOperation> { private static final String TAG = GetSharesForFileRemoteOperation.class.getSimpleName(); @@ -32,9 +34,9 @@ public class GetSharesForFileRemoteOperation extends RemoteOperation { private static final String PARAM_RESHARES = "reshares"; private static final String PARAM_SUBFILES = "subfiles"; - private String mRemoteFilePath; - private boolean mReshares; - private boolean mSubfiles; + private final String mRemoteFilePath; + private final boolean mReshares; + private final boolean mSubfiles; /** * Constructor @@ -46,17 +48,15 @@ public class GetSharesForFileRemoteOperation extends RemoteOperation { * @param subfiles If set to false (default), lists only the folder being shared * If set to true, all shared files within the folder are returned. */ - public GetSharesForFileRemoteOperation(String remoteFilePath, boolean reshares, - boolean subfiles) { + public GetSharesForFileRemoteOperation(String remoteFilePath, boolean reshares, boolean subfiles) { mRemoteFilePath = remoteFilePath; mReshares = reshares; mSubfiles = subfiles; } @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result = null; - int status = -1; + protected RemoteOperationResult> run(OwnCloudClient client) { + RemoteOperationResult> result; GetMethod get = null; @@ -68,13 +68,12 @@ protected RemoteOperationResult run(OwnCloudClient client) { get.setQueryString(new NameValuePair[]{ new NameValuePair(PARAM_PATH, mRemoteFilePath), new NameValuePair(PARAM_RESHARES, String.valueOf(mReshares)), - new NameValuePair(PARAM_SUBFILES, String.valueOf(mSubfiles)) //, - //new NameValuePair("shared_with_me", "true") + new NameValuePair(PARAM_SUBFILES, String.valueOf(mSubfiles)) }); get.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - status = client.executeMethod(get); + int status = client.executeMethod(get); if (isSuccess(status)) { String response = get.getResponseBodyAsString(); @@ -91,11 +90,11 @@ protected RemoteOperationResult run(OwnCloudClient client) { } } else { - result = new RemoteOperationResult(false, get); + result = new RemoteOperationResult<>(false, get); } } catch (Exception e) { - result = new RemoteOperationResult(e); + result = new RemoteOperationResult<>(e); Log_OC.e(TAG, "Exception while getting shares", e); } finally { From abc9c21b0dcc1d388aa906732d2f1b992a03fe03 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:28:06 +0100 Subject: [PATCH 06/13] Add FilesDownloadLimitIT Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../resources/files/FilesDownloadLimitIT.kt | 97 +++++++++++++++++++ .../lib/resources/status/OwnCloudVersion.java | 1 + 2 files changed, 98 insertions(+) create mode 100644 library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt new file mode 100644 index 0000000000..f5b902f6a8 --- /dev/null +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -0,0 +1,97 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 ZetaTom <70907959+zetatom@users.noreply.github.com> + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.files + +import com.nextcloud.android.lib.resources.files.GetFilesDownloadLimitRemoteOperation +import com.nextcloud.android.lib.resources.files.RemoveFilesDownloadLimitRemoteOperation +import com.nextcloud.android.lib.resources.files.SetFilesDownloadLimitRemoteOperation +import com.owncloud.android.AbstractIT +import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation +import com.owncloud.android.lib.resources.shares.OCShare +import com.owncloud.android.lib.resources.shares.ShareType +import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation +import com.owncloud.android.lib.resources.status.OCCapability +import com.owncloud.android.lib.resources.status.OwnCloudVersion +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Test + +class FilesDownloadLimitIT : AbstractIT() { + @Before + fun before() { + testOnlyOnServer(OwnCloudVersion.nextcloud_30) + assumeTrue(getCapability().filesDownloadLimit.isTrue) + } + + @Test + fun getDefaultLimit() { + val defaultLimit = getCapability().filesDownloadLimitDefault + assert(defaultLimit == 0) + } + + @Test + fun downloadLimit() { + val share = createTestShare() + val limit = 5 + + val resultSet = SetFilesDownloadLimitRemoteOperation(share.token!!, limit).execute(nextcloudClient) + assert(resultSet.isSuccess) + + shortSleep() + + val resultGet1 = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) + assert(resultGet1.isSuccess) + assert(resultGet1.resultData.size == 1) + assert(resultGet1.resultData.first().token == share.token) + assert(resultGet1.resultData.first().limit == limit) + assert(resultGet1.resultData.first().count == 0) + + shortSleep() + + val resultRemove = RemoveFilesDownloadLimitRemoteOperation(share.token!!).execute(nextcloudClient) + assert(resultRemove.isSuccess) + + shortSleep() + + val resultGet2 = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) + assert(resultGet2.isSuccess) + assert(resultGet2.resultData.isEmpty()) + } + + private fun getCapability(): OCCapability = + GetCapabilitiesRemoteOperation().execute(nextcloudClient).singleData as OCCapability + + private fun createTestShare(): OCShare { + val localPath = createFile("test") + + assert( + UploadFileRemoteOperation(localPath, REMOTE_PATH, "text/plain", RANDOM_MTIME) + .execute(client) + .isSuccess + ) + + val result = + CreateShareRemoteOperation( + REMOTE_PATH, + ShareType.PUBLIC_LINK, + "", + false, + "", + 1 + ).execute(client) + + assert(result.isSuccess) + val share = result.resultData.first() + assert(share.token != null) + return share + } + + companion object { + private const val REMOTE_PATH = "/downloadLimits.txt" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index 01962a8864..f67cd4c8de 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -24,6 +24,7 @@ public class OwnCloudVersion implements Comparable, Parcelable public static final OwnCloudVersion nextcloud_18 = new OwnCloudVersion(0x12000000); // 18.0 public static final OwnCloudVersion nextcloud_19 = new OwnCloudVersion(0x13000000); // 19.0 public static final OwnCloudVersion nextcloud_20 = new OwnCloudVersion(0x14000000); // 20.0 + public static final OwnCloudVersion nextcloud_30 = new OwnCloudVersion(0x1E000000); // 30.0 private static final int MAX_DOTS = 3; From 019891cd5722275fa30b068195799fb0da5ff8a9 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:05:22 +0100 Subject: [PATCH 07/13] Fix lint - remove redundant exception handling Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../resources/files/FilesDownloadLimitIT.kt | 1 + .../GetFilesDownloadLimitRemoteOperation.kt | 41 ++++++++----------- ...RemoveFilesDownloadLimitRemoteOperation.kt | 36 +++++++--------- .../SetFilesDownloadLimitRemoteOperation.kt | 38 ++++++++--------- 4 files changed, 50 insertions(+), 66 deletions(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index f5b902f6a8..70d1ac562b 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -35,6 +35,7 @@ class FilesDownloadLimitIT : AbstractIT() { } @Test + @Suppress("Detekt.MagicNumber") fun downloadLimit() { val share = createTestShare() val limit = 5 diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt index b2dbde5e9a..ef429f6172 100644 --- a/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/GetFilesDownloadLimitRemoteOperation.kt @@ -26,8 +26,7 @@ class GetFilesDownloadLimitRemoteOperation ) : OCSRemoteOperation>() { @Deprecated("Deprecated in Java") override fun run(client: OwnCloudClient): RemoteOperationResult> { - var result: RemoteOperationResult> - var propFindMethod: PropFindMethod? = null + val result: RemoteOperationResult> val propSet = DavPropertyNameSet() val depth = if (subfiles) DavConstants.DEPTH_1 else DavConstants.DEPTH_0 @@ -36,33 +35,29 @@ class GetFilesDownloadLimitRemoteOperation Namespace.getNamespace(WebdavEntry.NAMESPACE_NC) ) - try { - propFindMethod = PropFindMethod(client.getFilesDavUri(remotePath), propSet, depth) + val propFindMethod = PropFindMethod(client.getFilesDavUri(remotePath), propSet, depth) - val status = client.executeMethod(propFindMethod) + val status = client.executeMethod(propFindMethod) - if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) { - val response = propFindMethod.responseBodyAsMultiStatus + if (status == HttpStatus.SC_MULTI_STATUS || status == HttpStatus.SC_OK) { + val response = propFindMethod.responseBodyAsMultiStatus - val fileDownloadLimits = - response.responses.flatMap { - val webdavEntry = WebdavEntry(it, client.filesDavUri.encodedPath!!) - webdavEntry.fileDownloadLimit - } + val fileDownloadLimits = + response.responses.flatMap { + val webdavEntry = WebdavEntry(it, client.filesDavUri.encodedPath!!) + webdavEntry.fileDownloadLimit + } - result = RemoteOperationResult(true, propFindMethod) - result.resultData = fileDownloadLimits - } else { - result = RemoteOperationResult(false, propFindMethod) - client.exhaustResponse(propFindMethod.responseBodyAsStream) - } - } catch (e: Exception) { - result = RemoteOperationResult(e) - Log_OC.e(TAG, "Exception while reading download limit", e) - } finally { - propFindMethod?.releaseConnection() + result = RemoteOperationResult(true, propFindMethod) + result.resultData = fileDownloadLimits + } else { + Log_OC.e(TAG, "Failed to get download limit") + result = RemoteOperationResult(false, propFindMethod) + client.exhaustResponse(propFindMethod.responseBodyAsStream) } + propFindMethod.releaseConnection() + return result } diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt index a4e25f230e..b2443c09a2 100644 --- a/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/RemoveFilesDownloadLimitRemoteOperation.kt @@ -18,29 +18,23 @@ class RemoveFilesDownloadLimitRemoteOperation( val token: String ) : OCSRemoteOperation() { override fun run(client: NextcloudClient): RemoteOperationResult { - var result: RemoteOperationResult - var deleteMethod: DeleteMethod? = null - - try { - val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + JSON_FORMAT - deleteMethod = DeleteMethod(url, true) - - val status = deleteMethod.execute(client) - - if (status == HttpStatus.SC_OK) { - result = RemoteOperationResult(true, deleteMethod) - } else { - result = RemoteOperationResult(false, deleteMethod) - Log_OC.e(TAG, "Failed to remove download limit") - Log_OC.e(TAG, "*** status code: " + status + "; response: " + deleteMethod.getResponseBodyAsString()) - } - } catch (e: Exception) { - result = RemoteOperationResult(e) - Log_OC.e(TAG, "Exception while removing download limit", e) - } finally { - deleteMethod?.releaseConnection() + val result: RemoteOperationResult + + val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + JSON_FORMAT + val deleteMethod = DeleteMethod(url, true) + + val status = deleteMethod.execute(client) + + if (status == HttpStatus.SC_OK) { + result = RemoteOperationResult(true, deleteMethod) + } else { + result = RemoteOperationResult(false, deleteMethod) + Log_OC.e(TAG, "Failed to remove download limit") + Log_OC.e(TAG, "*** status code: " + status + "; response: " + deleteMethod.getResponseBodyAsString()) } + deleteMethod.releaseConnection() + return result } diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt index b6bf4bcfa0..c22ce3863b 100644 --- a/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt +++ b/library/src/main/java/com/nextcloud/android/lib/resources/files/SetFilesDownloadLimitRemoteOperation.kt @@ -20,30 +20,24 @@ class SetFilesDownloadLimitRemoteOperation( val limit: Int ) : OCSRemoteOperation() { override fun run(client: NextcloudClient): RemoteOperationResult { - var result: RemoteOperationResult - var putMethod: PutMethod? = null - - try { - val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) - val jsonRequestBody = JSONRequestBody("limit", limit.toString()) - putMethod = PutMethod(url, true, jsonRequestBody.get()) - - val status = putMethod.execute(client) - - if (status == HttpStatus.SC_OK) { - result = RemoteOperationResult(true, putMethod) - } else { - result = RemoteOperationResult(false, putMethod) - Log_OC.e(TAG, "Failed to set download limit") - Log_OC.e(TAG, "*** status code: " + status + "; response: " + putMethod.getResponseBodyAsString()) - } - } catch (e: Exception) { - result = RemoteOperationResult(e) - Log_OC.e(TAG, "Exception while setting download limit", e) - } finally { - putMethod?.releaseConnection() + val result: RemoteOperationResult + + val url = client.baseUri.toString() + String.format(FILES_DOWNLOAD_LIMIT_ENDPOINT, token) + val jsonRequestBody = JSONRequestBody("limit", limit.toString()) + val putMethod = PutMethod(url, true, jsonRequestBody.get()) + + val status = putMethod.execute(client) + + if (status == HttpStatus.SC_OK) { + result = RemoteOperationResult(true, putMethod) + } else { + result = RemoteOperationResult(false, putMethod) + Log_OC.e(TAG, "Failed to set download limit") + Log_OC.e(TAG, "*** status code: " + status + "; response: " + putMethod.getResponseBodyAsString()) } + putMethod.releaseConnection() + return result } From 8e27e4cfcf9dede72e8236af7db2d910944334ce Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:44:06 +0100 Subject: [PATCH 08/13] Fail FilesDownloadLimitIT when files_downloadlimit is not installed Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../android/lib/resources/files/FilesDownloadLimitIT.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index 70d1ac562b..a8df2119b3 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -17,7 +17,6 @@ import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation import com.owncloud.android.lib.resources.status.OCCapability import com.owncloud.android.lib.resources.status.OwnCloudVersion -import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.Test @@ -25,7 +24,7 @@ class FilesDownloadLimitIT : AbstractIT() { @Before fun before() { testOnlyOnServer(OwnCloudVersion.nextcloud_30) - assumeTrue(getCapability().filesDownloadLimit.isTrue) + assert(getCapability().filesDownloadLimit.isTrue) } @Test From 58917a96ad8a7de3ebcde8cc475b2734e9870f27 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 20 Jan 2025 15:52:53 +0100 Subject: [PATCH 09/13] drone: add files_downloadlimit app Signed-off-by: tobiasKaminsky --- .drone.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 30eec7f8c7..39db790270 100644 --- a/.drone.yml +++ b/.drone.yml @@ -109,6 +109,8 @@ services: - su www-data -c "cd /var/www/html/apps/assistant; source ~/.bashrc; composer install --no-dev" - su www-data -c "php /var/www/html/occ app:enable -f assistant" - su www-data -c "php /var/www/html/occ app:enable -f testing" + - su www-data -c "git clone --depth 1 https://github.com/nextcloud/files_downloadlimit.git /var/www/html/apps/files_downloadlimit/" + - su www-data -c "php /var/www/html/occ app:enable -f files_downloadlimit" - /usr/local/bin/run.sh trigger: @@ -224,6 +226,8 @@ services: - su www-data -c "cd /var/www/html/apps/assistant; source ~/.bashrc; composer install --no-dev" - su www-data -c "php /var/www/html/occ app:enable assistant" - su www-data -c "php /var/www/html/occ app:enable -f testing" + - su www-data -c "git clone --depth 1 -b $SERVER_VERSION https://github.com/nextcloud/files_downloadlimit.git /var/www/html/apps/files_downloadlimit/" + - su www-data -c "php /var/www/html/occ app:enable -f files_downloadlimit" - /usr/local/bin/run.sh trigger: @@ -235,6 +239,6 @@ trigger: - pull_request --- kind: signature -hmac: 3e71a44f6f57a4d4d853c586c0c322bf0b718d96627906b92864e12353e5a014 +hmac: fe00fcbb3bf41f6aa84193e380345c3b009ef933d295dda86ea3c959a8373381 ... From 87d8ad172e773166004ee68eb7dc451603772b23 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 20 Jan 2025 17:48:14 +0100 Subject: [PATCH 10/13] change test Signed-off-by: tobiasKaminsky --- .../android/lib/resources/files/FilesDownloadLimitIT.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index a8df2119b3..9a8f50e9df 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -17,6 +17,7 @@ import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation import com.owncloud.android.lib.resources.status.OCCapability import com.owncloud.android.lib.resources.status.OwnCloudVersion +import junit.framework.TestCase.assertEquals import org.junit.Before import org.junit.Test @@ -30,7 +31,7 @@ class FilesDownloadLimitIT : AbstractIT() { @Test fun getDefaultLimit() { val defaultLimit = getCapability().filesDownloadLimitDefault - assert(defaultLimit == 0) + assertEquals(0, defaultLimit) } @Test From 6ef2923a8ede58e4ff0f03af3e707a1d98153380 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:08:52 +0100 Subject: [PATCH 11/13] Set default value to -1 to match server Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../android/lib/resources/files/FilesDownloadLimitIT.kt | 2 +- .../com/owncloud/android/lib/resources/status/OCCapability.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index 9a8f50e9df..e7fef5c761 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -31,7 +31,7 @@ class FilesDownloadLimitIT : AbstractIT() { @Test fun getDefaultLimit() { val defaultLimit = getCapability().filesDownloadLimitDefault - assertEquals(0, defaultLimit) + assertEquals(-1, defaultLimit) } @Test diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt index c2d089c29d..0ba53fe14d 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt @@ -112,7 +112,7 @@ class OCCapability { // files download limits var filesDownloadLimit = CapabilityBooleanType.UNKNOWN - var filesDownloadLimitDefault = 0 + var filesDownloadLimitDefault = -1 // Etag for capabilities var etag: String? = "" From 420bc3e279685a2b5f819530fbf39e9ad29fa6b3 Mon Sep 17 00:00:00 2001 From: ZetaTom <70907959+ZetaTom@users.noreply.github.com> Date: Tue, 21 Jan 2025 09:51:23 +0100 Subject: [PATCH 12/13] Test multiple shares at once Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com> --- .../resources/files/FilesDownloadLimitIT.kt | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index e7fef5c761..6e17246658 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -37,45 +37,61 @@ class FilesDownloadLimitIT : AbstractIT() { @Test @Suppress("Detekt.MagicNumber") fun downloadLimit() { - val share = createTestShare() - val limit = 5 + createTestFile() - val resultSet = SetFilesDownloadLimitRemoteOperation(share.token!!, limit).execute(nextcloudClient) - assert(resultSet.isSuccess) + val shareTokens = mutableListOf() - shortSleep() + DOWNLOAD_LIMITS.forEach { limit -> + val share = createTestShare() + shareTokens.add(share.token!!) - val resultGet1 = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) - assert(resultGet1.isSuccess) - assert(resultGet1.resultData.size == 1) - assert(resultGet1.resultData.first().token == share.token) - assert(resultGet1.resultData.first().limit == limit) - assert(resultGet1.resultData.first().count == 0) + val resultSet = SetFilesDownloadLimitRemoteOperation(share.token!!, limit).execute(nextcloudClient) + assert(resultSet.isSuccess) - shortSleep() + shortSleep() + + val resultGet = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) + assert(resultGet.isSuccess) + assertEquals(shareTokens.size, resultGet.resultData.size) - val resultRemove = RemoveFilesDownloadLimitRemoteOperation(share.token!!).execute(nextcloudClient) - assert(resultRemove.isSuccess) + val downloadLimit = + resultGet.resultData.first { + it.token == share.token + } + + assertEquals(limit, downloadLimit.limit) + assertEquals(0, downloadLimit.count) + } shortSleep() - val resultGet2 = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) - assert(resultGet2.isSuccess) - assert(resultGet2.resultData.isEmpty()) + for (i in shareTokens.lastIndex downTo 0) { + val token = shareTokens[i] + val resultRemove = RemoveFilesDownloadLimitRemoteOperation(token).execute(nextcloudClient) + assert(resultRemove.isSuccess) + + shortSleep() + + val resultGet = GetFilesDownloadLimitRemoteOperation(REMOTE_PATH, false).execute(client) + assert(resultGet.isSuccess) + assertEquals(i, resultGet.resultData.size) + } } private fun getCapability(): OCCapability = GetCapabilitiesRemoteOperation().execute(nextcloudClient).singleData as OCCapability - private fun createTestShare(): OCShare { + private fun createTestFile(): Boolean { val localPath = createFile("test") - - assert( + val result = UploadFileRemoteOperation(localPath, REMOTE_PATH, "text/plain", RANDOM_MTIME) .execute(client) .isSuccess - ) + assert(result) + return result + } + private fun createTestShare(): OCShare { val result = CreateShareRemoteOperation( REMOTE_PATH, @@ -94,5 +110,6 @@ class FilesDownloadLimitIT : AbstractIT() { companion object { private const val REMOTE_PATH = "/downloadLimits.txt" + private val DOWNLOAD_LIMITS = listOf(5, 10) } } From 062bcf33e15ee7c68a15216134489b423097ea9a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Tue, 21 Jan 2025 10:09:27 +0100 Subject: [PATCH 13/13] use correct NextcloudVersion Signed-off-by: tobiasKaminsky --- .../android/lib/resources/files/FilesDownloadLimitIT.kt | 4 ++-- .../android/lib/resources/status/OwnCloudVersion.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt index 6e17246658..03c852d5b6 100644 --- a/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/files/FilesDownloadLimitIT.kt @@ -15,8 +15,8 @@ import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation +import com.owncloud.android.lib.resources.status.NextcloudVersion import com.owncloud.android.lib.resources.status.OCCapability -import com.owncloud.android.lib.resources.status.OwnCloudVersion import junit.framework.TestCase.assertEquals import org.junit.Before import org.junit.Test @@ -24,7 +24,7 @@ import org.junit.Test class FilesDownloadLimitIT : AbstractIT() { @Before fun before() { - testOnlyOnServer(OwnCloudVersion.nextcloud_30) + testOnlyOnServer(NextcloudVersion.nextcloud_30) assert(getCapability().filesDownloadLimit.isTrue) } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index f67cd4c8de..01962a8864 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -24,7 +24,6 @@ public class OwnCloudVersion implements Comparable, Parcelable public static final OwnCloudVersion nextcloud_18 = new OwnCloudVersion(0x12000000); // 18.0 public static final OwnCloudVersion nextcloud_19 = new OwnCloudVersion(0x13000000); // 19.0 public static final OwnCloudVersion nextcloud_20 = new OwnCloudVersion(0x14000000); // 20.0 - public static final OwnCloudVersion nextcloud_30 = new OwnCloudVersion(0x1E000000); // 30.0 private static final int MAX_DOTS = 3;