From 6f5bfbbd81b4a83b5d13d66944d3a7ede1662204 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 29 Apr 2026 11:49:04 +0200 Subject: [PATCH 1/4] feat(e2ee): add deletion functions Signed-off-by: alperozturk96 --- .../DeleteEncryptedFilesRemoteOperation.kt | 52 +++++++++++++++++++ .../e2ee/DeletePrivateKeyRemoteOperation.kt | 52 +++++++++++++++++++ .../e2ee/DeletePublicKeyRemoteOperation.kt | 52 +++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt new file mode 100644 index 0000000000..d0957e30c2 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt @@ -0,0 +1,52 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.e2ee + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import org.apache.commons.httpclient.HttpStatus + +class DeleteEncryptedFilesRemoteOperation : RemoteOperation() { + + @Deprecated("Deprecated in Java") + @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") + override fun run(client: NextcloudClient): RemoteOperationResult { + val method = + DeleteMethod(uri = client.baseUri.toString() + ENCRYPTED_FILES_URL, useOcsApiRequestHeader = true) + + return try { + val status = client.execute(method) + + if (status == HttpStatus.SC_OK) { + RemoteOperationResult(true, method) + } else { + RemoteOperationResult(false, method).also { + Log_OC.e( + TAG, + "Deleting encrypted files failed: ${method.getResponseBodyAsString()}", + it.exception + ) + } + } + } catch (e: Exception) { + RemoteOperationResult(e).also { + Log_OC.e(TAG, "Deleting encrypted files failed: ${it.logMessage}", it.exception) + } + } finally { + method.releaseConnection() + } + } + + companion object { + private val TAG = DeleteEncryptedFilesRemoteOperation::class.java.simpleName + private const val ENCRYPTED_FILES_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/encrypted-files" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt new file mode 100644 index 0000000000..031da10eb9 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt @@ -0,0 +1,52 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.e2ee + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import org.apache.commons.httpclient.HttpStatus + +class DeletePrivateKeyRemoteOperation : RemoteOperation() { + + @Deprecated("Deprecated in Java") + @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") + override fun run(client: NextcloudClient): RemoteOperationResult { + val method = + DeleteMethod(uri = client.baseUri.toString() + PRIVATE_KEY_URL, useOcsApiRequestHeader = true) + + return try { + val status = client.execute(method) + + if (status == HttpStatus.SC_OK) { + RemoteOperationResult(true, method) + } else { + RemoteOperationResult(false, method).also { + Log_OC.e( + TAG, + "Deleting private key failed: ${method.getResponseBodyAsString()}", + it.exception + ) + } + } + } catch (e: Exception) { + RemoteOperationResult(e).also { + Log_OC.e(TAG, "Deleting private key failed: ${it.logMessage}", it.exception) + } + } finally { + method.releaseConnection() + } + } + + companion object { + private val TAG = DeletePrivateKeyRemoteOperation::class.java.simpleName + private const val PRIVATE_KEY_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/private-key" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt new file mode 100644 index 0000000000..83561abef5 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt @@ -0,0 +1,52 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.e2ee + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import org.apache.commons.httpclient.HttpStatus + +class DeletePublicKeyRemoteOperation : RemoteOperation() { + + @Deprecated("Deprecated in Java") + @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") + override fun run(client: NextcloudClient): RemoteOperationResult { + val method = + DeleteMethod(uri = client.baseUri.toString() + PUBLIC_KEY_URL, useOcsApiRequestHeader = true) + + return try { + val status = client.execute(method) + + if (status == HttpStatus.SC_OK) { + RemoteOperationResult(true, method) + } else { + RemoteOperationResult(false, method).also { + Log_OC.e( + TAG, + "Deleting public key failed: ${method.getResponseBodyAsString()}", + it.exception + ) + } + } + } catch (e: Exception) { + RemoteOperationResult(e).also { + Log_OC.e(TAG, "Deleting public key failed: ${it.logMessage}", it.exception) + } + } finally { + method.releaseConnection() + } + } + + companion object { + private val TAG = DeletePublicKeyRemoteOperation::class.java.simpleName + private const val PUBLIC_KEY_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/public-key" + } +} From a1fb1a12a2e086d4635e2ca09c656a2c87eb9eee Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 29 Apr 2026 11:52:04 +0200 Subject: [PATCH 2/4] feat(e2ee): add deletion functions Signed-off-by: alperozturk96 --- .../e2ee/DeletePrivateKeyRemoteOperation.kt | 52 ------------------- .../e2ee/DeletePublicKeyRemoteOperation.kt | 52 ------------------- 2 files changed, 104 deletions(-) delete mode 100644 library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt delete mode 100644 library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt deleted file mode 100644 index 031da10eb9..0000000000 --- a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePrivateKeyRemoteOperation.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Nextcloud Android Library - * - * SPDX-FileCopyrightText: 2026 Alper Ozturk - * SPDX-License-Identifier: MIT - */ - -package com.owncloud.android.lib.resources.e2ee - -import com.nextcloud.common.NextcloudClient -import com.nextcloud.operations.DeleteMethod -import com.owncloud.android.lib.common.operations.RemoteOperation -import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.common.utils.Log_OC -import org.apache.commons.httpclient.HttpStatus - -class DeletePrivateKeyRemoteOperation : RemoteOperation() { - - @Deprecated("Deprecated in Java") - @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") - override fun run(client: NextcloudClient): RemoteOperationResult { - val method = - DeleteMethod(uri = client.baseUri.toString() + PRIVATE_KEY_URL, useOcsApiRequestHeader = true) - - return try { - val status = client.execute(method) - - if (status == HttpStatus.SC_OK) { - RemoteOperationResult(true, method) - } else { - RemoteOperationResult(false, method).also { - Log_OC.e( - TAG, - "Deleting private key failed: ${method.getResponseBodyAsString()}", - it.exception - ) - } - } - } catch (e: Exception) { - RemoteOperationResult(e).also { - Log_OC.e(TAG, "Deleting private key failed: ${it.logMessage}", it.exception) - } - } finally { - method.releaseConnection() - } - } - - companion object { - private val TAG = DeletePrivateKeyRemoteOperation::class.java.simpleName - private const val PRIVATE_KEY_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/private-key" - } -} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt deleted file mode 100644 index 83561abef5..0000000000 --- a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeletePublicKeyRemoteOperation.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Nextcloud Android Library - * - * SPDX-FileCopyrightText: 2026 Alper Ozturk - * SPDX-License-Identifier: MIT - */ - -package com.owncloud.android.lib.resources.e2ee - -import com.nextcloud.common.NextcloudClient -import com.nextcloud.operations.DeleteMethod -import com.owncloud.android.lib.common.operations.RemoteOperation -import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.common.utils.Log_OC -import org.apache.commons.httpclient.HttpStatus - -class DeletePublicKeyRemoteOperation : RemoteOperation() { - - @Deprecated("Deprecated in Java") - @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") - override fun run(client: NextcloudClient): RemoteOperationResult { - val method = - DeleteMethod(uri = client.baseUri.toString() + PUBLIC_KEY_URL, useOcsApiRequestHeader = true) - - return try { - val status = client.execute(method) - - if (status == HttpStatus.SC_OK) { - RemoteOperationResult(true, method) - } else { - RemoteOperationResult(false, method).also { - Log_OC.e( - TAG, - "Deleting public key failed: ${method.getResponseBodyAsString()}", - it.exception - ) - } - } - } catch (e: Exception) { - RemoteOperationResult(e).also { - Log_OC.e(TAG, "Deleting public key failed: ${it.logMessage}", it.exception) - } - } finally { - method.releaseConnection() - } - } - - companion object { - private val TAG = DeletePublicKeyRemoteOperation::class.java.simpleName - private const val PUBLIC_KEY_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/public-key" - } -} From c4907764fd25e293a247288b87a09b3e4dd59578 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 29 Apr 2026 12:25:54 +0200 Subject: [PATCH 3/4] Rename .java to .kt Signed-off-by: alperozturk96 --- ...cKeyRemoteOperation.java => DeletePublicKeyRemoteOperation.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename library/src/main/java/com/owncloud/android/lib/resources/users/{DeletePublicKeyRemoteOperation.java => DeletePublicKeyRemoteOperation.kt} (100%) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt similarity index 100% rename from library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.java rename to library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt From 44dc13366100afa0ef6182d3f942ce20cb0adb68 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 29 Apr 2026 12:25:55 +0200 Subject: [PATCH 4/4] add tests Signed-off-by: alperozturk96 --- .../users/DeleteE2ERemoteOperationIT.kt | 36 +++++++++ .../v1/DeleteTaskRemoteOperationV1.kt | 3 +- .../DeleteEncryptedFilesRemoteOperation.kt | 1 - .../users/DeletePrivateKeyRemoteOperation.kt | 19 ++--- .../users/DeletePublicKeyRemoteOperation.kt | 76 +++++++++---------- 5 files changed, 80 insertions(+), 55 deletions(-) create mode 100644 library/src/androidTest/java/com/owncloud/android/lib/resources/users/DeleteE2ERemoteOperationIT.kt diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/users/DeleteE2ERemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/users/DeleteE2ERemoteOperationIT.kt new file mode 100644 index 0000000000..fbf6e48d33 --- /dev/null +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/users/DeleteE2ERemoteOperationIT.kt @@ -0,0 +1,36 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.users + +import com.owncloud.android.AbstractIT +import com.owncloud.android.lib.resources.e2ee.DeleteEncryptedFilesRemoteOperation +import junit.framework.TestCase.assertTrue +import org.junit.Test + +class DeleteE2ERemoteOperationIT : AbstractIT() { + @Test + fun testDeleteEncryptedFiles() { + val sut = DeleteEncryptedFilesRemoteOperation() + val result = sut.execute(nextcloudClient) + assertTrue(result.isSuccess) + } + + @Test + fun testDeletePrivateKey() { + val sut = DeletePrivateKeyRemoteOperation() + val result = sut.execute(nextcloudClient) + assertTrue(result.isSuccess) + } + + @Test + fun testDeletePublicKey() { + val sut = DeletePublicKeyRemoteOperation() + val result = sut.execute(nextcloudClient) + assertTrue(result.isSuccess) + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt index 7b667c7e82..85dbfcc60a 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/assistant/v1/DeleteTaskRemoteOperationV1.kt @@ -13,7 +13,6 @@ import com.nextcloud.operations.DeleteMethod import com.owncloud.android.lib.common.operations.RemoteOperation import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC -import com.owncloud.android.lib.resources.users.DeletePrivateKeyRemoteOperation import java.io.IOException import java.net.HttpURLConnection @@ -42,7 +41,7 @@ class DeleteTaskRemoteOperationV1( } companion object { - private val TAG = DeletePrivateKeyRemoteOperation::class.java.simpleName + private val TAG = DeleteTaskRemoteOperationV1::class.java.simpleName private const val DIRECT_ENDPOINT = "/ocs/v2.php/textprocessing/task/" } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt index d0957e30c2..f7d0947dab 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/e2ee/DeleteEncryptedFilesRemoteOperation.kt @@ -15,7 +15,6 @@ import com.owncloud.android.lib.common.utils.Log_OC import org.apache.commons.httpclient.HttpStatus class DeleteEncryptedFilesRemoteOperation : RemoteOperation() { - @Deprecated("Deprecated in Java") @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") override fun run(client: NextcloudClient): RemoteOperationResult { diff --git a/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePrivateKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePrivateKeyRemoteOperation.kt index 1f06b627ff..d1e62c4d19 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePrivateKeyRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePrivateKeyRemoteOperation.kt @@ -15,27 +15,22 @@ import com.owncloud.android.lib.common.utils.Log_OC import java.io.IOException import java.net.HttpURLConnection -/** - * Remote operation performing to delete the private key for an user - */ -class DeletePrivateKeyRemoteOperation : RemoteOperation() { - /** - * @param client Client object - */ - override fun run(client: NextcloudClient): RemoteOperationResult { +class DeletePrivateKeyRemoteOperation : RemoteOperation() { + @Deprecated("Deprecated in Java") + @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") + override fun run(client: NextcloudClient): RemoteOperationResult { var postMethod: DeleteMethod? = null - var result: RemoteOperationResult + var result: RemoteOperationResult try { - // remote request postMethod = DeleteMethod( client.baseUri.toString() + PRIVATE_KEY_URL, true ) val status = client.execute(postMethod) - result = RemoteOperationResult(status == HttpURLConnection.HTTP_OK, postMethod) + result = RemoteOperationResult(status == HttpURLConnection.HTTP_OK, postMethod) } catch (e: IOException) { - result = RemoteOperationResult(e) + result = RemoteOperationResult(e) Log_OC.e(TAG, "Deletion of private key failed: " + result.logMessage, result.exception) } finally { postMethod?.releaseConnection() diff --git a/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt index 6db5c2697d..6c8944448e 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/users/DeletePublicKeyRemoteOperation.kt @@ -5,49 +5,45 @@ * SPDX-FileCopyrightText: 2017 Tobias Kaminsky * SPDX-License-Identifier: MIT */ -package com.owncloud.android.lib.resources.users; - -import com.nextcloud.common.NextcloudClient; -import com.nextcloud.operations.DeleteMethod; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; - -import java.net.HttpURLConnection; - - -/** - * Remote operation performing to delete the public key for an user - */ - -public class DeletePublicKeyRemoteOperation extends RemoteOperation { - - private static final String TAG = DeletePublicKeyRemoteOperation.class.getSimpleName(); - private static final String PUBLIC_KEY_URL = "/ocs/v2.php/apps/end_to_end_encryption/api/v1/public-key"; - - /** - * @param client Client object - */ - @Override - public RemoteOperationResult run(NextcloudClient client) { - DeleteMethod postMethod = null; - RemoteOperationResult result; +package com.owncloud.android.lib.resources.users + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import java.net.HttpURLConnection + +class DeletePublicKeyRemoteOperation : RemoteOperation() { + @Deprecated("Deprecated in Java") + @Suppress("Detekt.TooGenericExceptionCaught", "DEPRECATION") + override fun run(client: NextcloudClient): RemoteOperationResult { + var postMethod: DeleteMethod? = null + var result: RemoteOperationResult try { - // remote request - postMethod = new DeleteMethod(client.getBaseUri() + PUBLIC_KEY_URL, true); - postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.execute(postMethod); - - result = new RemoteOperationResult<>(status == HttpURLConnection.HTTP_OK, postMethod); - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Deletion of public key failed: " + result.getLogMessage(), result.getException()); + postMethod = DeleteMethod(client.baseUri.toString() + PUBLIC_KEY_URL, true) + postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE) + + val status = client.execute(postMethod) + + result = RemoteOperationResult(status == HttpURLConnection.HTTP_OK, postMethod) + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e( + TAG, + "Deletion of public key failed: " + result.getLogMessage(), + result.exception + ) } finally { - if (postMethod != null) - postMethod.releaseConnection(); + postMethod?.releaseConnection() } - return result; + return result + } + + companion object { + private val TAG: String = DeletePublicKeyRemoteOperation::class.java.getSimpleName() + private const val PUBLIC_KEY_URL = + "/ocs/v2.php/apps/end_to_end_encryption/api/v1/public-key" } }