1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-08 00:16:09 +00:00

Working on authentication operations

This commit is contained in:
davigonz 2018-06-05 16:28:28 +02:00
parent 4f0cd82a7d
commit dfab453e6b
9 changed files with 284 additions and 178 deletions

View File

@ -77,7 +77,6 @@ public class OwnCloudClient extends HttpClient {
private static byte[] sExhaustBuffer = new byte[1024]; private static byte[] sExhaustBuffer = new byte[1024];
private static int sIntanceCounter = 0; private static int sIntanceCounter = 0;
private boolean mFollowRedirects = true;
private OwnCloudCredentials mCredentials = null; private OwnCloudCredentials mCredentials = null;
private int mInstanceNumber = 0; private int mInstanceNumber = 0;
@ -292,7 +291,7 @@ public class OwnCloudClient extends HttpClient {
checkFirstRedirection(method); checkFirstRedirection(method);
if (mFollowRedirects) { if (mOkHttpClient.followRedirects()) {
status = followRedirection(method).getLastStatus(); status = followRedirection(method).getLastStatus();
} }
@ -312,7 +311,7 @@ public class OwnCloudClient extends HttpClient {
public int executeHttpMethod (HttpBaseMethod method) throws Exception { public int executeHttpMethod (HttpBaseMethod method) throws Exception {
boolean repeatWithFreshCredentials = false; boolean repeatWithFreshCredentials;
int repeatCounter = 0; int repeatCounter = 0;
int status; int status;
@ -457,7 +456,9 @@ public class OwnCloudClient extends HttpClient {
} }
public Uri getNewWebDavUri() { public Uri getNewWebDavUri() {
return Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0 + mCredentials.getUsername()); return !(mCredentials instanceof OwnCloudAnonymousCredentials)
? Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0)
: Uri.parse(mBaseUri + NEW_WEBDAV_PATH_4_0 + mCredentials.getUsername());
} }
/** /**
@ -483,11 +484,15 @@ public class OwnCloudClient extends HttpClient {
} }
public void setFollowRedirects(boolean followRedirects) { public void setFollowRedirects(boolean followRedirects) {
mFollowRedirects = followRedirects; mOkHttpClient
.newBuilder()
.followRedirects(followRedirects)
.followSslRedirects(followRedirects)
.build();
} }
public boolean getFollowRedirects() { public boolean getFollowRedirects() {
return mFollowRedirects; return mOkHttpClient.followRedirects();
} }
private void logCookiesAtRequest(Header[] headers, String when) { private void logCookiesAtRequest(Header[] headers, String when) {

View File

@ -0,0 +1,26 @@
package com.owncloud.android.lib.common.methods.nonwebdav;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class GetMethod extends HttpMethod {
public GetMethod(OkHttpClient okHttpClient, String url) {
super(okHttpClient, url);
}
@Override
public int execute() throws IOException {
final Request request =
new Request.Builder()
.url(mUrl)
.get()
.build();
Response response = mOkHttpClient.newCall(request).execute();
return response.code();
}
}

View File

@ -0,0 +1,16 @@
package com.owncloud.android.lib.common.methods.nonwebdav;
import com.owncloud.android.lib.common.methods.HttpBaseMethod;
import okhttp3.OkHttpClient;
public abstract class HttpMethod implements HttpBaseMethod {
protected OkHttpClient mOkHttpClient;
protected String mUrl;
public HttpMethod (OkHttpClient okHttpClient, String url) {
mOkHttpClient = okHttpClient;
mUrl = url;
}
}

View File

@ -1,4 +1,6 @@
package com.owncloud.android.lib.common.methods; package com.owncloud.android.lib.common.methods.webdav;
import com.owncloud.android.lib.common.methods.HttpBaseMethod;
import at.bitfire.dav4android.DavResource; import at.bitfire.dav4android.DavResource;

View File

@ -1,4 +1,4 @@
package com.owncloud.android.lib.common.methods; package com.owncloud.android.lib.common.methods.webdav;
import java.io.IOException; import java.io.IOException;

View File

@ -24,6 +24,20 @@
package com.owncloud.android.lib.common.operations; package com.owncloud.android.lib.common.operations;
import android.accounts.Account;
import android.accounts.AccountsException;
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.utils.Log_OC;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.DavException;
import org.json.JSONException;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -34,24 +48,15 @@ import java.net.SocketException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import android.accounts.Account; import java.util.Map;
import android.accounts.AccountsException;
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.utils.Log_OC;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.DavException;
import org.json.JSONException;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.Response;
/** /**
* The result of a remote operation required to an ownCloud server. * The result of a remote operation required to an ownCloud server.
@ -222,12 +227,12 @@ public class RemoteOperationResult implements Serializable {
* result. * result.
*/ */
public RemoteOperationResult(boolean success, HttpMethod httpMethod) throws IOException { public RemoteOperationResult(boolean success, HttpMethod httpMethod) throws IOException {
this( // this(
success, // success,
httpMethod.getStatusCode(), // httpMethod.getStatusCode(),
httpMethod.getStatusText(), // httpMethod.getStatusText(),
httpMethod.getResponseHeaders() // httpMethod.getResponseHeaders()
); // );
if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400 if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400
@ -265,6 +270,63 @@ public class RemoteOperationResult implements Serializable {
} }
} }
/**
* Public constructor from separate elements of an HTTP or DAV response.
*
* To be used when the result needs to be interpreted from the response of an HTTP/DAV method.
*
* Determines a {@link ResultCode} from the already executed method received as a parameter. Generally,
* will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the
* response body
*
* @param success
* @param request
* @param response
* @throws IOException
*/
public RemoteOperationResult(boolean success, Request request, Response response) throws IOException {
this(success, response.code(), HttpStatus.getStatusText(response.code()), response.headers());
// TODO success parameter might not be needed
if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400
String bodyResponse = response.body().string();
// do not get for other HTTP codes!; could not be available
if (bodyResponse != null && bodyResponse.length() > 0) {
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
try {
if (xmlParser.parseXMLResponse(is)) {
mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER;
}
} catch (Exception e) {
Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage());
// mCode stays as set in this(success, httpCode, headers)
}
}
}
// before
switch (mHttpCode) {
case HttpStatus.SC_FORBIDDEN:
// TODO
// parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_FORBIDDEN);
break;
case HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE:
// TODO
// parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_UNSUPPORTED_MEDIA_TYPE);
break;
case HttpStatus.SC_SERVICE_UNAVAILABLE:
// TODO
// parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_SERVICE_UNAVAILABLE);
break;
default:
break;
}
}
/** /**
* Parse the error message included in the body response, if any, and set the specific result * Parse the error message included in the body response, if any, and set the specific result
* code * code
@ -308,25 +370,61 @@ public class RemoteOperationResult implements Serializable {
* @param success The operation was considered successful or not. * @param success The operation was considered successful or not.
* @param httpCode HTTP status code returned by an HTTP/DAV method. * @param httpCode HTTP status code returned by an HTTP/DAV method.
* @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method * @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method
* @param httpHeaders HTTP response header returned by an HTTP/DAV method * @param headers HTTP response header returned by an HTTP/DAV method
*/ */
public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Header[] httpHeaders) { public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Headers headers) {
this(success, httpCode, httpPhrase); this(success, httpCode, httpPhrase);
if (httpHeaders != null) { if (headers != null) {
for (Header httpHeader : httpHeaders) { for (Map.Entry<String, List<String>> header : headers.toMultimap().entrySet()) {
if ("location".equals(httpHeader.getName().toLowerCase())) { if ("location".equals(header.getKey().toLowerCase())) {
mRedirectedLocation = httpHeader.getValue(); mRedirectedLocation = header.getValue().get(0);
continue; continue;
} }
if ("www-authenticate".equals(httpHeader.getName().toLowerCase())) { if ("www-authenticate".equals(header.getKey().toLowerCase())) {
mAuthenticate.add(httpHeader.getValue().toLowerCase()); mAuthenticate.add(header.getValue().get(0).toLowerCase());
} }
} }
} }
if (isIdPRedirection()) { if (isIdPRedirection()) {
mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN // overrides default ResultCode.UNKNOWN
mCode = com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.UNAUTHORIZED;
} }
} }
//
// /**
// * Public constructor from separate elements of an HTTP or DAV response.
// *
// * To be used when the result needs to be interpreted from HTTP response elements that could come from
// * different requests (WARNING: black magic, try to avoid).
// *
// * If all the fields come from the same HTTP/DAV response, {@link #RemoteOperationResult(boolean, HttpMethod)}
// * should be used instead.
// *
// * Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received.
// *
// * @param success The operation was considered successful or not.
// * @param httpCode HTTP status code returned by an HTTP/DAV method.
// * @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method
// * @param httpHeaders HTTP response header returned by an HTTP/DAV method
// */
// public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Header[] httpHeaders) {
// this(success, httpCode, httpPhrase);
// if (httpHeaders != null) {
// for (Header httpHeader : httpHeaders) {
// if ("location".equals(httpHeader.getName().toLowerCase())) {
// mRedirectedLocation = httpHeader.getValue();
// continue;
// }
// if ("www-authenticate".equals(httpHeader.getName().toLowerCase())) {
// mAuthenticate.add(httpHeader.getValue().toLowerCase());
// }
// }
// }
// if (isIdPRedirection()) {
// // overrides default ResultCode.UNKNOWN
// mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN
// }
// }
/** /**
* Private constructor for results built interpreting a HTTP or DAV response. * Private constructor for results built interpreting a HTTP or DAV response.

View File

@ -25,18 +25,20 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
import android.content.Context;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.methods.webdav.PropfindMethod;
import com.owncloud.android.lib.common.network.RedirectionPath; import com.owncloud.android.lib.common.network.RedirectionPath;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import at.bitfire.dav4android.DavOCResource;
import okhttp3.HttpUrl;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
/** /**
* Operation to check the existence or absence of a path in a remote server. * Operation to check the existence or absence of a path in a remote server.
* *
@ -57,8 +59,6 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
/** Sequence of redirections followed. Available only after executing the operation */ /** Sequence of redirections followed. Available only after executing the operation */
private RedirectionPath mRedirectionPath = null; private RedirectionPath mRedirectionPath = null;
// TODO move to {@link RemoteOperation}, that needs a nice refactoring
/** /**
* Full constructor. Success of the operation will depend upon the value of successIfAbsent. * Full constructor. Success of the operation will depend upon the value of successIfAbsent.
* *
@ -73,38 +73,50 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
@Override @Override
protected RemoteOperationResult run(OwnCloudClient client) { protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null; RemoteOperationResult result;
PropFindMethod propfind = null;
boolean previousFollowRedirects = client.getFollowRedirects(); // TODO Complete redirection stuff, although OkHttp should follow redirections by default
// boolean previousFollowRedirects = client.getFollowRedirects();
try { try {
propfind = new PropFindMethod(client.getWebdavUri() + WebdavUtils.encodePath(mPath),
WebdavUtils.getAllPropSet(), DavConstants.DEPTH_0); DavOCResource davOCResource = new DavOCResource(
client.setFollowRedirects(false); client.getOkHttpClient(),
int status = client.executeMethod(propfind, TIMEOUT, TIMEOUT); HttpUrl.parse(client.getNewWebDavUri() + WebdavUtils.encodePath(mPath))
if (previousFollowRedirects) { );
mRedirectionPath = client.followRedirection(propfind);
status = mRedirectionPath.getLastStatus(); // client.setFollowRedirects(false);
}
if (status != FORBIDDEN_ERROR && status != SERVICE_UNAVAILABLE_ERROR) { PropfindMethod propfindMethod = new PropfindMethod(davOCResource, 0);
client.exhaustResponse(propfind.getResponseBodyAsStream()); int status = client.executeHttpMethod(propfindMethod);
}
// if (previousFollowRedirects) {
// mRedirectionPath = client.followRedirection(propfind);
// status = mRedirectionPath.getLastStatus();
// }
// if (status != FORBIDDEN_ERROR && status != SERVICE_UNAVAILABLE_ERROR) {
// client.exhaustResponse(propfind.getResponseBodyAsStream());
// }
/** /**
* PROPFIND method * PROPFIND method
* 404 NOT FOUND: path doesn't exist, * 404 NOT FOUND: path doesn't exist,
* 207 MULTI_STATUS: path exists. * 207 MULTI_STATUS: path exists.
*/ */
boolean success = ((status == HttpStatus.SC_OK || status == HttpStatus.SC_MULTI_STATUS) && boolean isSuccess = ((status == HttpStatus.SC_OK || status == HttpStatus.SC_MULTI_STATUS) &&
!mSuccessIfAbsent) || !mSuccessIfAbsent) ||
(status == HttpStatus.SC_MULTI_STATUS && !mSuccessIfAbsent) || (status == HttpStatus.SC_MULTI_STATUS && !mSuccessIfAbsent) ||
(status == HttpStatus.SC_NOT_FOUND && mSuccessIfAbsent); (status == HttpStatus.SC_NOT_FOUND && mSuccessIfAbsent);
result = new RemoteOperationResult(
success, result = isSuccess
propfind ? new RemoteOperationResult(OK)
); : new RemoteOperationResult(false, davOCResource.getRequest(), davOCResource.getResponse());
Log_OC.d(TAG, "Existence check for " + client.getWebdavUri() + Log_OC.d(TAG, "Existence check for " + client.getWebdavUri() +
WebdavUtils.encodePath(mPath) + " targeting for " + WebdavUtils.encodePath(mPath) + " targeting for " +
(mSuccessIfAbsent ? " absence " : " existence ") + (mSuccessIfAbsent ? " absence " : " existence ") +
"finished with HTTP status " + status + (!success?"(FAIL)":"")); "finished with HTTP status " + status + (!isSuccess?"(FAIL)":""));
} catch (Exception e) { } catch (Exception e) {
result = new RemoteOperationResult(e); result = new RemoteOperationResult(e);
@ -114,9 +126,7 @@ public class ExistenceCheckRemoteOperation extends RemoteOperation {
result.getLogMessage(), result.getException()); result.getLogMessage(), result.getException());
} finally { } finally {
if (propfind != null) // client.setFollowRedirects(previousFollowRedirects);
propfind.releaseConnection();
client.setFollowRedirects(previousFollowRedirects);
} }
return result; return result;
} }

View File

@ -1,5 +1,5 @@
/* ownCloud Android Library is available under MIT license /* ownCloud Android Library is available under MIT license
* Copyright (C) 2016 ownCloud GmbH. * Copyright (C) 2018 ownCloud GmbH.
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -25,27 +25,27 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.methods.PropfindMethod; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.network.WebdavEntry; import com.owncloud.android.lib.common.http.webdav.PropfindMethod;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.jackrabbit.webdav.MultiStatus;
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
import java.util.ArrayList; import java.util.ArrayList;
import at.bitfire.dav4android.DavOCResource; import at.bitfire.dav4android.DavResource;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Response;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
/** /**
* Remote operation performing the read of remote file or folder in the ownCloud server. * Remote operation performing the read of remote file or folder in the ownCloud server.
* *
* @author David A. Velasco * @author David A. Velasco
* @author masensio * @author masensio
* @author David González Verdugo
*/ */
public class ReadRemoteFolderOperation extends RemoteOperation { public class ReadRemoteFolderOperation extends RemoteOperation {
@ -53,7 +53,6 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
private static final String TAG = ReadRemoteFolderOperation.class.getSimpleName(); private static final String TAG = ReadRemoteFolderOperation.class.getSimpleName();
private String mRemotePath; private String mRemotePath;
private ArrayList<Object> mFolderAndFiles;
/** /**
* Constructor * Constructor
@ -72,49 +71,51 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
@Override @Override
protected RemoteOperationResult run(OwnCloudClient client) { protected RemoteOperationResult run(OwnCloudClient client) {
RemoteOperationResult result = null; RemoteOperationResult result = null;
PropFindMethod query = null;
try { try {
final HttpUrl location = HttpUrl.parse(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)); PropfindMethod propfindMethod = new PropfindMethod(
DavOCResource davOCResource = new DavOCResource(client.getOkHttpClient(), location); client.getOkHttpClient(),
PropfindMethod propfindMethod = new PropfindMethod(davOCResource, 1); HttpUrl.parse(client.getNewWebDavUri() + WebdavUtils.encodePath(mRemotePath)),
1);
int status = client.executeHttpMethod(propfindMethod); Response response = client.executeHttpMethod(propfindMethod);
// TODO Refactor from here down boolean isSuccess = (response.code() == HttpConstants.HTTP_MULTI_STATUS
// remote request || response.code() == HttpConstants.HTTP_OK);
// query = new PropFindMethod(client.getWebdavUri() + WebdavUtils.encodePath(mRemotePath),
// WebdavUtils.getAllPropSet(), // PropFind Properties if (isSuccess) {
// DavConstants.DEPTH_1);
// int status = client.executeMethod(query); ArrayList<Object> mFolderAndFiles = new ArrayList<>();
//
// // check and process response // parse data from remote folder
// boolean isSuccess = ( mFolderAndFiles.add(
// status == HttpStatus.SC_MULTI_STATUS || new RemoteFile(propfindMethod.getDavResource(), client.getAccount().getDisplayName())
// status == HttpStatus.SC_OK );
// );
// if (isSuccess) { // loop to update every child
// // get data from remote folder for (DavResource resource : propfindMethod.getMembers()) {
// MultiStatus dataInServer = query.getResponseBodyAsMultiStatus(); RemoteFile file = new RemoteFile(resource, client.getAccount().getDisplayName());
// readData(dataInServer, client); mFolderAndFiles.add(file);
// }
// // Result of the operation
// result = new RemoteOperationResult(true, query); // Result of the operation
// // Add data to the result result = new RemoteOperationResult(OK);
// if (result.isSuccess()) { result.setData(mFolderAndFiles);
// result.setData(mFolderAndFiles);
// } } else {
// } else {
// // synchronization failed // synchronization failed
// result = new RemoteOperationResult(false, query); result = new RemoteOperationResult(
// } false,
propfindMethod.getRequest(),
response
);
}
} catch (Exception e) { } catch (Exception e) {
result = new RemoteOperationResult(e); result = new RemoteOperationResult(e);
} finally { } finally {
if (query != null)
query.releaseConnection(); // let the connection available for other methods
if (result.isSuccess()) { if (result.isSuccess()) {
Log_OC.i(TAG, "Synchronized " + mRemotePath + ": " + result.getLogMessage()); Log_OC.i(TAG, "Synchronized " + mRemotePath + ": " + result.getLogMessage());
} else { } else {
@ -128,57 +129,4 @@ public class ReadRemoteFolderOperation extends RemoteOperation {
} }
return result; return result;
} }
public boolean isMultiStatus(int status) {
return (status == HttpStatus.SC_MULTI_STATUS);
}
/**
* Read the data retrieved from the server about the contents of the target folder
*
* @param remoteData Full response got from the server with the data of the target
* folder and its direct children.
* @param client Client instance to the remote server where the data were
* retrieved.
* @return
*/
private void readData(MultiStatus remoteData, OwnCloudClient client) {
mFolderAndFiles = new ArrayList<Object>();
// parse data from remote folder
WebdavEntry we = new WebdavEntry(remoteData.getResponses()[0],
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.getNewWebDavUri().getPath());
remoteFile = fillOCFile(we);
mFolderAndFiles.add(remoteFile);
}
}
/**
* Creates and populates a new {@link RemoteFile} object with the data read from the server.
*
* @param we WebDAV entry read from the server for a WebDAV resource (remote file or folder).
* @return New OCFile instance representing the remote resource described by we.
*/
private RemoteFile fillOCFile(WebdavEntry we) {
RemoteFile file = new RemoteFile(we.decodedPath());
file.setCreationTimestamp(we.createTimestamp());
file.setLength(we.contentLength());
file.setMimeType(we.contentType());
file.setModifiedTimestamp(we.modifiedTimestamp());
file.setEtag(we.etag());
file.setPermissions(we.permissions());
file.setRemoteId(we.remoteId());
file.setSize(we.size());
file.setQuotaUsedBytes(we.quotaUsedBytes());
file.setQuotaAvailableBytes(we.quotaAvailableBytes());
file.setPrivateLink(we.privateLink());
return file;
}
} }

View File

@ -31,6 +31,7 @@ import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.network.WebdavEntry; import com.owncloud.android.lib.common.network.WebdavEntry;
import com.owncloud.android.lib.refactor.OCContext; import com.owncloud.android.lib.refactor.OCContext;
import com.owncloud.android.lib.refactor.operations.RemoteOperation; import com.owncloud.android.lib.refactor.operations.RemoteOperation;
@ -173,7 +174,7 @@ public class RemoteFile implements Parcelable, Serializable {
/** /**
* Create new {@link RemoteFile} with given path. * Create new {@link RemoteFile} with given path.
* <p> *
* The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'. * The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'.
* *
* @param path The remote path of the file. * @param path The remote path of the file.
@ -201,8 +202,8 @@ public class RemoteFile implements Parcelable, Serializable {
this.setPrivateLink(webdavEntry.privateLink()); this.setPrivateLink(webdavEntry.privateLink());
} }
public RemoteFile(final DavResource davResource, OCContext context) { public RemoteFile(final DavResource davResource, String displayName) {
this(getRemotePathFromUrl(davResource.getLocation(), context)); this(getRemotePathFromUrl(davResource.getLocation(), displayName));
final PropertyCollection properties = davResource.getProperties(); final PropertyCollection properties = davResource.getProperties();
this.setCreationTimestamp(properties.get(CreationDate.class) != null this.setCreationTimestamp(properties.get(CreationDate.class) != null
? Long.parseLong(properties.get(CreationDate.class).getCreationDate()) ? Long.parseLong(properties.get(CreationDate.class).getCreationDate())
@ -227,9 +228,9 @@ public class RemoteFile implements Parcelable, Serializable {
} }
private static String getRemotePathFromUrl(HttpUrl url, OCContext context) { private static String getRemotePathFromUrl(HttpUrl url, String displayName) {
final String pathToRemove = final String pathToRemove =
"/" + RemoteOperation.WEBDAV_PATH_4_0 + "/" + context.getOCAccount().getDisplayName(); "/" + RemoteOperation.WEBDAV_PATH_4_0 + "/" + displayName;
return Uri.decode(url.encodedPath()).replace(pathToRemove, ""); return Uri.decode(url.encodedPath()).replace(pathToRemove, "");
} }