From 0723ae4b096db5cf75a4a94e0900c4110e54a5b6 Mon Sep 17 00:00:00 2001 From: masensio Date: Mon, 20 Jan 2014 14:27:09 +0100 Subject: [PATCH] OC-2584: Detect if the server supports the Share API. This Check is in OwnCloudServerCheckOperation --- .../remote}/OwnCloudServerCheckOperation.java | 75 +++++++++++++++------- .../oc_framework/utils/OwnCloudVersion.java | 37 ++++++++++- .../authentication/AuthenticatorActivity.java | 11 +++- 3 files changed, 97 insertions(+), 26 deletions(-) rename {src/com/owncloud/android/operations => oc_framework/src/com/owncloud/android/oc_framework/operations/remote}/OwnCloudServerCheckOperation.java (62%) diff --git a/src/com/owncloud/android/operations/OwnCloudServerCheckOperation.java b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/OwnCloudServerCheckOperation.java similarity index 62% rename from src/com/owncloud/android/operations/OwnCloudServerCheckOperation.java rename to oc_framework/src/com/owncloud/android/oc_framework/operations/remote/OwnCloudServerCheckOperation.java index 82096854..e43f0618 100644 --- a/src/com/owncloud/android/operations/OwnCloudServerCheckOperation.java +++ b/oc_framework/src/com/owncloud/android/oc_framework/operations/remote/OwnCloudServerCheckOperation.java @@ -1,37 +1,52 @@ -/* ownCloud Android client application - * Copyright (C) 2012-2013 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2014 ownCloud (http://www.owncloud.org/) + * + * 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.operations; +package com.owncloud.android.oc_framework.operations.remote; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.GetMethod; import org.json.JSONException; import org.json.JSONObject; -import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.oc_framework.accounts.AccountUtils; import com.owncloud.android.oc_framework.network.webdav.WebdavClient; import com.owncloud.android.oc_framework.operations.RemoteOperation; import com.owncloud.android.oc_framework.operations.RemoteOperationResult; import com.owncloud.android.oc_framework.utils.OwnCloudVersion; -import com.owncloud.android.utils.Log_OC; import android.content.Context; import android.net.ConnectivityManager; import android.net.Uri; +import android.util.Log; + +/** + * Checks if the server is valid and if the server supports the Share API + * + * @author David A. Velasco + * @author masensio + * + */ public class OwnCloudServerCheckOperation extends RemoteOperation { @@ -40,20 +55,33 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { private static final String TAG = OwnCloudServerCheckOperation.class.getSimpleName(); + private static final String OCVERSION_SHARED_SUPPORTED = "5.0.13"; + + private static final String NODE_INSTALLED = "installed"; + private static final String NODE_VERSION = "version"; + private static final String NODE_VERSIONSTRING = "versionstring"; + private String mUrl; private RemoteOperationResult mLatestResult; private Context mContext; private OwnCloudVersion mOCVersion; + private OwnCloudVersion mOCVersionString; public OwnCloudServerCheckOperation(String url, Context context) { mUrl = url; mContext = context; mOCVersion = null; + mOCVersionString = null; } public OwnCloudVersion getDiscoveredVersion() { return mOCVersion; } + public boolean isSharedSupported() { + OwnCloudVersion shareServer = new OwnCloudVersion(OCVERSION_SHARED_SUPPORTED); + + return mOCVersionString.compareTo(shareServer) >= 0; + } private boolean tryConnection(WebdavClient wc, String urlSt) { boolean retval = false; @@ -64,10 +92,11 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { String response = get.getResponseBodyAsString(); if (status == HttpStatus.SC_OK) { JSONObject json = new JSONObject(response); - if (!json.getBoolean("installed")) { + if (!json.getBoolean(NODE_INSTALLED)) { mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED); } else { - mOCVersion = new OwnCloudVersion(json.getString("version")); + mOCVersion = new OwnCloudVersion(json.getString(NODE_VERSION)); + mOCVersionString = new OwnCloudVersion(json.getString(NODE_VERSIONSTRING), true); if (!mOCVersion.isVersionValid()) { mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.BAD_OC_VERSION); @@ -97,13 +126,13 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { } if (mLatestResult.isSuccess()) { - Log_OC.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage()); + Log.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage()); } else if (mLatestResult.getException() != null) { - Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException()); + Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException()); } else { - Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage()); + Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage()); } return retval; @@ -128,7 +157,7 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { client.setBaseUri(Uri.parse("https://" + mUrl + AccountUtils.STATUS_PATH)); boolean httpsSuccess = tryConnection(client, "https://" + mUrl + AccountUtils.STATUS_PATH); if (!httpsSuccess && !mLatestResult.isSslRecoverableException()) { - Log_OC.d(TAG, "establishing secure connection failed, trying non secure connection"); + Log.d(TAG, "establishing secure connection failed, trying non secure connection"); client.setBaseUri(Uri.parse("http://" + mUrl + AccountUtils.STATUS_PATH)); tryConnection(client, "http://" + mUrl + AccountUtils.STATUS_PATH); } diff --git a/oc_framework/src/com/owncloud/android/oc_framework/utils/OwnCloudVersion.java b/oc_framework/src/com/owncloud/android/oc_framework/utils/OwnCloudVersion.java index 5a9df4d3..85f09ffc 100644 --- a/oc_framework/src/com/owncloud/android/oc_framework/utils/OwnCloudVersion.java +++ b/oc_framework/src/com/owncloud/android/oc_framework/utils/OwnCloudVersion.java @@ -47,6 +47,17 @@ public class OwnCloudVersion implements Comparable { mIsValid = false; parseVersionString(version); } + + public OwnCloudVersion(String versionstring, boolean isVersionString) { + mVersion = 0; + mIsValid = false; + if (isVersionString) { + parseVersionString(versionstring); + } else { + parseVersion(versionstring); + } + + } public String toString() { return ((mVersion >> 16) % 256) + "." + ((mVersion >> 8) % 256) + "." @@ -56,14 +67,14 @@ public class OwnCloudVersion implements Comparable { public boolean isVersionValid() { return mIsValid; } - + @Override public int compareTo(OwnCloudVersion another) { return another.mVersion == mVersion ? 0 : another.mVersion < mVersion ? 1 : -1; } - private void parseVersionString(String version) { + private void parseVersion(String version) { try { String[] nums = version.split("\\."); if (nums.length > 0) { @@ -82,4 +93,26 @@ public class OwnCloudVersion implements Comparable { mIsValid = false; } } + + private void parseVersionString(String versionstring) { + try { + versionstring = versionstring.replaceAll("[^\\d.]", ""); + + String[] nums = versionstring.split("\\."); + if (nums.length > 0) { + mVersion += Integer.parseInt(nums[0]); + } + mVersion = mVersion << 8; + if (nums.length > 1) { + mVersion += Integer.parseInt(nums[1]); + } + mVersion = mVersion << 8; + if (nums.length > 2) { + mVersion += Integer.parseInt(nums[2]); + } + mIsValid = true; + } catch (Exception e) { + mIsValid = false; + } + } } diff --git a/src/com/owncloud/android/authentication/AuthenticatorActivity.java b/src/com/owncloud/android/authentication/AuthenticatorActivity.java index ad40a066..25c338b7 100644 --- a/src/com/owncloud/android/authentication/AuthenticatorActivity.java +++ b/src/com/owncloud/android/authentication/AuthenticatorActivity.java @@ -59,12 +59,12 @@ import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory; import com.owncloud.android.oc_framework.network.webdav.WebdavClient; import com.owncloud.android.operations.OAuth2GetAccessToken; import com.owncloud.android.oc_framework.operations.OnRemoteOperationListener; -import com.owncloud.android.operations.OwnCloudServerCheckOperation; import com.owncloud.android.oc_framework.operations.RemoteOperation; import com.owncloud.android.oc_framework.operations.RemoteOperationResult; import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation; import com.owncloud.android.oc_framework.operations.remote.GetUserNameRemoteOperation; +import com.owncloud.android.oc_framework.operations.remote.OwnCloudServerCheckOperation; import com.owncloud.android.ui.dialog.SamlWebViewDialog; import com.owncloud.android.ui.dialog.SslValidatorDialog; import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener; @@ -103,6 +103,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT"; private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON"; private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED"; + private static final String KEY_IS_SHARED_SUPPORTED = "KEY_IS_SHARE_SUPPORTED"; private static final String AUTH_ON = "on"; private static final String AUTH_OFF = "off"; @@ -120,6 +121,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList private String mHostBaseUrl; private OwnCloudVersion mDiscoveredVersion; + private boolean mIsSharedSupported; private String mAuthMessageText; private int mAuthMessageVisibility, mServerStatusText, mServerStatusIcon; @@ -230,6 +232,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList mServerIsChecked = false; mIsSslConn = false; mAuthStatusText = mAuthStatusIcon = 0; + mIsSharedSupported = false; /// retrieve extras from intent mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT); @@ -268,6 +271,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList /// server data String ocVersion = savedInstanceState.getString(KEY_OC_VERSION); + mIsSharedSupported = savedInstanceState.getBoolean(KEY_IS_SHARED_SUPPORTED, false); if (ocVersion != null) { mDiscoveredVersion = new OwnCloudVersion(ocVersion); } @@ -447,6 +451,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList outState.putString(KEY_OC_VERSION, mDiscoveredVersion.toString()); } outState.putString(KEY_HOST_URL_TEXT, mHostBaseUrl); + outState.putBoolean(KEY_IS_SHARED_SUPPORTED, mIsSharedSupported); /// account data, if updating if (mAccount != null) { @@ -581,6 +586,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList mServerIsValid = false; mServerIsChecked = false; + mIsSharedSupported = false; mOkButton.setEnabled(false); mDiscoveredVersion = null; hideRefreshButton(); @@ -890,6 +896,9 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList /// allow or not the user try to access the server mOkButton.setEnabled(mServerIsValid); + + /// retrieve if is supported the Share API + mIsSharedSupported = operation.isSharedSupported(); } // else nothing ; only the last check operation is considered; // multiple can be triggered if the user amends a URL before a previous check can be triggered -- 2.11.0