From f19b2355b41c83443782216b328d50a4cfd1969b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Wed, 20 Apr 2022 18:25:31 +0200 Subject: [PATCH] create scaffold for webfinger request operation --- .../GetOCInstanceViaWebfingerOperation.kt | 75 ++++++++++++++++++- .../GetOCInstanceViaWebfingerOperationTest.kt | 11 --- 2 files changed, 73 insertions(+), 13 deletions(-) delete mode 100644 owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperationTest.kt 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/GetOCInstanceViaWebfingerOperation.kt index e74f50b5..ee6c7e95 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/GetOCInstanceViaWebfingerOperation.kt @@ -24,16 +24,87 @@ package com.owncloud.android.lib.resources.webfinger +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.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.status.HttpScheme +import com.owncloud.android.lib.resources.webfinger.responses.WebfingerJrdResponse +import com.squareup.moshi.Moshi +import timber.log.Timber +import java.net.URL class GetOCInstanceViaWebfingerOperation( + private val lockupServerDomain:String, private val rel:String, private val resource:String ) : RemoteOperation() { - override fun run(client: OwnCloudClient?): RemoteOperationResult { - TODO("Not yet implemented") + private fun buildRequestUri() = + Uri.parse(lockupServerDomain).buildUpon() + .scheme(HttpScheme.HTTPS_SCHEME) + .path(WEBFINGER_PATH) + .appendQueryParameter("rel", rel) + .appendQueryParameter("resource", resource) + .build() + + private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK + + private fun parseResponse(response: String): WebfingerJrdResponse { + val moshi = Moshi.Builder().build() + val adapter = moshi.adapter(WebfingerJrdResponse::class.java) + return adapter.fromJson(response)!! + } + + private fun onResultUnsuccessful( + method: HttpMethod, + response: String?, + status: Int + ): 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) + } + + 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") + } + + override fun run(client: OwnCloudClient): RemoteOperationResult { + val requestUri = buildRequestUri() + 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, "Requesting webfinger info failed") + RemoteOperationResult(e) + } + } + + companion object { + val WEBFINGER_PATH = "/.well-known/webfinger" } } \ No newline at end of file diff --git a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperationTest.kt b/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperationTest.kt deleted file mode 100644 index d4f84a83..00000000 --- a/owncloudComLibrary/src/test/java/com/owncloud/android/lib/resources/webfinger/GetOCInstanceViaWebfingerOperationTest.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.owncloud.android.lib.resources.webfinger - -import android.os.Build -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 GetOCInstanceViaWebfingerOperationTest { -} \ No newline at end of file