diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/src/com/owncloud/android/lib/common/OwnCloudClient.java index f9ed3e00..10e46fd5 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClient.java @@ -33,6 +33,7 @@ import android.net.Uri; 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; +import com.owncloud.android.lib.common.methods.HttpBaseMethod; import com.owncloud.android.lib.common.network.RedirectionPath; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.status.OwnCloudVersion; @@ -49,7 +50,6 @@ import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.URIException; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.params.HttpParams; -import com.owncloud.android.lib.common.methods.HttpBaseMethod; import java.io.IOException; import java.io.InputStream; @@ -61,6 +61,7 @@ import okhttp3.Protocol; public class OwnCloudClient extends HttpClient { public static final String WEBDAV_PATH_4_0 = "/remote.php/webdav"; + public static final String NEW_WEBDAV_PATH_4_0 = "/remote.php/dav/files/"; public static final String STATUS_PATH = "/status.php"; public static final String FILES_WEB_PATH = "/index.php/apps/files"; @@ -299,7 +300,19 @@ public class OwnCloudClient extends HttpClient { } public int executeHttpMethod (HttpBaseMethod method) throws Exception { - int status = method.execute(); + + boolean repeatWithFreshCredentials = false; + int repeatCounter = 0; + int status; + + do { + status = method.execute(); + repeatWithFreshCredentials = checkUnauthorizedAccess(status, repeatCounter); + if (repeatWithFreshCredentials) { + repeatCounter++; + } + } while (repeatWithFreshCredentials); + return status; } @@ -432,6 +445,10 @@ public class OwnCloudClient extends HttpClient { return Uri.parse(mBaseUri + WEBDAV_PATH_4_0); } + public Uri getNewWebDavUri() { + return Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0 + mCredentials.getUsername()); + } + /** * Sets the root URI to the ownCloud server. * diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java b/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java index 6897b8c8..2e851762 100644 --- a/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java +++ b/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java @@ -58,7 +58,7 @@ public class OwnCloudBasicCredentials implements OwnCloudCredentials { public void applyTo(OwnCloudClient client) { AuthPolicy.registerAuthScheme(AuthState.PREEMPTIVE_AUTH_SCHEME, BasicScheme.class); - List authPrefs = new ArrayList(1); + List authPrefs = new ArrayList<>(1); authPrefs.add(AuthPolicy.BASIC); client.getOkHttpClient().newBuilder() diff --git a/src/com/owncloud/android/lib/common/methods/DavMethod.java b/src/com/owncloud/android/lib/common/methods/DavMethod.java index 517650c8..e7a092e6 100644 --- a/src/com/owncloud/android/lib/common/methods/DavMethod.java +++ b/src/com/owncloud/android/lib/common/methods/DavMethod.java @@ -1,7 +1,5 @@ package com.owncloud.android.lib.common.methods; -import java.io.IOException; - import at.bitfire.dav4android.DavResource; public abstract class DavMethod implements HttpBaseMethod { diff --git a/src/com/owncloud/android/lib/common/methods/HttpBaseMethod.java b/src/com/owncloud/android/lib/common/methods/HttpBaseMethod.java index 01a9ced3..c153d086 100644 --- a/src/com/owncloud/android/lib/common/methods/HttpBaseMethod.java +++ b/src/com/owncloud/android/lib/common/methods/HttpBaseMethod.java @@ -1,6 +1,5 @@ package com.owncloud.android.lib.common.methods; public interface HttpBaseMethod { - int execute() throws Exception; } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/methods/PropfindMethod.java b/src/com/owncloud/android/lib/common/methods/PropfindMethod.java index 2b1b1aa3..eac3f88d 100644 --- a/src/com/owncloud/android/lib/common/methods/PropfindMethod.java +++ b/src/com/owncloud/android/lib/common/methods/PropfindMethod.java @@ -6,6 +6,7 @@ import at.bitfire.dav4android.DavResource; import at.bitfire.dav4android.PropertyUtils; import at.bitfire.dav4android.exception.DavException; import at.bitfire.dav4android.exception.HttpException; +import at.bitfire.dav4android.exception.UnauthorizedException; public class PropfindMethod extends DavMethod { @@ -16,8 +17,12 @@ public class PropfindMethod extends DavMethod { mDepth = depth; }; - public int execute() throws DavException, IOException, HttpException { - mDavResource.propfind(mDepth, PropertyUtils.INSTANCE.getAllPropSet()); + public int execute() throws IOException, HttpException, DavException { + try { + mDavResource.propfind(mDepth, PropertyUtils.INSTANCE.getAllPropSet()); + } catch (UnauthorizedException davException) { + return 401; + } return mDavResource.getResponse().code(); } -} +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 56722fe5..a8b14cde 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -206,7 +206,6 @@ public class RemoteOperationResult implements Serializable { } else { mCode = ResultCode.UNKNOWN_ERROR; } - } /** diff --git a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java b/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java index 40ebba29..dc812c50 100644 --- a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java @@ -76,14 +76,13 @@ public class ReadRemoteFolderOperation extends RemoteOperation { try { - final HttpUrl location = HttpUrl.parse(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath)); + final HttpUrl location = HttpUrl.parse(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)); DavOCResource davOCResource = new DavOCResource(client.getOkHttpClient(), location); PropfindMethod propfindMethod = new PropfindMethod(davOCResource, 1); int status = client.executeHttpMethod(propfindMethod); // TODO Refactor from here down - // remote request // query = new PropFindMethod(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath), // WebdavUtils.getAllPropSet(), // PropFind Properties @@ -113,8 +112,6 @@ public class ReadRemoteFolderOperation extends RemoteOperation { } catch (Exception e) { result = new RemoteOperationResult(e); - - } finally { if (query != null) query.releaseConnection(); // let the connection available for other methods @@ -150,14 +147,14 @@ public class ReadRemoteFolderOperation extends RemoteOperation { // parse data from remote folder WebdavEntry we = new WebdavEntry(remoteData.getResponses()[0], - client.getWebdavUri().getPath()); + client.getNewWebDavUri().getPath()); mFolderAndFiles.add(fillOCFile(we)); // loop to update every child RemoteFile remoteFile = null; for (int i = 1; i < remoteData.getResponses().length; ++i) { /// new OCFile instance with the data from the server - we = new WebdavEntry(remoteData.getResponses()[i], client.getWebdavUri().getPath()); + we = new WebdavEntry(remoteData.getResponses()[i], client.getNewWebDavUri().getPath()); remoteFile = fillOCFile(we); mFolderAndFiles.add(remoteFile); }