From 188ce07155f52022e1806a330063e525fdeed664 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 19 Apr 2017 18:03:48 +0200 Subject: [PATCH 01/12] Add support for optional name in public shares (WIP) --- .../android/lib/resources/shares/OCShare.java | 121 ++++++++++-------- .../ShareToRemoteOperationResultParser.java | 1 + .../lib/resources/shares/ShareXMLParser.java | 6 +- .../shares/UpdateRemoteShareOperation.java | 35 +++-- 4 files changed, 99 insertions(+), 64 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/OCShare.java b/src/com/owncloud/android/lib/resources/shares/OCShare.java index 6bbf6458..1ce63504 100644 --- a/src/com/owncloud/android/lib/resources/shares/OCShare.java +++ b/src/com/owncloud/android/lib/resources/shares/OCShare.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. + * Copyright (C) 2017 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,7 @@ package com.owncloud.android.lib.resources.shares; +import java.io.File; import java.io.Serializable; import android.os.Parcel; @@ -35,9 +36,9 @@ import com.owncloud.android.lib.resources.files.FileUtils; /** * Contains the data of a Share from the Share API - * - * @author masensio * + * @author masensio + * @author David A. Velasco */ public class OCShare implements Parcelable, Serializable { @@ -56,33 +57,27 @@ public class OCShare implements Parcelable, Serializable { public static final int SHARE_PERMISSION_FLAG = 16; public static final int MAXIMUM_PERMISSIONS_FOR_FILE = READ_PERMISSION_FLAG + - UPDATE_PERMISSION_FLAG + - SHARE_PERMISSION_FLAG - ; + UPDATE_PERMISSION_FLAG + + SHARE_PERMISSION_FLAG; public static final int MAXIMUM_PERMISSIONS_FOR_FOLDER = MAXIMUM_PERMISSIONS_FOR_FILE + - CREATE_PERMISSION_FLAG + - DELETE_PERMISSION_FLAG - ; + CREATE_PERMISSION_FLAG + + DELETE_PERMISSION_FLAG; public static final int FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9 = READ_PERMISSION_FLAG + - UPDATE_PERMISSION_FLAG - ; + UPDATE_PERMISSION_FLAG; public static final int FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9 = READ_PERMISSION_FLAG + - UPDATE_PERMISSION_FLAG + - SHARE_PERMISSION_FLAG - ; + UPDATE_PERMISSION_FLAG + + SHARE_PERMISSION_FLAG; public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 = READ_PERMISSION_FLAG + - UPDATE_PERMISSION_FLAG + - CREATE_PERMISSION_FLAG + - DELETE_PERMISSION_FLAG - ; + UPDATE_PERMISSION_FLAG + + CREATE_PERMISSION_FLAG + + DELETE_PERMISSION_FLAG; public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + - SHARE_PERMISSION_FLAG - ; + SHARE_PERMISSION_FLAG; private long mId; private long mFileSource; @@ -95,33 +90,34 @@ public class OCShare implements Parcelable, Serializable { private long mExpirationDate; private String mToken; private String mSharedWithDisplayName; + private String mName; private boolean mIsFolder; private long mUserId; private long mRemoteId; private String mShareLink; - + public OCShare() { - super(); - resetData(); + super(); + resetData(); } - - public OCShare(String path) { - resetData(); + + public OCShare(String path) { + resetData(); if (path == null || path.length() <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) { Log_OC.e(TAG, "Trying to create a OCShare with a non valid path"); throw new IllegalArgumentException("Trying to create a OCShare with a non valid path: " + path); } mPath = path; - } + } - /** + /** * Used internally. Reset all file properties */ private void resetData() { - mId = -1; + mId = -1; mFileSource = 0; mItemSource = 0; - mShareType = ShareType.NO_SHARED; + mShareType = ShareType.NO_SHARED; mShareWith = ""; mPath = ""; mPermissions = -1; @@ -133,18 +129,19 @@ public class OCShare implements Parcelable, Serializable { mUserId = -1; mRemoteId = -1; mShareLink = ""; - } - + mName = ""; + } + /// Getters and Setters - + public long getId() { return mId; } - - public void setId(long id){ + + public void setId(long id) { mId = id; } - + public long getFileSource() { return mFileSource; } @@ -225,6 +222,20 @@ public class OCShare implements Parcelable, Serializable { this.mSharedWithDisplayName = (sharedWithDisplayName != null) ? sharedWithDisplayName : ""; } + public String getName() { + if (mName.length() > 0) { + return mName; + } + if (mPath.length() > 0) { + return (new File(mPath)).getName(); + } + return ""; + } + + public void setName(String name) { + mName = (name != null) ? name : ""; + } + public boolean isFolder() { return mIsFolder; } @@ -248,11 +259,11 @@ public class OCShare implements Parcelable, Serializable { public void setIdRemoteShared(long remoteId) { this.mRemoteId = remoteId; } - + public String getShareLink() { - return this.mShareLink; + return this.mShareLink; } - + public void setShareLink(String shareLink) { this.mShareLink = (shareLink != null) ? shareLink : ""; } @@ -260,8 +271,8 @@ public class OCShare implements Parcelable, Serializable { public boolean isPasswordProtected() { return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0; } - - /** + + /** * Parcelable Methods */ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -275,19 +286,19 @@ public class OCShare implements Parcelable, Serializable { return new OCShare[size]; } }; - + /** * Reconstruct from parcel - * + * * @param source The source parcel - */ + */ protected OCShare(Parcel source) { - readFromParcel(source); + readFromParcel(source); } - + public void readFromParcel(Parcel source) { mId = source.readLong(); - + mFileSource = source.readLong(); mItemSource = source.readLong(); try { @@ -306,18 +317,19 @@ public class OCShare implements Parcelable, Serializable { mUserId = source.readLong(); mRemoteId = source.readLong(); mShareLink = source.readString(); + mName = source.readString(); + } + + + @Override + public int describeContents() { + return this.hashCode(); } - @Override - public int describeContents() { - return this.hashCode(); - } - - @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeLong(mId); + dest.writeLong(mId); dest.writeLong(mFileSource); dest.writeLong(mItemSource); dest.writeString((mShareType == null) ? "" : mShareType.name()); @@ -332,6 +344,7 @@ public class OCShare implements Parcelable, Serializable { dest.writeLong(mUserId); dest.writeLong(mRemoteId); dest.writeString(mShareLink); + dest.writeString(mName); } } diff --git a/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java b/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java index 0d1bbbb6..c39300f8 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java +++ b/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java @@ -94,6 +94,7 @@ public class ShareToRemoteOperationResultParser { share.getShareLink().length() <= 0) && share.getToken().length() > 0 ) { + // TODO - deal with https://github.com/owncloud/android/issues/1811 if (mServerBaseUri != null) { String sharingLinkPath = ShareUtils.getSharingLinkPath(mOwnCloudVersion); share.setShareLink(mServerBaseUri + sharingLinkPath + share.getToken()); diff --git a/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java b/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java index a17bda02..0f02e6f3 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java @@ -76,6 +76,7 @@ public class ShareXMLParser { private static final String NODE_STORAGE = "storage"; private static final String NODE_MAIL_SEND = "mail_send"; private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname"; + private static final String NODE_NAME = "name"; private static final String NODE_URL = "url"; @@ -356,7 +357,10 @@ public class ShareXMLParser { String value = readNode(parser, NODE_URL); share.setShareLink(value); - } else { + } else if (name.equalsIgnoreCase(NODE_NAME)) { + share.setName(readNode(parser, NODE_NAME)); + + } else { skip(parser); } } diff --git a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java index 7226cbe3..b64dd009 100644 --- a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java @@ -42,6 +42,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.Locale; /** @@ -54,6 +55,7 @@ public class UpdateRemoteShareOperation extends RemoteOperation { private static final String TAG = GetRemoteShareOperation.class.getSimpleName(); + private static final String PARAM_NAME = "name"; private static final String PARAM_PASSWORD = "password"; private static final String PARAM_EXPIRATION_DATE = "expireDate"; private static final String PARAM_PERMISSIONS = "permissions"; @@ -87,6 +89,7 @@ public class UpdateRemoteShareOperation extends RemoteOperation { * Upload permissions for the public link (only folders) */ private Boolean mPublicUpload; + private String mName; /** @@ -102,6 +105,17 @@ public class UpdateRemoteShareOperation extends RemoteOperation { } + /** + * Set name to update in Share resource. Ignored by servers previous to version 10.0.0 + * + * @param name Name to set to the target share. + * Empty string clears the current name. + * Null results in no update applied to the name. + */ + public void setName(String name) { + this.mName = name; + } + /** * Set password to update in Share resource. * @@ -150,38 +164,41 @@ public class UpdateRemoteShareOperation extends RemoteOperation { @Override protected RemoteOperationResult run(OwnCloudClient client) { RemoteOperationResult result = null; - int status = -1; + int status; /// prepare array of parameters to update - List> parametersToUpdate = new ArrayList>(); + List> parametersToUpdate = new ArrayList<>(); + if (mName != null) { + parametersToUpdate.add(new Pair<>(PARAM_NAME, mName)); + } if (mPassword != null) { - parametersToUpdate.add(new Pair(PARAM_PASSWORD, mPassword)); + parametersToUpdate.add(new Pair<>(PARAM_PASSWORD, mPassword)); } if (mExpirationDateInMillis < 0) { // clear expiration date - parametersToUpdate.add(new Pair(PARAM_EXPIRATION_DATE, "")); + parametersToUpdate.add(new Pair<>(PARAM_EXPIRATION_DATE, "")); } else if (mExpirationDateInMillis > 0) { // set expiration date - DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE); + DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.GERMAN); Calendar expirationDate = Calendar.getInstance(); expirationDate.setTimeInMillis(mExpirationDateInMillis); String formattedExpirationDate = dateFormat.format(expirationDate.getTime()); - parametersToUpdate.add(new Pair(PARAM_EXPIRATION_DATE, formattedExpirationDate)); + parametersToUpdate.add(new Pair<>(PARAM_EXPIRATION_DATE, formattedExpirationDate)); } // else, ignore - no update if (mPermissions > 0) { // set permissions - parametersToUpdate.add(new Pair(PARAM_PERMISSIONS, Integer.toString(mPermissions))); + parametersToUpdate.add(new Pair<>(PARAM_PERMISSIONS, Integer.toString(mPermissions))); } if (mPublicUpload != null) { - parametersToUpdate.add(new Pair(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload))); + parametersToUpdate.add(new Pair<>(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload))); } /// perform required PUT requests PutMethod put = null; - String uriString = null; + String uriString; try { Uri requestUri = client.getBaseUri(); From dda1429581112dc752fbb48b83e06a22f905cc8d Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 27 Apr 2017 09:57:34 +0200 Subject: [PATCH 02/12] Create public link [WIP] --- .../shares/CreateRemoteShareOperation.java | 126 ++++++++++++++++-- 1 file changed, 112 insertions(+), 14 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java index 7d8f2179..e2930e49 100644 --- a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java @@ -34,6 +34,11 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + /** * Creates a new share. This allows sharing with a user or group or as a link. */ @@ -41,21 +46,46 @@ public class CreateRemoteShareOperation extends RemoteOperation { private static final String TAG = CreateRemoteShareOperation.class.getSimpleName(); + private static final String PARAM_NAME = "name"; + private static final String PARAM_PASSWORD = "password"; + private static final String PARAM_EXPIRATION_DATE = "expireDate"; + private static final String PARAM_PUBLIC_UPLOAD = "publicUpload"; private static final String PARAM_PATH = "path"; private static final String PARAM_SHARE_TYPE = "shareType"; private static final String PARAM_SHARE_WITH = "shareWith"; - private static final String PARAM_PUBLIC_UPLOAD = "publicUpload"; - private static final String PARAM_PASSWORD = "password"; private static final String PARAM_PERMISSIONS = "permissions"; + private static final String FORMAT_EXPIRATION_DATE = "yyyy-MM-dd"; private String mRemoteFilePath; private ShareType mShareType; private String mShareWith; - private boolean mPublicUpload; - private String mPassword; - private int mPermissions; private boolean mGetShareDetails; + /** + * Name to set for the public link + */ + private String mName; + + /** + * Password to set for the public link + */ + private String mPassword; + + /** + * Expiration date to set for the public link + */ + private long mExpirationDateInMillis; + + /** + * Access permissions for the file bound to the share + */ + private int mPermissions; + + /** + * Upload permissions for the public link (only folders) + */ + private Boolean mPublicUpload; + /** * Constructor * @@ -77,12 +107,12 @@ public class CreateRemoteShareOperation extends RemoteOperation { * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ public CreateRemoteShareOperation( - String remoteFilePath, - ShareType shareType, - String shareWith, - boolean publicUpload, - String password, - int permissions + String remoteFilePath, + ShareType shareType, + String shareWith, + boolean publicUpload, + String password, + int permissions ) { mRemoteFilePath = remoteFilePath; @@ -94,6 +124,56 @@ public class CreateRemoteShareOperation extends RemoteOperation { mGetShareDetails = false; // defaults to false for backwards compatibility } + + /** + * Set name to create in Share resource. Ignored by servers previous to version 10.0.0 + * + * @param name Name to set to the target share. + */ + public void setName(String name) { + this.mName = name; + } + + /** + * Set password to create in Share resource. + * + * @param password Password to set to the target share. + */ + public void setPassword(String password) { + mPassword = password; + } + + + /** + * Set expiration date to create in Share resource. + * + * @param expirationDateInMillis Expiration date to set to the target share. + */ + public void setExpirationDate(long expirationDateInMillis) { + mExpirationDateInMillis = expirationDateInMillis; + } + + + /** + * Set permissions to create in Share resource. + * + * @param permissions Permissions to set to the target share. + * Values <= 0 result in no update applied to the permissions. + */ + public void setPermissions(int permissions) { + mPermissions = permissions; + } + + /** + * * Enable upload permissions to create in Share resource. + * * + * * @param publicUpload Upload permission to set to the target share. + * * Null results in no update applied to the upload permission. + */ + public void setPublicUpload(Boolean publicUpload) { + mPublicUpload = publicUpload; + } + public boolean isGettingShareDetails() { return mGetShareDetails; } @@ -114,11 +194,29 @@ public class CreateRemoteShareOperation extends RemoteOperation { post = new PostMethod(client.getBaseUri() + ShareUtils.SHARING_API_PATH); post.setRequestHeader("Content-Type", - "application/x-www-form-urlencoded; charset=utf-8"); // necessary for special characters + "application/x-www-form-urlencoded; charset=utf-8"); // necessary for special characters post.addParameter(PARAM_PATH, mRemoteFilePath); post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); post.addParameter(PARAM_SHARE_WITH, mShareWith); + + if (mName != null) { + post.addParameter(PARAM_NAME, mName); + } + + if (mExpirationDateInMillis < 0) { + // empty expiration date + post.addParameter(PARAM_EXPIRATION_DATE, ""); + + } else { + + DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()); + Calendar expirationDate = Calendar.getInstance(); + expirationDate.setTimeInMillis(mExpirationDateInMillis); + String formattedExpirationDate = dateFormat.format(expirationDate.getTime()); + post.addParameter(PARAM_EXPIRATION_DATE, formattedExpirationDate); + } + if (mPublicUpload) { post.addParameter(PARAM_PUBLIC_UPLOAD, Boolean.toString(true)); } @@ -137,7 +235,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { String response = post.getResponseBodyAsString(); ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser( - new ShareXMLParser() + new ShareXMLParser() ); parser.setOneOrMoreSharesRequired(true); parser.setOwnCloudVersion(client.getOwnCloudVersion()); @@ -148,7 +246,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { // retrieve more info - POST only returns the index of the new share OCShare emptyShare = (OCShare) result.getData().get(0); GetRemoteShareOperation getInfo = new GetRemoteShareOperation( - emptyShare.getRemoteId() + emptyShare.getRemoteId() ); result = getInfo.execute(client); } From ee726119cb21ac07c17857cb1a81baa262bf42da Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 26 Apr 2017 13:48:22 +0200 Subject: [PATCH 03/12] Clarify absence and patch of URL field of OCShares --- .../shares/ShareToRemoteOperationResultParser.java | 6 +++--- .../android/lib/resources/shares/ShareXMLParser.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java b/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java index c39300f8..3b37c035 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java +++ b/src/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java @@ -88,18 +88,18 @@ public class ShareToRemoteOperationResultParser { if (shares != null) { for (OCShare share : shares) { resultData.add(share); - // build the share link if not in the response (only received when the share is created) + // build the share link if not in the response + // (needed for OC servers < 9.0.0, see ShareXMLParser.java#line256) if (share.getShareType() == ShareType.PUBLIC_LINK && (share.getShareLink() == null || share.getShareLink().length() <= 0) && share.getToken().length() > 0 ) { - // TODO - deal with https://github.com/owncloud/android/issues/1811 if (mServerBaseUri != null) { String sharingLinkPath = ShareUtils.getSharingLinkPath(mOwnCloudVersion); share.setShareLink(mServerBaseUri + sharingLinkPath + share.getToken()); } else { - Log_OC.e(TAG, "Couldn't build link for public share"); + Log_OC.e(TAG, "Couldn't build link for public share :("); } } } diff --git a/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java b/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java index 0f02e6f3..70891a4f 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java +++ b/src/com/owncloud/android/lib/resources/shares/ShareXMLParser.java @@ -253,6 +253,9 @@ public class ShareXMLParser { share.setIdRemoteShared(Integer.parseInt(value)); } else if (name.equalsIgnoreCase(NODE_URL)) { + // NOTE: this field is received in all the public shares from OC 9.0.0 + // in previous versions, it's received in the result of POST requests, but not + // in GET requests share.setShareType(ShareType.PUBLIC_LINK); String value = readNode(parser, NODE_URL); share.setShareLink(value); From 8f3aeb30ed7c08186f5790b6c9310f86ca6070e7 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 2 May 2017 18:51:31 +0200 Subject: [PATCH 04/12] Use the token instead of the path when a public link has been created with no name --- src/com/owncloud/android/lib/resources/shares/OCShare.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/OCShare.java b/src/com/owncloud/android/lib/resources/shares/OCShare.java index 1ce63504..e3763b36 100644 --- a/src/com/owncloud/android/lib/resources/shares/OCShare.java +++ b/src/com/owncloud/android/lib/resources/shares/OCShare.java @@ -226,8 +226,8 @@ public class OCShare implements Parcelable, Serializable { if (mName.length() > 0) { return mName; } - if (mPath.length() > 0) { - return (new File(mPath)).getName(); + if (mToken.length() > 0) { + return mToken; } return ""; } From e80b50d4de40efd362a2d2561326f4a05014b34a Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 3 May 2017 09:09:27 +0200 Subject: [PATCH 05/12] Get public share name instead of token when using public share getName method and there's no name --- .../owncloud/android/lib/resources/shares/OCShare.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/OCShare.java b/src/com/owncloud/android/lib/resources/shares/OCShare.java index e3763b36..55c99ae1 100644 --- a/src/com/owncloud/android/lib/resources/shares/OCShare.java +++ b/src/com/owncloud/android/lib/resources/shares/OCShare.java @@ -223,13 +223,7 @@ public class OCShare implements Parcelable, Serializable { } public String getName() { - if (mName.length() > 0) { - return mName; - } - if (mToken.length() > 0) { - return mToken; - } - return ""; + return mName; } public void setName(String name) { From 8ae4dd137df99939939789716e53c4aa225cf8c6 Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 3 May 2017 13:56:05 +0200 Subject: [PATCH 06/12] Added multiple share links to the capabilities --- .../status/GetRemoteCapabilitiesOperation.java | 5 +++++ .../lib/resources/status/OCCapability.java | 18 ++++++++++++------ .../lib/resources/status/OwnCloudVersion.java | 6 ++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java index 87095024..43d76586 100644 --- a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java +++ b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java @@ -94,6 +94,7 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { private static final String PROPERTY_DAYS = "days"; private static final String PROPERTY_SEND_MAIL = "send_mail"; private static final String PROPERTY_UPLOAD = "upload"; + private static final String PROPERTY_MULTIPLE = "multiple"; private static final String PROPERTY_RESHARING = "resharing"; private static final String PROPERTY_OUTGOING = "outgoing"; private static final String PROPERTY_INCOMING = "incoming"; @@ -205,6 +206,10 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { capability.setFilesSharingPublicUpload(CapabilityBooleanType.fromBooleanValue( respPublic.getBoolean(PROPERTY_UPLOAD))); } + if (respPublic.has(PROPERTY_MULTIPLE)) { + capability.setFilesSharingPublicMultiple(CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_MULTIPLE))); + } } if (respFilesSharing.has(NODE_USER)) { diff --git a/src/com/owncloud/android/lib/resources/status/OCCapability.java b/src/com/owncloud/android/lib/resources/status/OCCapability.java index 111f59ad..be7827c1 100644 --- a/src/com/owncloud/android/lib/resources/status/OCCapability.java +++ b/src/com/owncloud/android/lib/resources/status/OCCapability.java @@ -54,6 +54,7 @@ public class OCCapability { private CapabilityBooleanType mFilesSharingPublicExpireDateEnforced; private CapabilityBooleanType mFilesSharingPublicSendMail; private CapabilityBooleanType mFilesSharingPublicUpload; + private CapabilityBooleanType mFilesSharingPublicMultiple; private CapabilityBooleanType mFilesSharingUserSendMail; @@ -67,7 +68,7 @@ public class OCCapability { private CapabilityBooleanType mFilesUndelete; private CapabilityBooleanType mFilesVersioning; - public OCCapability(){ + public OCCapability() { mId = 0; mAccountName = ""; @@ -87,6 +88,7 @@ public class OCCapability { mFilesSharingPublicExpireDateEnforced = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicUpload = CapabilityBooleanType.UNKNOWN; + mFilesSharingPublicMultiple = CapabilityBooleanType.UNKNOWN; mFilesSharingUserSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingResharing = CapabilityBooleanType.UNKNOWN; mFilesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN; @@ -229,6 +231,14 @@ public class OCCapability { this.mFilesSharingPublicUpload = filesSharingPublicUpload; } + public CapabilityBooleanType getFilesSharingPublicMultiple() { + return mFilesSharingPublicMultiple; + } + + public void setFilesSharingPublicMultiple(CapabilityBooleanType filesSharingPublicMultiple) { + this.mFilesSharingPublicMultiple = filesSharingPublicMultiple; + } + public CapabilityBooleanType getFilesSharingUserSendMail() { return mFilesSharingUserSendMail; } @@ -244,7 +254,7 @@ public class OCCapability { public void setFilesSharingResharing(CapabilityBooleanType filesSharingResharing) { this.mFilesSharingResharing = filesSharingResharing; } - + public CapabilityBooleanType getFilesSharingFederationOutgoing() { return mFilesSharingFederationOutgoing; } @@ -284,8 +294,4 @@ public class OCCapability { public void setFilesVersioning(CapabilityBooleanType filesVersioning) { this.mFilesVersioning = filesVersioning; } - - - - } diff --git a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index 2da2e564..0c8ea27a 100644 --- a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -48,6 +48,8 @@ public class OwnCloudVersion implements Comparable { private static final int MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE = 0x09010301; // 9.1.3.1, final 9.1.3: https://github.com/owncloud/core/commit/f9a867b70c217463289a741d4d26079eb2a80dfd + private static final int MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA0000000; + private static final String INVALID_ZERO_VERSION = "0.0.0"; private static final int MAX_DOTS = 3; @@ -193,4 +195,8 @@ public class OwnCloudVersion implements Comparable { (mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE) ); } + + public boolean isMultiplePublicSharingSupported() { + return (mVersion >= MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING); + } } From 6d0773cf34122a4a7fcf4f06da1a6fec7a64e32d Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Fri, 5 May 2017 09:46:03 +0200 Subject: [PATCH 07/12] Add support for capability to show optional warning about public shares --- .../status/GetRemoteCapabilitiesOperation.java | 8 ++++++++ .../android/lib/resources/status/OCCapability.java | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java index 43d76586..5a9e9b26 100644 --- a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java +++ b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java @@ -98,6 +98,7 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { private static final String PROPERTY_RESHARING = "resharing"; private static final String PROPERTY_OUTGOING = "outgoing"; private static final String PROPERTY_INCOMING = "incoming"; + private static final String PROPERTY_PRIVACY_WARNING = "privacy_warning"; private static final String PROPERTY_BIGFILECHUNKING = "bigfilechunking"; private static final String PROPERTY_UNDELETE = "undelete"; @@ -210,6 +211,13 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { capability.setFilesSharingPublicMultiple(CapabilityBooleanType.fromBooleanValue( respPublic.getBoolean(PROPERTY_MULTIPLE))); } + if (respPublic.has(PROPERTY_PRIVACY_WARNING)) { + capability.setFilesSharingPublicDisplayPrivacyWarning( + CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_PRIVACY_WARNING) + ) + ); + } } if (respFilesSharing.has(NODE_USER)) { diff --git a/src/com/owncloud/android/lib/resources/status/OCCapability.java b/src/com/owncloud/android/lib/resources/status/OCCapability.java index be7827c1..7437fbf6 100644 --- a/src/com/owncloud/android/lib/resources/status/OCCapability.java +++ b/src/com/owncloud/android/lib/resources/status/OCCapability.java @@ -67,6 +67,7 @@ public class OCCapability { private CapabilityBooleanType mFilesBigFileChuncking; private CapabilityBooleanType mFilesUndelete; private CapabilityBooleanType mFilesVersioning; + private CapabilityBooleanType mFilesSharingPublicDisplayPrivacyWarning; public OCCapability() { mId = 0; @@ -89,6 +90,7 @@ public class OCCapability { mFilesSharingPublicSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicUpload = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicMultiple = CapabilityBooleanType.UNKNOWN; + mFilesSharingPublicDisplayPrivacyWarning = CapabilityBooleanType.UNKNOWN; mFilesSharingUserSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingResharing = CapabilityBooleanType.UNKNOWN; mFilesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN; @@ -239,6 +241,15 @@ public class OCCapability { this.mFilesSharingPublicMultiple = filesSharingPublicMultiple; } + public CapabilityBooleanType getFilesSharingPublicDisplayPrivacyWarning() { + return mFilesSharingPublicDisplayPrivacyWarning; + } + + public void setFilesSharingPublicDisplayPrivacyWarning( + CapabilityBooleanType filesSharingPublicDisplayPrivacyWarning + ) { + mFilesSharingPublicDisplayPrivacyWarning = filesSharingPublicDisplayPrivacyWarning; + } public CapabilityBooleanType getFilesSharingUserSendMail() { return mFilesSharingUserSendMail; } @@ -294,4 +305,5 @@ public class OCCapability { public void setFilesVersioning(CapabilityBooleanType filesVersioning) { this.mFilesVersioning = filesVersioning; } + } From 8f5ac456ab8af7b40cec587221f56bdf8b6f05b0 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Fri, 5 May 2017 12:57:55 +0200 Subject: [PATCH 08/12] Prevent send of empty value for expiration date and link name when public share is created --- .../operations/RemoteOperationResult.java | 2 +- .../shares/CreateRemoteShareOperation.java | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index d20cf213..b39f394b 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -255,7 +255,7 @@ public class RemoteOperationResult implements Serializable { ErrorMessageParser xmlParser = new ErrorMessageParser(); try { String errorMessage = xmlParser.parseXMLResponse(is); - if (errorMessage != null && errorMessage != "") { + if (errorMessage != null && errorMessage.length() > 0) { mCode = ResultCode.SPECIFIC_FORBIDDEN; mHttpPhrase = errorMessage; } diff --git a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java index e2930e49..c7b232ba 100644 --- a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java @@ -64,7 +64,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { /** * Name to set for the public link */ - private String mName; + private String mName = ""; /** * Password to set for the public link @@ -74,7 +74,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { /** * Expiration date to set for the public link */ - private long mExpirationDateInMillis; + private long mExpirationDateInMillis = 0; /** * Access permissions for the file bound to the share @@ -128,16 +128,18 @@ public class CreateRemoteShareOperation extends RemoteOperation { /** * Set name to create in Share resource. Ignored by servers previous to version 10.0.0 * - * @param name Name to set to the target share. + * @param name Name to set to the target share. + * Null or empty string result in no value set for the name. */ public void setName(String name) { - this.mName = name; + this.mName = (name == null) ? "" : name; } /** * Set password to create in Share resource. * * @param password Password to set to the target share. + * Null or empty string result in no value set for the password. */ public void setPassword(String password) { mPassword = password; @@ -148,6 +150,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { * Set expiration date to create in Share resource. * * @param expirationDateInMillis Expiration date to set to the target share. + * Zero or negative value results in no value sent for expiration date. */ public void setExpirationDate(long expirationDateInMillis) { mExpirationDateInMillis = expirationDateInMillis; @@ -158,7 +161,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { * Set permissions to create in Share resource. * * @param permissions Permissions to set to the target share. - * Values <= 0 result in no update applied to the permissions. + * Values <= 0 result in value set to the permissions. */ public void setPermissions(int permissions) { mPermissions = permissions; @@ -200,16 +203,11 @@ public class CreateRemoteShareOperation extends RemoteOperation { post.addParameter(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())); post.addParameter(PARAM_SHARE_WITH, mShareWith); - if (mName != null) { + if (mName.length() > 0) { post.addParameter(PARAM_NAME, mName); } - if (mExpirationDateInMillis < 0) { - // empty expiration date - post.addParameter(PARAM_EXPIRATION_DATE, ""); - - } else { - + if (mExpirationDateInMillis > 0) { DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()); Calendar expirationDate = Calendar.getInstance(); expirationDate.setTimeInMillis(mExpirationDateInMillis); From beb9be05de7a29c5bd6599a137b3544477fd6086 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 9 May 2017 09:05:21 +0200 Subject: [PATCH 09/12] Fix hide + button to create a public share in servers <10 --- .../owncloud/android/lib/resources/status/OwnCloudVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index 0c8ea27a..3fec06ee 100644 --- a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -48,7 +48,7 @@ public class OwnCloudVersion implements Comparable { private static final int MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE = 0x09010301; // 9.1.3.1, final 9.1.3: https://github.com/owncloud/core/commit/f9a867b70c217463289a741d4d26079eb2a80dfd - private static final int MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA0000000; + private static final int MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA000000; private static final String INVALID_ZERO_VERSION = "0.0.0"; From a034338290c20f423794e0725ee4fcb0e49681bf Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 9 May 2017 18:18:22 +0200 Subject: [PATCH 10/12] Fix wrong or no update parameter given in servers < 10 --- .../lib/resources/shares/UpdateRemoteShareOperation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java index b64dd009..69261cd2 100644 --- a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java @@ -168,9 +168,10 @@ public class UpdateRemoteShareOperation extends RemoteOperation { /// prepare array of parameters to update List> parametersToUpdate = new ArrayList<>(); - if (mName != null) { + if (mName.length() > 0) { parametersToUpdate.add(new Pair<>(PARAM_NAME, mName)); } + if (mPassword != null) { parametersToUpdate.add(new Pair<>(PARAM_PASSWORD, mPassword)); } @@ -254,5 +255,4 @@ public class UpdateRemoteShareOperation extends RemoteOperation { } return result; } - } From c9a06fc5e43de432e7984232281d180357073ede Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Wed, 10 May 2017 15:34:22 +0200 Subject: [PATCH 11/12] Fix NullPointerException in update of public shares while keeping compatibility of the operation with servers not supporting 'name' property in shares --- .../lib/resources/shares/UpdateRemoteShareOperation.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java index 69261cd2..fa5bb3f9 100644 --- a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ b/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java @@ -168,7 +168,7 @@ public class UpdateRemoteShareOperation extends RemoteOperation { /// prepare array of parameters to update List> parametersToUpdate = new ArrayList<>(); - if (mName.length() > 0) { + if (mName != null) { parametersToUpdate.add(new Pair<>(PARAM_NAME, mName)); } @@ -236,7 +236,11 @@ public class UpdateRemoteShareOperation extends RemoteOperation { } else { result = new RemoteOperationResult(false, put); } - if (!result.isSuccess()) { + if (!result.isSuccess() && + !PARAM_NAME.equals(parameter.first) + // fail in "name" parameter will be ignored; requires OCX, will fail + // fails in previous versions + ) { break; } } From defbfc8d0eb8dd0c1c8281caabda81e64625a13a Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 11 May 2017 09:57:47 +0200 Subject: [PATCH 12/12] Revert "Add support for capability to show optional warning about public shares" This reverts commit 6d0773cf34122a4a7fcf4f06da1a6fec7a64e32d. --- .../status/GetRemoteCapabilitiesOperation.java | 8 -------- .../android/lib/resources/status/OCCapability.java | 12 ------------ 2 files changed, 20 deletions(-) diff --git a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java index 5a9e9b26..43d76586 100644 --- a/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java +++ b/src/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java @@ -98,7 +98,6 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { private static final String PROPERTY_RESHARING = "resharing"; private static final String PROPERTY_OUTGOING = "outgoing"; private static final String PROPERTY_INCOMING = "incoming"; - private static final String PROPERTY_PRIVACY_WARNING = "privacy_warning"; private static final String PROPERTY_BIGFILECHUNKING = "bigfilechunking"; private static final String PROPERTY_UNDELETE = "undelete"; @@ -211,13 +210,6 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { capability.setFilesSharingPublicMultiple(CapabilityBooleanType.fromBooleanValue( respPublic.getBoolean(PROPERTY_MULTIPLE))); } - if (respPublic.has(PROPERTY_PRIVACY_WARNING)) { - capability.setFilesSharingPublicDisplayPrivacyWarning( - CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_PRIVACY_WARNING) - ) - ); - } } if (respFilesSharing.has(NODE_USER)) { diff --git a/src/com/owncloud/android/lib/resources/status/OCCapability.java b/src/com/owncloud/android/lib/resources/status/OCCapability.java index 7437fbf6..be7827c1 100644 --- a/src/com/owncloud/android/lib/resources/status/OCCapability.java +++ b/src/com/owncloud/android/lib/resources/status/OCCapability.java @@ -67,7 +67,6 @@ public class OCCapability { private CapabilityBooleanType mFilesBigFileChuncking; private CapabilityBooleanType mFilesUndelete; private CapabilityBooleanType mFilesVersioning; - private CapabilityBooleanType mFilesSharingPublicDisplayPrivacyWarning; public OCCapability() { mId = 0; @@ -90,7 +89,6 @@ public class OCCapability { mFilesSharingPublicSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicUpload = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicMultiple = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicDisplayPrivacyWarning = CapabilityBooleanType.UNKNOWN; mFilesSharingUserSendMail = CapabilityBooleanType.UNKNOWN; mFilesSharingResharing = CapabilityBooleanType.UNKNOWN; mFilesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN; @@ -241,15 +239,6 @@ public class OCCapability { this.mFilesSharingPublicMultiple = filesSharingPublicMultiple; } - public CapabilityBooleanType getFilesSharingPublicDisplayPrivacyWarning() { - return mFilesSharingPublicDisplayPrivacyWarning; - } - - public void setFilesSharingPublicDisplayPrivacyWarning( - CapabilityBooleanType filesSharingPublicDisplayPrivacyWarning - ) { - mFilesSharingPublicDisplayPrivacyWarning = filesSharingPublicDisplayPrivacyWarning; - } public CapabilityBooleanType getFilesSharingUserSendMail() { return mFilesSharingUserSendMail; } @@ -305,5 +294,4 @@ public class OCCapability { public void setFilesVersioning(CapabilityBooleanType filesVersioning) { this.mFilesVersioning = filesVersioning; } - }