From 3125c8047c051aec4f7a5ac55234b53f68a4ea8c Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 18 May 2018 12:18:42 +0200 Subject: [PATCH] First propfind using dav4droid and new architecture --- .../lib/sampleclient/MainActivity.java | 38 ++++++--- .../android/lib/refactor/OCContext.java | 3 - .../android/lib/refactor/OwnCloudContext.java | 53 ++++++++++++ .../android/lib/refactor/RemoteOperation.java | 3 +- .../lib/refactor/account/AccountUtils.java | 3 +- .../lib/refactor/account/OCAccount.java | 3 +- .../credentials/OCAnonymousCredentials.java | 10 ++- .../credentials/OCBasicCredentials.java | 10 ++- .../credentials/OCBearerCredentials.java | 10 +-- .../{ => credentials}/OCCredentials.java | 13 ++- .../credentials/OCSamlSsoCredentials.java | 5 +- .../OwnCloudCredentialsFactory.java | 85 +++++++++++++++++++ .../OAuth2RefreshAccessTokenOperation.java | 2 - .../operations/PropfindOperation.java | 31 ++++++- 14 files changed, 220 insertions(+), 49 deletions(-) create mode 100644 src/com/owncloud/android/lib/refactor/OwnCloudContext.java rename src/com/owncloud/android/lib/refactor/authentication/{ => credentials}/OCCredentials.java (90%) create mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java diff --git a/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java b/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java index 6ac5efd8..5b7d1b13 100644 --- a/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java +++ b/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java @@ -35,8 +35,10 @@ import java.util.List; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.OwnCloudClientFactory; import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; +import com.owncloud.android.lib.refactor.authentication.credentials.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; +import com.owncloud.android.lib.refactor.OwnCloudContext; +import com.owncloud.android.lib.refactor.operations.PropfindOperation; import com.owncloud.android.lib.resources.files.RemoteFile; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -64,7 +66,9 @@ public class MainActivity extends Activity implements OnRemoteOperationListener, private Handler mHandler; - private OwnCloudClient mClient; + private OwnCloudClient mClient; + + private OwnCloudContext mOCContext; private FilesArrayAdapter mFilesAdapter; @@ -79,13 +83,21 @@ public class MainActivity extends Activity implements OnRemoteOperationListener, mHandler = new Handler(); Uri serverUri = Uri.parse(getString(R.string.server_base_url)); - mClient = OwnCloudClientFactory.createOwnCloudClient(serverUri, this, true); - mClient.setCredentials( - OwnCloudCredentialsFactory.newBasicCredentials( - getString(R.string.username), - getString(R.string.password) - ) - ); +// mClient = OwnCloudClientFactory.createOwnCloudClient(serverUri, this, true); +// mClient.setCredentials( +// OwnCloudCredentialsFactory.newBasicCredentials( +// getString(R.string.username), +// getString(R.string.password) +// ) +// ); + + mOCContext = new OwnCloudContext.Builder() + .setBaseUri(serverUri) + .setCredentials(OwnCloudCredentialsFactory.newBasicCredentials( + getString(R.string.username), + getString(R.string.password) + )) + .build(); mFilesAdapter = new FilesArrayAdapter(this, R.layout.file_in_list); ((ListView)findViewById(R.id.list_view)).setAdapter(mFilesAdapter); @@ -148,8 +160,12 @@ public class MainActivity extends Activity implements OnRemoteOperationListener, } private void startRefresh() { - ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(FileUtils.PATH_SEPARATOR); - refreshOperation.execute(mClient, this, mHandler); + + PropfindOperation propfindOperation = new PropfindOperation(mOCContext, FileUtils.PATH_SEPARATOR); + + propfindOperation.exec(); +// ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(FileUtils.PATH_SEPARATOR); +// refreshOperation.execute(mClient, this, mHandler); } private void startUpload() { diff --git a/src/com/owncloud/android/lib/refactor/OCContext.java b/src/com/owncloud/android/lib/refactor/OCContext.java index d8d0054c..f3cc216b 100644 --- a/src/com/owncloud/android/lib/refactor/OCContext.java +++ b/src/com/owncloud/android/lib/refactor/OCContext.java @@ -1,9 +1,6 @@ package com.owncloud.android.lib.refactor; -import android.net.Uri; - import com.owncloud.android.lib.refactor.account.OCAccount; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; public class OCContext { diff --git a/src/com/owncloud/android/lib/refactor/OwnCloudContext.java b/src/com/owncloud/android/lib/refactor/OwnCloudContext.java new file mode 100644 index 00000000..008b10e0 --- /dev/null +++ b/src/com/owncloud/android/lib/refactor/OwnCloudContext.java @@ -0,0 +1,53 @@ +package com.owncloud.android.lib.refactor; + +import android.net.Uri; + +import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; + + +public class OwnCloudContext { + private static final String TAG = OwnCloudContext.class.toString(); + + public static final String WEBDAV_PATH_4_0 = "/remote.php/dav"; + public static final String STATUS_PATH = "/status.php"; + public static final String FILES_WEB_PATH = "/index.php/apps/files"; + + private static final int MAX_REDIRECTIONS_COUNT = 3; + private static final int MAX_REPEAT_COUNT_WITH_FRESH_CREDENTIALS = 1; + private static final String PARAM_SINGLE_COOKIE_HEADER = "http.protocol.single-cookie-header"; + private static final boolean PARAM_SINGLE_COOKIE_HEADER_VALUE = true; + private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version"; + + private OCCredentials mCredentials = null; + private Uri mBaseUri; + + public static final class Builder { + OwnCloudContext ocContext = new OwnCloudContext(); + + public Builder setCredentials(OCCredentials credentials) { + ocContext.mCredentials = credentials; + return this; + } + + public Builder setBaseUri(Uri baseUri) { + ocContext.mBaseUri = baseUri; + return this; + } + + public OwnCloudContext build() { + return ocContext; + } + } + + public OCCredentials getCredentials() { + return mCredentials; + } + + public Uri getBaseUri() { + return mBaseUri; + } + + public Uri getWebdavUri() { + return Uri.parse(mBaseUri + WEBDAV_PATH_4_0); + } +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/RemoteOperation.java b/src/com/owncloud/android/lib/refactor/RemoteOperation.java index 4dff64e3..18504069 100644 --- a/src/com/owncloud/android/lib/refactor/RemoteOperation.java +++ b/src/com/owncloud/android/lib/refactor/RemoteOperation.java @@ -1,7 +1,6 @@ package com.owncloud.android.lib.refactor; import android.net.Uri; - import java.util.Map; import okhttp3.OkHttpClient; @@ -57,4 +56,4 @@ public abstract class RemoteOperation { return builder; } -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/account/AccountUtils.java b/src/com/owncloud/android/lib/refactor/account/AccountUtils.java index 833a9bd9..26e2e21e 100644 --- a/src/com/owncloud/android/lib/refactor/account/AccountUtils.java +++ b/src/com/owncloud/android/lib/refactor/account/AccountUtils.java @@ -33,12 +33,11 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.net.Uri; -import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; import com.owncloud.android.lib.refactor.Log_OC; import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; import com.owncloud.android.lib.refactor.authentication.credentials.OCBasicCredentials; import com.owncloud.android.lib.refactor.authentication.credentials.OCBearerCredentials; +import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; import com.owncloud.android.lib.refactor.authentication.credentials.OCSamlSsoCredentials; import com.owncloud.android.lib.refactor.exceptions.AccountNotFoundException; import com.owncloud.android.lib.resources.status.OwnCloudVersion; diff --git a/src/com/owncloud/android/lib/refactor/account/OCAccount.java b/src/com/owncloud/android/lib/refactor/account/OCAccount.java index 4349547d..bd40521c 100644 --- a/src/com/owncloud/android/lib/refactor/account/OCAccount.java +++ b/src/com/owncloud/android/lib/refactor/account/OCAccount.java @@ -24,7 +24,6 @@ package com.owncloud.android.lib.refactor.account; - import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; @@ -32,8 +31,8 @@ import android.accounts.OperationCanceledException; import android.content.Context; import android.net.Uri; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; import com.owncloud.android.lib.refactor.authentication.credentials.OCAnonymousCredentials; +import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; import com.owncloud.android.lib.refactor.exceptions.AccountNotFoundException; import java.io.IOException; diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java index 990415ba..fa0d04c5 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java @@ -1,8 +1,5 @@ package com.owncloud.android.lib.refactor.authentication.credentials; - -import com.owncloud.android.lib.refactor.authentication.OCCredentials; - import java.util.HashMap; import java.util.Map; public class OCAnonymousCredentials implements OCCredentials { @@ -12,6 +9,11 @@ public class OCAnonymousCredentials implements OCCredentials { return new HashMap<>(0); } + @Override + public String getCredentialCookie() { + return null; + } + @Override public String getUsername() { return ""; @@ -26,4 +28,4 @@ public class OCAnonymousCredentials implements OCCredentials { public boolean authTokenCanBeRefreshed() { return false; } -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java index ea00d184..abb2b27b 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java @@ -23,8 +23,6 @@ */ package com.owncloud.android.lib.refactor.authentication.credentials; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; - import java.util.HashMap; import java.util.Map; @@ -47,6 +45,11 @@ public class OCBasicCredentials implements OCCredentials { return header; } + @Override + public String getCredentialCookie() { + return null; + } + @Override public String getUsername() { return mUsername; @@ -61,5 +64,4 @@ public class OCBasicCredentials implements OCCredentials { public boolean authTokenCanBeRefreshed() { return false; } - -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java index bd427738..92f35689 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java @@ -23,17 +23,12 @@ */ package com.owncloud.android.lib.refactor.authentication.credentials; - - -import com.owncloud.android.lib.refactor.authentication.OCCredentials; - import java.util.HashMap; import java.util.Map; public class OCBearerCredentials implements OCCredentials { private String mUsername; - private String mAccessToken; public OCBearerCredentials(String username, String accessToken) { @@ -48,6 +43,11 @@ public class OCBearerCredentials implements OCCredentials { return header; } + @Override + public String getCredentialCookie() { + return null; + } + @Override public String getUsername() { // not relevant for authentication, but relevant for informational purposes diff --git a/src/com/owncloud/android/lib/refactor/authentication/OCCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java similarity index 90% rename from src/com/owncloud/android/lib/refactor/authentication/OCCredentials.java rename to src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java index e4411b76..63ff805b 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/OCCredentials.java +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java @@ -22,23 +22,20 @@ * */ -package com.owncloud.android.lib.refactor.authentication; +package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.HashMap; import java.util.Map; - public interface OCCredentials { Map getCredentialHeaders(); //TODO: Remove this once SAML is obsolet - default String getCredentialCookie() { - return null; - } + String getCredentialCookie(); String getUsername(); + String getAuthToken(); + boolean authTokenCanBeRefreshed(); -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java index 47ca012a..b974a79c 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java @@ -25,10 +25,7 @@ package com.owncloud.android.lib.refactor.authentication.credentials; import android.net.Uri; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; - import org.apache.commons.httpclient.Cookie; - import java.util.HashMap; import java.util.Map; @@ -85,4 +82,4 @@ public class OCSamlSsoCredentials implements OCCredentials { return false; } -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java new file mode 100644 index 00000000..3bcc1ef6 --- /dev/null +++ b/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java @@ -0,0 +1,85 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2016 ownCloud 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.refactor.authentication.credentials; + +import java.util.Map; + +public class OwnCloudCredentialsFactory { + + public static final String CREDENTIAL_CHARSET = "UTF-8"; + + private static OCAnonymousCredentials sAnonymousCredentials; + + public static OCCredentials newBasicCredentials(String username, String password) { + return new OCBasicCredentials(username, password); + } + + public static OCCredentials newBearerCredentials(String username, String authToken) { + return new OCBearerCredentials(username, authToken); + } + + public static OCCredentials newSamlSsoCredentials(String username, String sessionCookie) { + return new OCSamlSsoCredentials(username, sessionCookie, null); + } + + public static final OCCredentials getAnonymousCredentials() { + if (sAnonymousCredentials == null) { + sAnonymousCredentials = new OCAnonymousCredentials(); + } + return sAnonymousCredentials; + } + + public static final class OCAnonymousCredentials implements OCCredentials { + + protected OCAnonymousCredentials() { + } + + @Override + public String getAuthToken() { + return ""; + } + + @Override + public boolean authTokenCanBeRefreshed() { + return false; + } + + @Override + public Map getCredentialHeaders() { + return null; + } + + @Override + public String getCredentialCookie() { + return null; + } + + @Override + public String getUsername() { + // no user name + return null; + } + } +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java index 780ec71d..78e67e47 100644 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java +++ b/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java @@ -25,8 +25,6 @@ import com.owncloud.android.lib.refactor.OCContext; import com.owncloud.android.lib.refactor.RemoteOperationResult; import com.owncloud.android.lib.refactor.Log_OC; import com.owncloud.android.lib.refactor.RemoteOperation; -import com.owncloud.android.lib.refactor.authentication.credentials.OCBasicCredentials; -import com.owncloud.android.lib.refactor.authentication.OCCredentials; import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2Constants; import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2GrantType; import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2ResponseParser; diff --git a/src/com/owncloud/android/lib/refactor/operations/PropfindOperation.java b/src/com/owncloud/android/lib/refactor/operations/PropfindOperation.java index 5a48b76b..f07f1337 100644 --- a/src/com/owncloud/android/lib/refactor/operations/PropfindOperation.java +++ b/src/com/owncloud/android/lib/refactor/operations/PropfindOperation.java @@ -1,19 +1,46 @@ package com.owncloud.android.lib.refactor.operations; import com.owncloud.android.lib.refactor.OCContext; +import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.refactor.RemoteOperation; import com.owncloud.android.lib.refactor.RemoteOperationResult; +import java.io.IOException; + +import at.bitfire.dav4android.DavResource; +import at.bitfire.dav4android.exception.DavException; +import at.bitfire.dav4android.exception.HttpException; +import at.bitfire.dav4android.property.DisplayName; +import okhttp3.HttpUrl; public class PropfindOperation extends RemoteOperation { - public PropfindOperation(OCContext context) { + private String mRemotePath; + + public PropfindOperation(OCContext context, String remotePath) { super(context); + + mRemotePath = remotePath; } @Override public RemoteOperationResult exec() { + DavResource davResource = new DavResource( + getClient(), + HttpUrl.parse(getOCContext().getWebdavUri() + WebdavUtils.encodePath(mRemotePath)), + null); + try { + davResource.propfind(1, DisplayName.NAME); + } catch (IOException e) { + e.printStackTrace(); + } catch (HttpException e) { + e.printStackTrace(); + } catch (DavException e) { + e.printStackTrace(); + } + + davResource.getProperties(); return null; } -} +} \ No newline at end of file