diff --git a/src/androidTest/java/com/owncloud/android/AbstractIT.java b/src/androidTest/java/com/owncloud/android/AbstractIT.java index 3d5603f276..033b03f3c2 100644 --- a/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -97,9 +97,9 @@ public static void beforeAll() throws InterruptedException, OwnCloudClientManagerFactory.setUserAgent("Mozilla/5.0 (Android) Nextcloud-android/1.0.0"); - nextcloudClient = new NextcloudClient(url, context); - nextcloudClient.credentials = Credentials.basic(loginName, password); - nextcloudClient.userId = loginName; // for test same as userId + String userId = loginName; // for test same as userId + String credentials = Credentials.basic(loginName, password); + nextcloudClient = new NextcloudClient(url, userId, credentials, context); testConnection(); } diff --git a/src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationTest.kt b/src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt similarity index 96% rename from src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationTest.kt rename to src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt index 2bad354546..30d9216261 100644 --- a/src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationTest.kt +++ b/src/androidTest/kotlin/com/nextcloud/lib/resources/users/GetActivitiesRemoteOperationIT.kt @@ -30,7 +30,7 @@ import org.junit.Assert.assertTrue import org.junit.Test import java.util.* -class GetActivitiesRemoteOperationTest : AbstractIT() { +class GetActivitiesRemoteOperationIT : AbstractIT() { @Test fun getActivities() { // set-up, create a folder so there is an activity diff --git a/src/main/java/com/nextcloud/common/NextcloudClient.kt b/src/main/java/com/nextcloud/common/NextcloudClient.kt index 2985a82bd9..a4b68ceab8 100644 --- a/src/main/java/com/nextcloud/common/NextcloudClient.kt +++ b/src/main/java/com/nextcloud/common/NextcloudClient.kt @@ -39,7 +39,9 @@ import com.owncloud.android.lib.common.network.RedirectionPath 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 okhttp3.* +import okhttp3.CookieJar +import okhttp3.OkHttpClient +import okhttp3.Request import org.apache.commons.httpclient.HttpStatus import java.io.IOException import java.util.concurrent.TimeUnit @@ -48,12 +50,11 @@ import javax.net.ssl.SSLSession import javax.net.ssl.TrustManager -class NextcloudClient(var baseUri: Uri, val context: Context, client: OkHttpClient) { - lateinit var credentials: String - lateinit var userId: String - lateinit var request: Request - var followRedirects = true; - val client = client +class NextcloudClient(var baseUri: Uri, + var userId: String, + val credentials: String, + val client: OkHttpClient) { + var followRedirects = true companion object { @JvmStatic @@ -74,7 +75,10 @@ class NextcloudClient(var baseUri: Uri, val context: Context, client: OkHttpClie } } - constructor(baseUri: Uri, context: Context) : this(baseUri, context, createDefaultClient(context)) + constructor(baseUri: Uri, + userId: String, + credentials: String, + context: Context) : this(baseUri, userId, credentials, createDefaultClient(context)) fun execute(remoteOperation: RemoteOperation): RemoteOperationResult { return try { @@ -97,10 +101,6 @@ class NextcloudClient(var baseUri: Uri, val context: Context, client: OkHttpClie } } - fun getRequestHeader(name: String): String? { - return request.header(name) - } - @Throws(IOException::class) fun followRedirection(method: OkHttpMethodBase): RedirectionPath { var redirectionsCount = 0 @@ -122,10 +122,10 @@ class NextcloudClient(var baseUri: Uri, val context: Context, client: OkHttpClie // due to it will be set a different url method.releaseConnection() method.uri = location - var destination = getRequestHeader("Destination") + var destination = method.getRequestHeader("Destination") if (destination == null) { - destination = getRequestHeader("destination") + destination = method.getRequestHeader("destination") } if (destination != null) { @@ -136,7 +136,7 @@ class NextcloudClient(var baseUri: Uri, val context: Context, client: OkHttpClie val redirectedDestination = redirectionBase + destinationPath destination = redirectedDestination - if (getRequestHeader("Destination").isNullOrEmpty()) { + if (method.getRequestHeader("Destination").isNullOrEmpty()) { method.addRequestHeader("destination", destination) } else { method.addRequestHeader("Destination", destination) diff --git a/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt b/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt index c596e00266..a7505c6472 100644 --- a/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt +++ b/src/main/java/com/nextcloud/common/OkHttpMethodBase.kt @@ -34,7 +34,6 @@ import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import java.io.IOException -import java.lang.Exception /** * Common base class for all new OkHttpMethods @@ -49,6 +48,7 @@ abstract class OkHttpMethodBase(var uri: String, private var queryMap: Map = HashMap() private val requestHeaders: MutableMap = HashMap() private val requestBuilder: Request.Builder = Request.Builder() + private var request: Request? = null fun OkHttpMethodBase() { requestHeaders.put("http.protocol.single-cookie-header", "true") @@ -111,6 +111,10 @@ abstract class OkHttpMethodBase(var uri: String, return response?.header(name) } + fun getRequestHeader(name: String): String? { + return request?.header(name) ?: "" + } + /** * Execute operation using nextcloud client. * diff --git a/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java b/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java index 0c17ed2fea..597e38ae01 100644 --- a/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java +++ b/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java @@ -166,7 +166,11 @@ public static OwnCloudClient createOwnCloudClient(Uri uri, Context context, bool * @param context Android context where the OwnCloudClient is being created. * @return A OwnCloudClient object ready to be used */ - public static NextcloudClient createNextcloudClient(Uri uri, Context context, boolean followRedirects) { + public static NextcloudClient createNextcloudClient(Uri uri, + String userId, + String credentials, + Context context, + boolean followRedirects) { try { NetworkUtils.registerAdvancedSslContext(true, context); } catch (GeneralSecurityException e) { @@ -178,7 +182,7 @@ public static NextcloudClient createNextcloudClient(Uri uri, Context context, bo " in the system will be used for HTTPS connections", e); } - NextcloudClient client = new NextcloudClient(uri, context); + NextcloudClient client = new NextcloudClient(uri, userId, credentials, context); client.setFollowRedirects(followRedirects); return client; @@ -209,18 +213,18 @@ public static NextcloudClient createNextcloudClient(Account account, Context app // TODO avoid calling to getUserData here String userId = am.getUserData(account, AccountUtils.Constants.KEY_USER_ID); - NextcloudClient client = createNextcloudClient(baseUri, appContext, true); - client.setUserId(userId); String username = AccountUtils.getUsernameForAccount(account); String password = am.blockingGetAuthToken(account, AccountTypeUtils.getAuthTokenTypePass(account.type), false); - client.setCredentials(Credentials.basic(username, password)); - // Restore cookies // TODO v2 cookie handling // AccountUtils.restoreCookies(account, client, appContext); - return client; + return createNextcloudClient(baseUri, + userId, + Credentials.basic(username, password), + appContext, + true); } } diff --git a/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java b/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java index 0d6779791c..ec0570054d 100644 --- a/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java +++ b/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java @@ -193,10 +193,8 @@ public NextcloudClient getNextcloudClientFor(OwnCloudAccount account, Context co } if (client == null) { - // no client to reuse - create a new one - // TODO remove dependency on OwnCloudClientFactory - client = OwnCloudClientFactory.createNextcloudClient(account.getBaseUri(), context.getApplicationContext(), - true); + + // TODO v2 //client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); // enable cookie tracking @@ -204,17 +202,27 @@ public NextcloudClient getNextcloudClientFor(OwnCloudAccount account, Context co //AccountUtils.restoreCookies(accountName, client, context); account.loadCredentials(context); - client.credentials = account.getCredentials().toOkHttpCredentials(); + String credentials = account.getCredentials().toOkHttpCredentials(); AccountManager accountManager = AccountManager.get(context); Account savedAccount = account.getSavedAccount(); + String userId; if (savedAccount != null) { - String userId = accountManager.getUserData(account.getSavedAccount(), + userId = accountManager.getUserData(account.getSavedAccount(), AccountUtils.Constants.KEY_USER_ID); - client.setUserId(userId); + } else { + userId = ""; } + // no client to reuse - create a new one + // TODO remove dependency on OwnCloudClientFactory + client = OwnCloudClientFactory.createNextcloudClient(account.getBaseUri(), + userId, + credentials, + context.getApplicationContext(), + true); + if (accountName != null) { clientsNewWithKnownUsername.put(accountName, client); if (Log.isLoggable(TAG, Log.VERBOSE)) { diff --git a/src/test/java/com/nextcloud/common/NextcloudClientTest.kt b/src/test/java/com/nextcloud/common/NextcloudClientTest.kt index 5a9948c780..c83efe1f04 100644 --- a/src/test/java/com/nextcloud/common/NextcloudClientTest.kt +++ b/src/test/java/com/nextcloud/common/NextcloudClientTest.kt @@ -33,10 +33,7 @@ import com.nhaarman.mockitokotlin2.verify import com.nhaarman.mockitokotlin2.whenever import com.owncloud.android.lib.common.operations.RemoteOperation import com.owncloud.android.lib.common.operations.RemoteOperationResult -import okhttp3.Call -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response +import okhttp3.* import org.junit.Assert.assertNull import org.junit.Assert.assertSame import org.junit.Before @@ -61,7 +58,9 @@ class NextcloudClientTest { @Before fun setUp() { MockitoAnnotations.initMocks(this) - nextcloudClient = NextcloudClient(uri, context, okHttpClient) + val userId = "test" + val credentials = Credentials.basic("login", "test") + nextcloudClient = NextcloudClient(uri, userId, credentials, okHttpClient) } @Test diff --git a/src/test/java/com/nextcloud/common/OkHttpMethodBaseTest.kt b/src/test/java/com/nextcloud/common/OkHttpMethodBaseTest.kt index f1e2699231..6f58b70a38 100644 --- a/src/test/java/com/nextcloud/common/OkHttpMethodBaseTest.kt +++ b/src/test/java/com/nextcloud/common/OkHttpMethodBaseTest.kt @@ -28,8 +28,13 @@ package com.nextcloud.common import android.content.Context import android.net.Uri -import com.nhaarman.mockitokotlin2.* -import okhttp3.* +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.verify +import com.nhaarman.mockitokotlin2.whenever +import okhttp3.Call +import okhttp3.Credentials +import okhttp3.OkHttpClient import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Test @@ -53,8 +58,9 @@ class OkHttpMethodBaseTest { @Before fun setUp() { MockitoAnnotations.initMocks(this) - nextcloudClient = NextcloudClient(uri, context, okHttpClient) - nextcloudClient.credentials = Credentials.basic("username", "password") + val userId = "test" + val credentials = Credentials.basic("username", "password") + nextcloudClient = NextcloudClient(uri, userId, credentials, okHttpClient) } @Test