From 7abd4bdb2f94d159d74d3ed5b0e61072b1e9e464 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Fri, 7 Feb 2014 09:47:52 +0100 Subject: [PATCH 1/5] Fixed bug in URL to entry point for username --- .../lib/operations/remote/GetUserNameRemoteOperation.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/owncloud/android/lib/operations/remote/GetUserNameRemoteOperation.java b/src/com/owncloud/android/lib/operations/remote/GetUserNameRemoteOperation.java index 2e8e2338..3e1d52ae 100644 --- a/src/com/owncloud/android/lib/operations/remote/GetUserNameRemoteOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/GetUserNameRemoteOperation.java @@ -80,10 +80,10 @@ public class GetUserNameRemoteOperation extends RemoteOperation { //Get the user try { - //GetMethod get = new GetMethod(client.getWebdavUri() + OCS_ROUTE); - get = new GetMethod(client.getBaseUri() + OCS_ROUTE); - Log.e(TAG, "Getting OC user information from " + client.getBaseUri() + OCS_ROUTE); - Log.e(TAG, "Getting OC user information from " + client.getWebdavUri() + OCS_ROUTE); + get = new GetMethod(client.getWebdavUri() + OCS_ROUTE); + //get = new GetMethod(client.getBaseUri() + OCS_ROUTE); // need to fix the semantics of getBaseUri and getWebdavUri + //Log.e(TAG, "Getting OC user information from " + client.getBaseUri() + OCS_ROUTE); + //Log.e(TAG, "Getting OC user information from " + client.getWebdavUri() + OCS_ROUTE); // Add the Header get.addRequestHeader(HEADER_OCS_API, HEADER_OCS_API_VALUE); status = client.executeMethod(get); From 1f6f9bcf84837a72ef2a7a79b5af7bee6677facd Mon Sep 17 00:00:00 2001 From: masensio Date: Tue, 18 Feb 2014 11:35:09 +0100 Subject: [PATCH 2/5] OC-2765: App crashes when loging in servers without the patch --- src/com/owncloud/android/lib/utils/ShareXMLParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 4d456a7f..161504ad 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -271,7 +271,10 @@ public class ShareXMLParser { String name = parser.getName(); - if (name.equalsIgnoreCase(NODE_ID)) { + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + share = readElement(parser); + + } else if (name.equalsIgnoreCase(NODE_ID)) { share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { From c3f438220061a302c7f6fd6c32da039efaeb541e Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 19 Feb 2014 12:27:06 +0100 Subject: [PATCH 3/5] Updated server check operation and OwnCloudVersion to retrieve both remote version and versionstring values --- .../android/lib/accounts/AccountUtils.java | 5 +- .../android/lib/accounts/OwnCloudAccount.java | 9 +- .../remote/OwnCloudServerCheckOperation.java | 18 +-- .../android/lib/utils/OwnCloudVersion.java | 111 ++++++++++-------- 4 files changed, 72 insertions(+), 71 deletions(-) diff --git a/src/com/owncloud/android/lib/accounts/AccountUtils.java b/src/com/owncloud/android/lib/accounts/AccountUtils.java index fbb840cf..e1087b0d 100644 --- a/src/com/owncloud/android/lib/accounts/AccountUtils.java +++ b/src/com/owncloud/android/lib/accounts/AccountUtils.java @@ -80,10 +80,11 @@ public class AccountUtils { public static String constructFullURLForAccount(Context context, Account account) throws AccountNotFoundException { AccountManager ama = AccountManager.get(context); String baseurl = ama.getUserData(account, OwnCloudAccount.Constants.KEY_OC_BASE_URL); - String strver = ama.getUserData(account, OwnCloudAccount.Constants.KEY_OC_VERSION); + String version = ama.getUserData(account, OwnCloudAccount.Constants.KEY_OC_VERSION); + String versionString = ama.getUserData(account, OwnCloudAccount.Constants.KEY_OC_VERSION_STRING); boolean supportsOAuth = (ama.getUserData(account, OwnCloudAccount.Constants.KEY_SUPPORTS_OAUTH2) != null); boolean supportsSamlSso = (ama.getUserData(account, OwnCloudAccount.Constants.KEY_SUPPORTS_SAML_WEB_SSO) != null); - OwnCloudVersion ver = new OwnCloudVersion(strver); + OwnCloudVersion ver = new OwnCloudVersion(version, versionString); String webdavpath = getWebdavPath(ver, supportsOAuth, supportsSamlSso); if (baseurl == null || webdavpath == null) diff --git a/src/com/owncloud/android/lib/accounts/OwnCloudAccount.java b/src/com/owncloud/android/lib/accounts/OwnCloudAccount.java index 740bd17f..0979cdc9 100644 --- a/src/com/owncloud/android/lib/accounts/OwnCloudAccount.java +++ b/src/com/owncloud/android/lib/accounts/OwnCloudAccount.java @@ -52,6 +52,10 @@ public class OwnCloudAccount extends Account { * {@link com.owncloud.android.lib.utils.utils.OwnCloudVersion} */ public static final String KEY_OC_VERSION = "oc_version"; + /** + * Version string as shown in the status.php resource in the server side + */ + public static final String KEY_OC_VERSION_STRING = "oc_version_string"; /** * Base url should point to owncloud installation without trailing / ie: * http://server/path or https://owncloud.server @@ -65,10 +69,7 @@ public class OwnCloudAccount extends Account { * Flag signaling if the ownCloud server can be accessed with session cookies from SAML-based web single-sign-on. */ public static final String KEY_SUPPORTS_SAML_WEB_SSO = "oc_supports_saml_web_sso"; - /** - * Flag signaling if the ownCloud server supports Share API" - */ - public static final String KEY_SUPPORTS_SHARE_API = "oc_supports_share_api"; + } private String mAuthTokenType; diff --git a/src/com/owncloud/android/lib/operations/remote/OwnCloudServerCheckOperation.java b/src/com/owncloud/android/lib/operations/remote/OwnCloudServerCheckOperation.java index 15e54a3e..fb9900c0 100644 --- a/src/com/owncloud/android/lib/operations/remote/OwnCloudServerCheckOperation.java +++ b/src/com/owncloud/android/lib/operations/remote/OwnCloudServerCheckOperation.java @@ -55,8 +55,6 @@ 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"; @@ -65,27 +63,16 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { 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); - if (mOCVersionString != null) { - return mOCVersionString.compareTo(shareServer) >= 0; - } - - return false; - - } private boolean tryConnection(OwnCloudClient wc, String urlSt) { boolean retval = false; @@ -99,8 +86,9 @@ public class OwnCloudServerCheckOperation extends RemoteOperation { if (!json.getBoolean(NODE_INSTALLED)) { mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED); } else { - mOCVersion = new OwnCloudVersion(json.getString(NODE_VERSION)); - mOCVersionString = new OwnCloudVersion(json.getString(NODE_VERSIONSTRING), true); + String version = json.getString(NODE_VERSION); + String versionString = json.getString(NODE_VERSIONSTRING); + mOCVersion = new OwnCloudVersion(version, versionString); if (!mOCVersion.isVersionValid()) { mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.BAD_OC_VERSION); diff --git a/src/com/owncloud/android/lib/utils/OwnCloudVersion.java b/src/com/owncloud/android/lib/utils/OwnCloudVersion.java index dd01186d..82ac4a23 100644 --- a/src/com/owncloud/android/lib/utils/OwnCloudVersion.java +++ b/src/com/owncloud/android/lib/utils/OwnCloudVersion.java @@ -36,40 +36,48 @@ public class OwnCloudVersion implements Comparable { 0x040000); public static final OwnCloudVersion owncloud_v4_5 = new OwnCloudVersion( 0x040500); - + + public static final int MINIMUM_VERSION_STRING_FOR_SHARING_API = 0x05000D; + // format is in version // 0xAABBCC // for version AA.BB.CC - // ie version 2.0.3 will be stored as 0x030003 + // ie version 2.0.3 will be stored as 0x020003 private int mVersion; private boolean mIsValid; + // not parsed, saved same value offered by the server + private String mVersionString; - public OwnCloudVersion(int version) { + protected OwnCloudVersion(int version) { mVersion = version; mIsValid = true; + mVersionString = ""; } - public OwnCloudVersion(String version) { + public OwnCloudVersion(String version, String versionString) { mVersion = 0; mIsValid = false; parseVersionString(version); + if (versionString != null && versionString.length() > 0) { + mVersionString = versionString; + + } else if (mIsValid) { + mVersionString = 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) + "." + ((mVersion) % 256); } + + public String getVersion() { + return toString(); + } + + public String getVersionString() { + return mVersionString; + } public boolean isVersionValid() { return mIsValid; @@ -81,45 +89,48 @@ public class OwnCloudVersion implements Comparable { : another.mVersion < mVersion ? 1 : -1; } - private void parseVersion(String version) { - try { - String[] nums = version.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; - } - } - - private void parseVersionString(String versionstring) { + 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]); - } + mVersion = getParsedVersionString(versionString); mIsValid = true; + } catch (Exception e) { mIsValid = false; } } + + private int getParsedVersionString(String versionString) throws NumberFormatException { + int version = 0; + + // get only numeric part + versionString = versionString.replaceAll("[^\\d.]", ""); + + String[] nums = versionString.split("\\."); + if (nums.length > 0) { + version += Integer.parseInt(nums[0]); + } + version = version << 8; + if (nums.length > 1) { + version += Integer.parseInt(nums[1]); + } + version = version << 8; + if (nums.length > 2) { + version += Integer.parseInt(nums[2]); + } + return version; + } + + + public boolean isSharedSupported() { + int versionString = 0; + try { + versionString = getParsedVersionString(mVersionString); + + } catch (Exception e) { + // nothing to do here + } + return (versionString >= MINIMUM_VERSION_STRING_FOR_SHARING_API); + } + + } From 9a3ad5a4eca76e2d0c2771a20668e93865b6eb67 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 20 Feb 2014 12:56:29 +0100 Subject: [PATCH 4/5] Added minimal validation of parsed shares coming from server to avoid crashes due to bad formed or unexpected responses --- .../android/lib/utils/ShareXMLParser.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index 161504ad..ca4934fd 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -221,7 +221,8 @@ public class ShareXMLParser { } String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { - shares.add(readElement(parser)); + readElement(parser, shares); + } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response share = new OCShare(); String value = readNode(parser, NODE_ID); @@ -244,7 +245,6 @@ public class ShareXMLParser { if (share != null) { shares.add(share); } - return shares; @@ -258,7 +258,7 @@ public class ShareXMLParser { * @throws XmlPullParserException * @throws IOException */ - private OCShare readElement(XmlPullParser parser) throws XmlPullParserException, IOException { + private void readElement(XmlPullParser parser, ArrayList shares) throws XmlPullParserException, IOException { parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); OCShare share = new OCShare(); @@ -272,7 +272,9 @@ public class ShareXMLParser { String name = parser.getName(); if (name.equalsIgnoreCase(NODE_ELEMENT)) { - share = readElement(parser); + // patch to work around servers responding with extra surrounding all the shares on the same file before + // https://github.com/owncloud/core/issues/6992 was fixed + readElement(parser, shares); } else if (name.equalsIgnoreCase(NODE_ID)) { share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); @@ -329,7 +331,13 @@ public class ShareXMLParser { } } - return share; + if (isValidShare(share)) { + shares.add(share); + } + } + + private boolean isValidShare(OCShare share) { + return (share.getIdRemoteShared() > -1); } private void fixPathForFolder(OCShare share) { From b3ac14f575da5100eecff00de744d9330b668f66 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 20 Feb 2014 14:46:46 +0100 Subject: [PATCH 5/5] Added extra validation to avoid interference of shares not of public type (unhandled by the moment) --- src/com/owncloud/android/lib/utils/ShareXMLParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/utils/ShareXMLParser.java b/src/com/owncloud/android/lib/utils/ShareXMLParser.java index ca4934fd..5099cee0 100644 --- a/src/com/owncloud/android/lib/utils/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/utils/ShareXMLParser.java @@ -243,6 +243,7 @@ public class ShareXMLParser { } if (share != null) { + // this is the response of a request for creation; don't pass to isValidShare() shares.add(share); } @@ -337,7 +338,9 @@ public class ShareXMLParser { } private boolean isValidShare(OCShare share) { - return (share.getIdRemoteShared() > -1); + return ((share.getIdRemoteShared() > -1) && + (share.getShareType() == ShareType.PUBLIC_LINK) // at this moment we only care about public shares + ); } private void fixPathForFolder(OCShare share) {