diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 3b6b99a4..9bb0d4c7 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -100,7 +100,8 @@ public class RemoteOperationResult implements Serializable { SHARE_NOT_FOUND, LOCAL_STORAGE_NOT_REMOVED, FORBIDDEN, - SHARE_FORBIDDEN + SHARE_FORBIDDEN, + OK_REDIRECT_TO_NON_SECURE_CONNECTION } private boolean mSuccess = false; @@ -114,7 +115,7 @@ public class RemoteOperationResult implements Serializable { public RemoteOperationResult(ResultCode code) { mCode = code; - mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL); + mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL || code == ResultCode.OK_REDIRECT_TO_NON_SECURE_CONNECTION); mData = null; } @@ -250,6 +251,10 @@ public class RemoteOperationResult implements Serializable { return mCode == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED; } + public boolean isRedirectToNonSecureConnection() { + return mCode == ResultCode.OK_REDIRECT_TO_NON_SECURE_CONNECTION; + } + private CertificateCombinedException getCertificateCombinedException(Exception e) { CertificateCombinedException result = null; if (e instanceof CertificateCombinedException) { @@ -371,6 +376,15 @@ public class RemoteOperationResult implements Serializable { mRedirectedLocation.toLowerCase().contains("wayf"))); } + /** + * Checks if is a non https connection + * + * @return boolean true/false + */ + public boolean isNonSecureRedirection() { + return (mRedirectedLocation != null && !(mRedirectedLocation.toLowerCase().startsWith("https://"))); + } + public String getAuthenticateHeader() { return mAuthenticate; } diff --git a/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java b/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java index 458a91d3..b101aafd 100644 --- a/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java +++ b/src/com/owncloud/android/lib/resources/status/GetRemoteStatusOperation.java @@ -31,16 +31,17 @@ import org.apache.commons.httpclient.methods.GetMethod; import org.json.JSONException; import org.json.JSONObject; -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.accounts.AccountUtils; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; - import android.content.Context; import android.net.ConnectivityManager; import android.net.Uri; import android.util.Log; +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.accounts.AccountUtils; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation; + /** * Checks if the server is valid and if the server supports the Share API * @@ -93,10 +94,35 @@ public class GetRemoteStatusOperation extends RemoteOperation { RemoteOperationResult.ResultCode.OK_NO_SSL ); - ArrayList data = new ArrayList(); - data.add(ocVersion); - mLatestResult.setData(data); - retval = true; + RemoteOperation operation = new ExistenceCheckRemoteOperation("", mContext, false); + client.setFollowRedirects(false); + boolean isRedirectToNonSecureConnection = false; + + // checks if there are any reconnection to a non secure + // connection + RemoteOperationResult result = operation.execute(client); + String redirectedLocation = result.getRedirectedLocation(); + while (baseUrlSt.startsWith("https://") && redirectedLocation != null + && redirectedLocation.length() > 0 + && result.isNonSecureRedirection()) { + client.setBaseUri(Uri.parse(result.getRedirectedLocation())); + result = operation.execute(client); + redirectedLocation = result.getRedirectedLocation(); + + isRedirectToNonSecureConnection = true; + break; + } + + if (isRedirectToNonSecureConnection) { + mLatestResult = new RemoteOperationResult( + RemoteOperationResult.ResultCode.OK_REDIRECT_TO_NON_SECURE_CONNECTION); + } else { + retval = true; + } + + ArrayList data = new ArrayList(); + data.add(ocVersion); + mLatestResult.setData(data); } } @@ -148,7 +174,7 @@ public class GetRemoteStatusOperation extends RemoteOperation { } else { client.setBaseUri(Uri.parse("https://" + baseUriStr)); boolean httpsSuccess = tryConnection(client); - if (!httpsSuccess && !mLatestResult.isSslRecoverableException()) { + if (!httpsSuccess && !mLatestResult.isSslRecoverableException() && mLatestResult.isNonSecureRedirection()) { Log.d(TAG, "establishing secure connection failed, trying non secure connection"); client.setBaseUri(Uri.parse("http://" + baseUriStr)); tryConnection(client);