From 2c5ceeb555778e0bcc62abf6c6c79396e4533807 Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 7 Nov 2018 14:31:03 +0100 Subject: [PATCH] Use user id in LDAP requests --- .../android/lib/common/OwnCloudClient.java | 32 ++++++++++++------- .../lib/common/accounts/AccountUtils.java | 19 +++++++++-- .../files/CopyRemoteFileOperation.java | 4 +-- .../files/CreateRemoteFolderOperation.java | 2 +- .../files/DownloadRemoteFileOperation.java | 2 +- .../files/ExistenceCheckRemoteOperation.java | 18 +++++++---- .../files/MoveRemoteFileOperation.java | 4 +-- .../files/ReadRemoteFileOperation.java | 2 +- .../files/ReadRemoteFolderOperation.java | 2 +- .../lib/resources/files/RemoteFile.java | 4 +-- .../files/RemoveRemoteFileOperation.java | 2 +- .../files/RenameRemoteFileOperation.java | 6 ++-- .../files/UploadRemoteFileOperation.java | 2 +- .../ChunkedUploadRemoteFileOperation.java | 2 +- .../users/GetRemoteUserQuotaOperation.java | 2 +- 15 files changed, 67 insertions(+), 36 deletions(-) diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/src/com/owncloud/android/lib/common/OwnCloudClient.java index 842f445f..6dd69f0e 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClient.java @@ -29,6 +29,7 @@ import android.accounts.AccountManager; import android.accounts.AccountsException; import android.net.Uri; +import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory.OwnCloudAnonymousCredentials; @@ -53,8 +54,8 @@ import static com.owncloud.android.lib.common.http.HttpConstants.OC_X_REQUEST_ID public class OwnCloudClient extends HttpClient { - public static final String NEW_WEBDAV_FILES_PATH_4_0 = "/remote.php/dav/files/"; - public static final String NEW_WEBDAV_UPLOADS_PATH_4_0 = "/remote.php/dav/uploads/"; + public static final String WEBDAV_FILES_PATH_4_0 = "/remote.php/dav/files/"; + public static final String WEBDAV_UPLOADS_PATH_4_0 = "/remote.php/dav/uploads/"; public static final String STATUS_PATH = "/status.php"; public static final String FILES_WEB_PATH = "/index.php/apps/files"; @@ -80,7 +81,6 @@ public class OwnCloudClient extends HttpClient { private String mRedirectedLocation; private boolean mFollowRedirects; - public OwnCloudClient(Uri baseUri) { if (baseUri == null) { throw new IllegalArgumentException("Parameter 'baseUri' cannot be NULL"); @@ -208,7 +208,7 @@ public class OwnCloudClient extends HttpClient { : method.getRequestHeader("destination"); if (destination != null) { - final int suffixIndex = location.lastIndexOf(getNewFilesWebDavUri().toString()); + final int suffixIndex = location.lastIndexOf(getUserFilesWebDavUri().toString()); final String redirectionBase = location.substring(0, suffixIndex); final String destinationPath = destination.substring(mBaseUri.toString().length()); @@ -252,16 +252,26 @@ public class OwnCloudClient extends HttpClient { } } - public Uri getNewFilesWebDavUri() { - return mCredentials instanceof OwnCloudAnonymousCredentials - ? Uri.parse(mBaseUri + NEW_WEBDAV_FILES_PATH_4_0) - : Uri.parse(mBaseUri + NEW_WEBDAV_FILES_PATH_4_0 + mCredentials.getUsername()); + public Uri getBaseFilesWebDavUri(){ + return Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0); } - public Uri getNewUploadsWebDavUri() { + public Uri getUserFilesWebDavUri() { return mCredentials instanceof OwnCloudAnonymousCredentials - ? Uri.parse(mBaseUri + NEW_WEBDAV_UPLOADS_PATH_4_0) - : Uri.parse(mBaseUri + NEW_WEBDAV_UPLOADS_PATH_4_0 + mCredentials.getUsername()); + ? Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0) + : Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0 + AccountUtils.getUserId( + mAccount.getSavedAccount(), getContext() + ) + ); + } + + public Uri getUploadsWebDavUri() { + return mCredentials instanceof OwnCloudAnonymousCredentials + ? Uri.parse(mBaseUri + WEBDAV_UPLOADS_PATH_4_0) + : Uri.parse(mBaseUri + WEBDAV_UPLOADS_PATH_4_0 + AccountUtils.getUserId( + mAccount.getSavedAccount(), getContext() + ) + ); } /** diff --git a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java index 0b0f7ab9..aa62cb45 100644 --- a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java +++ b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java @@ -64,7 +64,7 @@ public class AccountUtils { try { OwnCloudCredentials ownCloudCredentials = getCredentialsForAccount(context, account); - webDavUrlForAccount = getBaseUrlForAccount(context, account) + OwnCloudClient.NEW_WEBDAV_FILES_PATH_4_0 + webDavUrlForAccount = getBaseUrlForAccount(context, account) + OwnCloudClient.WEBDAV_FILES_PATH_4_0 + ownCloudCredentials.getUsername(); } catch (OperationCanceledException e) { e.printStackTrace(); @@ -188,6 +188,16 @@ public class AccountUtils { return credentials; } + /** + * Get the user id corresponding OC account. + * @param account ownCloud account + * @return user id + */ + public static String getUserId(Account account, Context context) { + AccountManager accountMgr = AccountManager.get(context); + return accountMgr.getUserData(account, Constants.KEY_ID); + } + public static String buildAccountNameOld(Uri serverBaseUrl, String username) { if (serverBaseUrl.getScheme() == null) { serverBaseUrl = Uri.parse("https://" + serverBaseUrl.toString()); @@ -244,7 +254,7 @@ public class AccountUtils { // Account Manager AccountManager am = AccountManager.get(context.getApplicationContext()); - Uri serverUri = (client.getBaseUri() != null) ? client.getBaseUri() : client.getNewFilesWebDavUri(); + Uri serverUri = (client.getBaseUri() != null) ? client.getBaseUri() : client.getUserFilesWebDavUri(); String cookiesString = am.getUserData(account, Constants.KEY_COOKIES); if (cookiesString != null) { @@ -318,6 +328,11 @@ public class AccountUtils { */ public static final String KEY_OC_ACCOUNT_VERSION = "oc_account_version"; + /** + * User's id + */ + public static final String KEY_ID = "oc_id"; + /** * User's display name */ diff --git a/src/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.java index f01c0644..4d9a9147 100644 --- a/src/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/CopyRemoteFileOperation.java @@ -103,8 +103,8 @@ public class CopyRemoteFileOperation extends RemoteOperation { /// perform remote operation RemoteOperationResult result = null; try { - CopyMethod copyMethod = new CopyMethod(new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mSrcRemotePath)), - client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), + CopyMethod copyMethod = new CopyMethod(new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mSrcRemotePath)), + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), mOverwrite); copyMethod.setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS); diff --git a/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java b/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java index 31a6555d..6eb7947d 100644 --- a/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java +++ b/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java @@ -100,7 +100,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation { private RemoteOperationResult createFolder(OwnCloudClient client) { RemoteOperationResult result; try { - Uri webDavUri = createChunksFolder ? client.getNewUploadsWebDavUri() : client.getNewFilesWebDavUri(); + Uri webDavUri = createChunksFolder ? client.getUploadsWebDavUri() : client.getUserFilesWebDavUri(); final MkColMethod mkcol = new MkColMethod(new URL(webDavUri + WebdavUtils.encodePath(mRemotePath))); mkcol.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS); mkcol.setConnectionTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS); diff --git a/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java index 54e637cd..b9f35633 100644 --- a/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java @@ -101,7 +101,7 @@ public class DownloadRemoteFileOperation extends RemoteOperation { RemoteOperationResult result; int status; boolean savedFile = false; - mGet = new GetMethod(new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath))); + mGet = new GetMethod(new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath))); Iterator it; FileOutputStream fos = null; diff --git a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java index 3de48b46..71d8060b 100644 --- a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java @@ -56,6 +56,7 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { private String mPath; private boolean mSuccessIfAbsent; + private boolean mIsLogin; /** * Sequence of redirections followed. Available only after executing the operation @@ -68,10 +69,13 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { * @param remotePath Path to append to the URL owned by the client instance. * @param successIfAbsent When 'true', the operation finishes in success if the path does * NOT exist in the remote server (HTTP 404). + * @param isLogin When `true`, the username won't be added at the end of the PROPFIND url since is not + * needed to check user credentials */ - public ExistenceCheckRemoteOperation(String remotePath, boolean successIfAbsent) { + public ExistenceCheckRemoteOperation(String remotePath, boolean successIfAbsent, boolean isLogin) { mPath = (remotePath != null) ? remotePath : ""; mSuccessIfAbsent = successIfAbsent; + mIsLogin = isLogin; } @Override @@ -80,8 +84,11 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { boolean previousFollowRedirects = client.followRedirects(); try { + String stringUrl = mIsLogin ? + client.getBaseFilesWebDavUri().toString() : + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mPath); PropfindMethod propfindMethod = new PropfindMethod( - new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mPath)), + new URL(stringUrl), 0, DavUtils.getAllPropset() ); @@ -102,9 +109,8 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { * 207 MULTI_STATUS: path exists. */ - Log_OC.d(TAG, "Existence check for " + client.getNewFilesWebDavUri() + - WebdavUtils.encodePath(mPath) + " targeting for " + - (mSuccessIfAbsent ? " absence " : " existence ") + + Log_OC.d(TAG, "Existence check for " + stringUrl + WebdavUtils.encodePath(mPath) + + " targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + "finished with HTTP status " + status + (!isSuccess(status) ? "(FAIL)" : "")); return isSuccess(status) @@ -113,7 +119,7 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation { } catch (Exception e) { final RemoteOperationResult result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Existence check for " + client.getNewFilesWebDavUri() + + Log_OC.e(TAG, "Existence check for " + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mPath) + " targeting for " + (mSuccessIfAbsent ? " absence " : " existence ") + ": " + result.getLogMessage(), result.getException()); diff --git a/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java index 9673ee95..f2cda2fa 100644 --- a/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java @@ -111,11 +111,11 @@ public class MoveRemoteFileOperation extends RemoteOperation { try { // After finishing a chunked upload, we have to move the resulting file from uploads folder to files one, // so this uri has to be customizable - Uri srcWebDavUri = moveChunkedFile ? client.getNewUploadsWebDavUri() : client.getNewFilesWebDavUri(); + Uri srcWebDavUri = moveChunkedFile ? client.getUploadsWebDavUri() : client.getUserFilesWebDavUri(); final MoveMethod move = new MoveMethod( new URL(srcWebDavUri + WebdavUtils.encodePath(mSrcRemotePath)), - client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), mOverwrite); if (moveChunkedFile) { diff --git a/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java index 0680ba26..a40bbbad 100644 --- a/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java @@ -75,7 +75,7 @@ public class ReadRemoteFileOperation extends RemoteOperation { /// take the duty of check the server for the current state of the file there try { // remote request - propfind = new PropfindMethod(new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)), + propfind = new PropfindMethod(new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath)), DEPTH_0, DavUtils.getAllPropset()); diff --git a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java b/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java index f80e68cb..815ad552 100644 --- a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java @@ -75,7 +75,7 @@ public class ReadRemoteFolderOperation extends RemoteOperation(ResultCode.INVALID_OVERWRITE); } - final MoveMethod move = new MoveMethod(new URL(client.getNewFilesWebDavUri() + + final MoveMethod move = new MoveMethod(new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mOldRemotePath)), - client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mNewRemotePath), false); + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mNewRemotePath), false); move.setReadTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS); move.setConnectionTimeout(RENAME_READ_TIMEOUT, TimeUnit.SECONDS); @@ -138,7 +138,7 @@ public class RenameRemoteFileOperation extends RemoteOperation { */ private boolean targetPathIsUsed(OwnCloudClient client) { ExistenceCheckRemoteOperation existenceCheckRemoteOperation = - new ExistenceCheckRemoteOperation(mNewRemotePath, false); + new ExistenceCheckRemoteOperation(mNewRemotePath, false, false); RemoteOperationResult exists = existenceCheckRemoteOperation.run(client); return exists.isSuccess(); } diff --git a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java index faa18222..4f6bae81 100644 --- a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java @@ -89,7 +89,7 @@ public class UploadRemoteFileOperation extends RemoteOperation { try { mPutMethod = new PutMethod( - new URL(client.getNewFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath))); + new URL(client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mRemotePath))); mPutMethod.setRetryOnConnectionFailure(false); diff --git a/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java index ac1df185..0b6239c9 100644 --- a/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java @@ -84,7 +84,7 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation } long offset = 0; - String uriPrefix = client.getNewUploadsWebDavUri() + FileUtils.PATH_SEPARATOR + String.valueOf(mTransferId); + String uriPrefix = client.getUploadsWebDavUri() + FileUtils.PATH_SEPARATOR + String.valueOf(mTransferId); long totalLength = fileToUpload.length(); long chunkCount = (long) Math.ceil((double) totalLength / CHUNK_SIZE); diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java index e48b1eed..d856be15 100644 --- a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java +++ b/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java @@ -89,7 +89,7 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation