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 25e87e6e8..039ae195c 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 @@ -169,6 +169,9 @@ public class GetCapabilitiesRemoteOperation extends RemoteOperation { // drop-account private static final String NODE_DROP_ACCOUNT = "drop-account"; + // security guard + private static final String NODE_SECURITY_GUARD = "security_guard"; + private static final String NODE_DIAGNOSTICS = "diagnostics"; private OCCapability currentCapability = null; @@ -687,6 +690,19 @@ private OCCapability parseResponse(String response) throws JSONException { capability.setDropAccount(CapabilityBooleanType.FALSE); } } + + // security guard + if (respCapabilities.has(NODE_SECURITY_GUARD)) { + JSONObject securityGuardCapability = respCapabilities.getJSONObject(NODE_SECURITY_GUARD); + + if (securityGuardCapability.getBoolean(NODE_DIAGNOSTICS)) { + capability.setSecurityGuard(CapabilityBooleanType.TRUE); + } else { + capability.setSecurityGuard(CapabilityBooleanType.FALSE); + } + } else { + capability.setSecurityGuard(CapabilityBooleanType.FALSE); + } } 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 3a5a817ce..ab24c9253 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 @@ -113,6 +113,9 @@ class OCCapability { // Drop-Account var dropAccount = CapabilityBooleanType.UNKNOWN + // Security guard + var securityGuard = CapabilityBooleanType.UNKNOWN + // Etag for capabilities var etag: String? = "" diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/Problem.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/Problem.kt new file mode 100644 index 000000000..98e5cc656 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/Problem.kt @@ -0,0 +1,34 @@ +/* Nextcloud Android Library is available under MIT license + * + * @author Tobias Kaminsky + * Copyright (C) 2023 Tobias Kaminsky + * Copyright (C) 2023 Nextcloud 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.status + +data class Problem(val type: String, val count: Int, val oldestTimestamp: Long) { + fun toJsonWithTypeString(): String { + return """"$type": {"count": $count, "oldest": $oldestTimestamp}""" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/SendClientDiagnosticRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/SendClientDiagnosticRemoteOperation.kt new file mode 100644 index 000000000..ed44228e7 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/SendClientDiagnosticRemoteOperation.kt @@ -0,0 +1,99 @@ +/* Nextcloud Android Library is available under MIT license + * + * @author Tobias Kaminsky + * Copyright (C) 2023 Tobias Kaminsky + * Copyright (C) 2023 Nextcloud 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.status + +import androidx.annotation.VisibleForTesting +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.PutMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody +import org.apache.commons.httpclient.HttpStatus + +class SendClientDiagnosticRemoteOperation( + private val syncConflict: Problem?, + private val problems: List?, + private val virusDetected: Problem?, + private val e2eError: Problem? +) : RemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + val request = RequestBody.create("application/json".toMediaTypeOrNull(), generateJSON()) + + val putMethod = PutMethod(client.baseUri.toString() + URL, true, request) + + val status = putMethod.execute(client) + + return if (status == HttpStatus.SC_OK) { + RemoteOperationResult(true, putMethod) + } else { + RemoteOperationResult(false, putMethod) + } + } + + @VisibleForTesting + fun generateJSON(): String { + val map = mutableListOf() + + if (syncConflict != null) { + map.add(syncConflict.toJsonWithTypeString()) + } else { + map.add(""""$SYNC_CONFLICTS": {}""") + } + + if (problems != null) { + val test = problems.map { it.toJsonWithTypeString() } + map.add(""""$PROBLEMS": ${test.joinToString(", ", "{", "}")}""") + } else { + map.add(""""$PROBLEMS": {}""") + } + + if (virusDetected != null) { + map.add(virusDetected.toJsonWithTypeString()) + } else { + map.add(""""$VIRUS_DETECTED": {}""") + } + + if (e2eError != null) { + map.add(e2eError.toJsonWithTypeString()) + } else { + map.add(""""$E2E_ERRORS": {}""") + } + + return map.joinToString(prefix = "{", postfix = "}") + } + + companion object { + const val URL = "/ocs/v2.php/apps/security_guard/diagnostics" + + const val SYNC_CONFLICTS = "sync_conflicts" + const val PROBLEMS = "problems" + const val VIRUS_DETECTED = "virus_detected" + const val E2E_ERRORS = "e2e_errors" + } +}