From 54283c0ba963e72ccbd8e600be07714b45e4e8fb Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 3 Jan 2019 14:33:03 +0100 Subject: [PATCH 01/37] Rename OCShare to RemoteShare --- .../shares/CreateRemoteShareOperation.java | 4 +- .../shares/{OCShare.java => RemoteShare.java} | 46 +- .../resources/shares/ShareParserResult.java | 6 +- .../shares/SharePermissionsBuilder.java | 14 +- .../ShareToRemoteOperationResultParser.java | 6 +- .../lib/resources/shares/ShareXMLParser.java | 611 +++++++++--------- .../shares/UpdateRemoteShareOperation.java | 2 +- 7 files changed, 335 insertions(+), 354 deletions(-) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/{OCShare.java => RemoteShare.java} (91%) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java index 631af0ee..9faeff67 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java @@ -214,7 +214,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { if (mPassword != null && mPassword.length() > 0) { formBodyBuilder.add(PARAM_PASSWORD, mPassword); } - if (OCShare.DEFAULT_PERMISSION != mPermissions) { + if (RemoteShare.DEFAULT_PERMISSION != mPermissions) { formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)); } @@ -245,7 +245,7 @@ public class CreateRemoteShareOperation extends RemoteOperation { // TODO Use executeHttpMethod // retrieve more info - POST only returns the index of the new share - OCShare emptyShare = result.getData().getShares().get(0); + RemoteShare emptyShare = result.getData().getShares().get(0); GetRemoteShareOperation getInfo = new GetRemoteShareOperation( emptyShare.getRemoteId() ); diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java similarity index 91% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java index 72bccd50..2a01e71a 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/OCShare.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java @@ -34,6 +34,7 @@ import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.files.FileUtils; + /** * Contains the data of a Share from the Share API * @@ -41,7 +42,14 @@ import com.owncloud.android.lib.resources.files.FileUtils; * @author David A. Velasco * @author David González Verdugo */ -public class OCShare implements Parcelable, Serializable { +public class RemoteShare implements Parcelable, Serializable { + + /** + * Generated - should be refreshed every time the class changes!! + */ + private static final long serialVersionUID = 4124975224281327921L; + + private static final String TAG = RemoteShare.class.getSimpleName(); /** * Generated - should be refreshed every time the class changes!! @@ -80,7 +88,6 @@ public class OCShare implements Parcelable, Serializable { FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + SHARE_PERMISSION_FLAG; - private long mId; private long mFileSource; private long mItemSource; private ShareType mShareType; @@ -98,16 +105,16 @@ public class OCShare implements Parcelable, Serializable { private long mRemoteId; private String mShareLink; - public OCShare() { + public RemoteShare() { super(); resetData(); } - public OCShare(String path) { + public RemoteShare(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); + Log_OC.e(TAG, "Trying to create a RemoteShare with a non valid path"); + throw new IllegalArgumentException("Trying to create a RemoteShare with a non valid path: " + path); } mPath = path; } @@ -116,7 +123,6 @@ public class OCShare implements Parcelable, Serializable { * Used internally. Reset all file properties */ private void resetData() { - mId = -1; mFileSource = 0; mItemSource = 0; mShareType = ShareType.NO_SHARED; @@ -136,15 +142,6 @@ public class OCShare implements Parcelable, Serializable { } /// Getters and Setters - - public long getId() { - return mId; - } - - public void setId(long id) { - mId = id; - } - public long getFileSource() { return mFileSource; } @@ -280,15 +277,15 @@ public class OCShare implements Parcelable, Serializable { /** * Parcelable Methods */ - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override - public OCShare createFromParcel(Parcel source) { - return new OCShare(source); + public RemoteShare createFromParcel(Parcel source) { + return new RemoteShare(source); } @Override - public OCShare[] newArray(int size) { - return new OCShare[size]; + public RemoteShare[] newArray(int size) { + return new RemoteShare[size]; } }; @@ -297,13 +294,11 @@ public class OCShare implements Parcelable, Serializable { * * @param source The source parcel */ - protected OCShare(Parcel source) { + protected RemoteShare(Parcel source) { readFromParcel(source); } public void readFromParcel(Parcel source) { - mId = source.readLong(); - mFileSource = source.readLong(); mItemSource = source.readLong(); try { @@ -335,7 +330,6 @@ public class OCShare implements Parcelable, Serializable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeLong(mId); dest.writeLong(mFileSource); dest.writeLong(mItemSource); dest.writeString((mShareType == null) ? "" : mShareType.name()); @@ -353,4 +347,4 @@ public class OCShare implements Parcelable, Serializable { dest.writeString(mShareLink); dest.writeString(mName); } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java index c98fd6e3..a03a5839 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java @@ -28,15 +28,15 @@ package com.owncloud.android.lib.resources.shares; import java.util.ArrayList; public class ShareParserResult { - private ArrayList shares; + private ArrayList shares; private String parserMessage; - public ShareParserResult(ArrayList shares, String parserMessage) { + public ShareParserResult(ArrayList shares, String parserMessage) { this.shares = shares; this.parserMessage = parserMessage; } - public ArrayList getShares() { + public ArrayList getShares() { return shares; } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java index 2b0682dd..a38d7970 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java @@ -31,10 +31,8 @@ package com.owncloud.android.lib.resources.shares; */ public class SharePermissionsBuilder { - /** - * Set of permissions - */ - private int mPermissions = OCShare.READ_PERMISSION_FLAG; // READ is minimum permission + /** Set of permissions */ + private int mPermissions = RemoteShare.READ_PERMISSION_FLAG; // READ is minimum permission /** * Sets or clears permission to reshare a file or folder. @@ -43,7 +41,7 @@ public class SharePermissionsBuilder { * @return Instance to builder itself, to allow consecutive calls to setters */ public SharePermissionsBuilder setSharePermission(boolean enabled) { - updatePermission(OCShare.SHARE_PERMISSION_FLAG, enabled); + updatePermission(RemoteShare.SHARE_PERMISSION_FLAG, enabled); return this; } @@ -54,7 +52,7 @@ public class SharePermissionsBuilder { * @return Instance to builder itself, to allow consecutive calls to setters */ public SharePermissionsBuilder setUpdatePermission(boolean enabled) { - updatePermission(OCShare.UPDATE_PERMISSION_FLAG, enabled); + updatePermission(RemoteShare.UPDATE_PERMISSION_FLAG, enabled); return this; } @@ -65,7 +63,7 @@ public class SharePermissionsBuilder { * @return Instance to builder itself, to allow consecutive calls to setters */ public SharePermissionsBuilder setCreatePermission(boolean enabled) { - updatePermission(OCShare.CREATE_PERMISSION_FLAG, enabled); + updatePermission(RemoteShare.CREATE_PERMISSION_FLAG, enabled); return this; } @@ -76,7 +74,7 @@ public class SharePermissionsBuilder { * @return Instance to builder itself, to allow consecutive calls to setters */ public SharePermissionsBuilder setDeletePermission(boolean enabled) { - updatePermission(OCShare.DELETE_PERMISSION_FLAG, enabled); + updatePermission(RemoteShare.DELETE_PERMISSION_FLAG, enabled); return this; } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java index 5b6aa671..8292ca02 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java @@ -71,7 +71,7 @@ public class ShareToRemoteOperationResultParser { } RemoteOperationResult result; - final ArrayList resultData = new ArrayList<>(); + final ArrayList resultData = new ArrayList<>(); try { // Parse xml response and obtain the list of shares @@ -80,13 +80,13 @@ public class ShareToRemoteOperationResultParser { Log_OC.w(TAG, "No ShareXmlParser provided, creating new instance "); mShareXmlParser = new ShareXMLParser(); } - List shares = mShareXmlParser.parseXMLResponse(is); + List shares = mShareXmlParser.parseXMLResponse(is); if (mShareXmlParser.isSuccess()) { if ((shares != null && shares.size() > 0) || !mOneOrMoreSharesRequired) { result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.OK); if (shares != null) { - for (OCShare share : shares) { + for (RemoteShare share : shares) { resultData.add(share); // build the share link if not in the response // (needed for OC servers < 9.0.0, see ShareXMLParser.java#line256) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java index a6265e1a..fb8e877c 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java @@ -78,375 +78,364 @@ public class ShareXMLParser { private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname"; private static final String NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info"; private static final String NODE_NAME = "name"; + + private static final String NODE_URL = "url"; - private static final String NODE_URL = "url"; + private static final String TYPE_FOLDER = "folder"; + + private static final int SUCCESS = 200; + private static final int ERROR_WRONG_PARAMETER = 400; + private static final int ERROR_FORBIDDEN = 403; + private static final int ERROR_NOT_FOUND = 404; - private static final String TYPE_FOLDER = "folder"; + private String mStatus; + private int mStatusCode; + private String mMessage; - private static final int SUCCESS = 200; - private static final int ERROR_WRONG_PARAMETER = 400; - private static final int ERROR_FORBIDDEN = 403; - private static final int ERROR_NOT_FOUND = 404; + // Getters and Setters + public String getStatus() { + return mStatus; + } - private String mStatus; - private int mStatusCode; - private String mMessage; + public void setStatus(String status) { + this.mStatus = status; + } - // Getters and Setters - public String getStatus() { - return mStatus; - } + public int getStatusCode() { + return mStatusCode; + } - public void setStatus(String status) { - this.mStatus = status; - } + public void setStatusCode(int statusCode) { + this.mStatusCode = statusCode; + } - public int getStatusCode() { - return mStatusCode; - } + public String getMessage() { + return mMessage; + } - public void setStatusCode(int statusCode) { - this.mStatusCode = statusCode; - } + public void setMessage(String message) { + this.mMessage = message; + } - public String getMessage() { - return mMessage; - } + // Constructor + public ShareXMLParser() { + mStatusCode = -1; + } - public void setMessage(String message) { - this.mMessage = message; - } + public boolean isSuccess() { + return mStatusCode == SUCCESS; + } - // Constructor - public ShareXMLParser() { - mStatusCode = -1; - } + public boolean isForbidden() { + return mStatusCode == ERROR_FORBIDDEN; + } - public boolean isSuccess() { - return mStatusCode == SUCCESS; - } + public boolean isNotFound() { + return mStatusCode == ERROR_NOT_FOUND; + } - public boolean isForbidden() { - return mStatusCode == ERROR_FORBIDDEN; - } + public boolean isWrongParameter() { + return mStatusCode == ERROR_WRONG_PARAMETER; + } - public boolean isNotFound() { - return mStatusCode == ERROR_NOT_FOUND; - } + /** + * Parse is as response of Share API + * @param is + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + public ArrayList parseXMLResponse(InputStream is) throws XmlPullParserException, + IOException { - public boolean isWrongParameter() { - return mStatusCode == ERROR_WRONG_PARAMETER; - } + try { + // XMLPullParser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); - /** - * Parse is as response of Share API - * - * @param is - * @return List of ShareRemoteFiles - * @throws XmlPullParserException - * @throws IOException - */ - public ArrayList parseXMLResponse(InputStream is) throws XmlPullParserException, - IOException { + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, null); + parser.nextTag(); + return readOCS(parser); - try { - // XMLPullParser - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); + } finally { + is.close(); + } + } - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(is, null); - parser.nextTag(); - return readOCS(parser); + /** + * Parse OCS node + * @param parser + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readOCS (XmlPullParser parser) throws XmlPullParserException, + IOException { + ArrayList shares = new ArrayList<>(); + parser.require(XmlPullParser.START_TAG, ns , NODE_OCS); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // read NODE_META and NODE_DATA + if (name.equalsIgnoreCase(NODE_META)) { + readMeta(parser); + } else if (name.equalsIgnoreCase(NODE_DATA)) { + shares = readData(parser); + } else { + skip(parser); + } - } finally { - is.close(); - } - } + } + return shares; + } - /** - * Parse OCS node - * - * @param parser - * @return List of ShareRemoteFiles - * @throws XmlPullParserException - * @throws IOException - */ - private ArrayList readOCS(XmlPullParser parser) throws XmlPullParserException, - IOException { - ArrayList shares = new ArrayList<>(); - parser.require(XmlPullParser.START_TAG, ns, NODE_OCS); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - // read NODE_META and NODE_DATA - if (name.equalsIgnoreCase(NODE_META)) { - readMeta(parser); - } else if (name.equalsIgnoreCase(NODE_DATA)) { - shares = readData(parser); - } else { - skip(parser); - } + /** + * Parse Meta node + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_META); + //Log_OC.d(TAG, "---- NODE META ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); - } - return shares; - } + if (name.equalsIgnoreCase(NODE_STATUS)) { + setStatus(readNode(parser, NODE_STATUS)); - /** - * Parse Meta node - * - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { - parser.require(XmlPullParser.START_TAG, ns, NODE_META); - //Log_OC.d(TAG, "---- NODE META ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); + } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { + setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); - if (name.equalsIgnoreCase(NODE_STATUS)) { - setStatus(readNode(parser, NODE_STATUS)); + } else if (name.equalsIgnoreCase(NODE_MESSAGE)) { + setMessage(readNode(parser, NODE_MESSAGE)); - } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { - setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); + } else { + skip(parser); + } - } else if (name.equalsIgnoreCase(NODE_MESSAGE)) { - setMessage(readNode(parser, NODE_MESSAGE)); + } + } - } else { - skip(parser); - } + /** + * Parse Data node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, + IOException { + ArrayList shares = new ArrayList(); + RemoteShare share = null; - } - } + parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); + //Log_OC.d(TAG, "---- NODE DATA ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + readElement(parser, shares); + + } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response + share = new RemoteShare(); + String value = readNode(parser, NODE_ID); + share.setIdRemoteShared(Integer.parseInt(value)); - /** - * Parse Data node - * - * @param parser - * @return - * @throws XmlPullParserException - * @throws IOException - */ - private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, - IOException { - ArrayList shares = new ArrayList(); - OCShare share = null; + } 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); - parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); - //Log_OC.d(TAG, "---- NODE DATA ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - if (name.equalsIgnoreCase(NODE_ELEMENT)) { - readElement(parser, shares); + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); - } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response - share = new OCShare(); - String value = readNode(parser, NODE_ID); - share.setIdRemoteShared(Integer.parseInt(value)); + } else { + skip(parser); + + } + } + + if (share != null) { + // this is the response of a request for creation; don't pass to isValidShare() + shares.add(share); + } - } 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); + return shares; - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - - } else { - skip(parser); - - } - } - - if (share != null) { - // this is the response of a request for creation; don't pass to isValidShare() - shares.add(share); - } - - return shares; - - } + } - /** - * Parse Element node - * - * @param parser - * @return - * @throws XmlPullParserException - * @throws IOException - */ - private void readElement(XmlPullParser parser, ArrayList shares) - throws XmlPullParserException, IOException { - parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); + /** + * Parse Element node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private void readElement(XmlPullParser parser, ArrayList shares) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); + + RemoteShare share = new RemoteShare(); + + //Log_OC.d(TAG, "---- NODE ELEMENT ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + + String name = parser.getName(); - OCShare share = new OCShare(); + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + // 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); - //Log_OC.d(TAG, "---- NODE ELEMENT ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } + } else if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); - String name = parser.getName(); + } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { + share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + fixPathForFolder(share); - if (name.equalsIgnoreCase(NODE_ELEMENT)) { - // 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_ITEM_SOURCE)) { + share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); - } else if (name.equalsIgnoreCase(NODE_ID)) { - share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + } else if (name.equalsIgnoreCase(NODE_PARENT)) { + readNode(parser, NODE_PARENT); - } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { - share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); - fixPathForFolder(share); + } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) { + int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); + share.setShareType(ShareType.fromValue(value)); - } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { - share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { + share.setShareWith(readNode(parser, NODE_SHARE_WITH)); - } else if (name.equalsIgnoreCase(NODE_PARENT)) { - readNode(parser, NODE_PARENT); + } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { + share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); - } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) { - int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); - share.setShareType(ShareType.fromValue(value)); + } else if (name.equalsIgnoreCase(NODE_PATH)) { + share.setPath(readNode(parser, NODE_PATH)); + fixPathForFolder(share); - } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { - share.setShareWith(readNode(parser, NODE_SHARE_WITH)); + } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { + share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); - } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { - share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); + } else if (name.equalsIgnoreCase(NODE_STIME)) { + share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); - } else if (name.equalsIgnoreCase(NODE_PATH)) { - share.setPath(readNode(parser, NODE_PATH)); - fixPathForFolder(share); + } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { + String value = readNode(parser, NODE_EXPIRATION); + if (!(value.length() == 0)) { + share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime()); + } - } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { - share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); - } else if (name.equalsIgnoreCase(NODE_STIME)) { - share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); + } else if (name.equalsIgnoreCase(NODE_STORAGE)) { + readNode(parser, NODE_STORAGE); + } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { + readNode(parser, NODE_MAIL_SEND); - } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { - String value = readNode(parser, NODE_EXPIRATION); - if (!(value.length() == 0)) { - share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime()); - } + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { + share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - - } else if (name.equalsIgnoreCase(NODE_STORAGE)) { - readNode(parser, NODE_STORAGE); - } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { - readNode(parser, NODE_MAIL_SEND); - - } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { - share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); - - } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_ADDITIONAL_INFO)) { - share.setSharedWithAdditionalInfo(readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO)); - - } else if (name.equalsIgnoreCase(NODE_URL)) { - String value = readNode(parser, NODE_URL); - share.setShareLink(value); + } else if (name.equalsIgnoreCase(NODE_URL)) { + String value = readNode(parser, NODE_URL); + share.setShareLink(value); } else if (name.equalsIgnoreCase(NODE_NAME)) { share.setName(readNode(parser, NODE_NAME)); } else { - skip(parser); - } - } + skip(parser); + } + } - if (isValidShare(share)) { - shares.add(share); - } - } + if (isValidShare(share)) { + shares.add(share); + } + } - private boolean isValidShare(OCShare share) { - return (share.getRemoteId() > -1); - } + private boolean isValidShare(RemoteShare share) { + return (share.getRemoteId() > -1); + } - private void fixPathForFolder(OCShare share) { - if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && - !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { - share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); - } - } + private void fixPathForFolder(RemoteShare share) { + if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && + !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { + share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); + } + } - /** - * Parse a node, to obtain its text. Needs readText method - * - * @param parser - * @param node - * @return Text of the node - * @throws XmlPullParserException - * @throws IOException - */ - private String readNode(XmlPullParser parser, String node) throws XmlPullParserException, - IOException { - parser.require(XmlPullParser.START_TAG, ns, node); - String value = readText(parser); - //Log_OC.d(TAG, "node= " + node + ", value= " + value); - parser.require(XmlPullParser.END_TAG, ns, node); - return value; - } + /** + * Parse a node, to obtain its text. Needs readText method + * @param parser + * @param node + * @return Text of the node + * @throws XmlPullParserException + * @throws IOException + */ + private String readNode (XmlPullParser parser, String node) throws XmlPullParserException, + IOException{ + parser.require(XmlPullParser.START_TAG, ns, node); + String value = readText(parser); + //Log_OC.d(TAG, "node= " + node + ", value= " + value); + parser.require(XmlPullParser.END_TAG, ns, node); + return value; + } + + /** + * Read the text from a node + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } - /** - * Read the text from a node - * - * @param parser - * @return Text of the node - * @throws IOException - * @throws XmlPullParserException - */ - private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { - String result = ""; - if (parser.next() == XmlPullParser.TEXT) { - result = parser.getText(); - parser.nextTag(); - } - return result; - } - - /** - * Skip tags in parser procedure - * - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { - if (parser.getEventType() != XmlPullParser.START_TAG) { - throw new IllegalStateException(); - } - int depth = 1; - while (depth != 0) { - switch (parser.next()) { - case XmlPullParser.END_TAG: - depth--; - break; - case XmlPullParser.START_TAG: - depth++; - break; - } - } - } + /** + * Skip tags in parser procedure + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java index 0122d86e..83bb4d37 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java @@ -99,7 +99,7 @@ public class UpdateRemoteShareOperation extends RemoteOperation Date: Wed, 6 Feb 2019 18:07:25 +0100 Subject: [PATCH 02/37] Use different type for remoteId --- .../lib/resources/shares/RemoveRemoteShareOperation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java index c3edaa2d..facf141f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java @@ -50,7 +50,7 @@ public class RemoveRemoteShareOperation extends RemoteOperation { private static final String TAG = RemoveRemoteShareOperation.class.getSimpleName(); - private int mRemoteShareId; + private long mRemoteShareId; /** * Constructor @@ -58,7 +58,7 @@ public class RemoveRemoteShareOperation extends RemoteOperation { * @param remoteShareId Share ID */ - public RemoveRemoteShareOperation(int remoteShareId) { + public RemoveRemoteShareOperation(long remoteShareId) { mRemoteShareId = remoteShareId; } From 0b3c8a7bf8417aa23475d7604b5274be37922c09 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 19 Feb 2019 17:54:45 +0100 Subject: [PATCH 03/37] Make OwnCloudVersion parcelable --- .../lib/resources/status/OwnCloudVersion.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index 04b8800c..c8fd34a4 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -25,7 +25,10 @@ package com.owncloud.android.lib.resources.status; -public class OwnCloudVersion implements Comparable { +import android.os.Parcel; +import android.os.Parcelable; + +public class OwnCloudVersion implements Comparable, Parcelable { public static final int MINIMUN_VERSION_FOR_CHUNKED_UPLOADS = 0x04050000; // 4.5 @@ -196,4 +199,15 @@ public class OwnCloudVersion implements Comparable { public boolean isPublicSharingWriteOnlySupported() { return (mVersion >= MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING); } + + @Override + public int describeContents() { + return super.hashCode(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mVersion); + dest.writeInt(mIsValid ? 1 : 0); + } } From 3c6f476176bbc7184c7a5fb1e94892218a50861b Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 27 Feb 2019 12:37:04 +0100 Subject: [PATCH 04/37] Fix conflicts with master --- .../owncloud/android/lib/resources/shares/RemoteShare.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java index 2a01e71a..5d340524 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java @@ -51,13 +51,6 @@ public class RemoteShare implements Parcelable, Serializable { private static final String TAG = RemoteShare.class.getSimpleName(); - /** - * Generated - should be refreshed every time the class changes!! - */ - private static final long serialVersionUID = 4124975224281327921L; - - private static final String TAG = OCShare.class.getSimpleName(); - public static final int DEFAULT_PERMISSION = -1; public static final int READ_PERMISSION_FLAG = 1; public static final int UPDATE_PERMISSION_FLAG = 2; From 91ffc87014dc7b7995beea443ab24b5d85101dfe Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 1 Mar 2019 12:20:08 +0100 Subject: [PATCH 05/37] Convert used classes to Kotlin --- owncloudComLibrary/build.gradle | 4 +- .../shares/CreateRemoteShareOperation.java | 269 ----------- .../shares/CreateRemoteShareOperation.kt | 252 ++++++++++ .../lib/resources/shares/RemoteShare.java | 343 -------------- .../lib/resources/shares/RemoteShare.kt | 241 ++++++++++ ...ion.java => RemoveRemoteShareOperation.kt} | 93 ++-- ...ParserResult.java => ShareParserResult.kt} | 22 +- ...uilder.java => SharePermissionsBuilder.kt} | 44 +- .../ShareToRemoteOperationResultParser.java | 140 ------ .../ShareToRemoteOperationResultParser.kt | 142 ++++++ .../lib/resources/shares/ShareXMLParser.java | 441 ------------------ .../lib/resources/shares/ShareXMLParser.kt | 415 ++++++++++++++++ .../shares/UpdateRemoteShareOperation.java | 233 --------- .../shares/UpdateRemoteShareOperation.kt | 232 +++++++++ .../lib/resources/status/OwnCloudVersion.java | 213 --------- .../lib/resources/status/OwnCloudVersion.kt | 202 ++++++++ 16 files changed, 1555 insertions(+), 1731 deletions(-) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/{RemoveRemoteShareOperation.java => RemoveRemoteShareOperation.kt} (50%) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/{ShareParserResult.java => ShareParserResult.kt} (71%) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/{SharePermissionsBuilder.java => SharePermissionsBuilder.kt} (77%) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt diff --git a/owncloudComLibrary/build.gradle b/owncloudComLibrary/build.gradle index 3dce97b1..3b04c31f 100644 --- a/owncloudComLibrary/build.gradle +++ b/owncloudComLibrary/build.gradle @@ -1,8 +1,10 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' dependencies { api 'com.squareup.okhttp3:okhttp:3.12.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.11" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" api 'com.gitlab.ownclouders:dav4android:oc_support_1.0.1' } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java deleted file mode 100644 index 9faeff67..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ /dev/null @@ -1,269 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod; -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 okhttp3.FormBody; - -import java.net.URL; -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. - * - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - */ -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_PERMISSIONS = "permissions"; - private static final String FORMAT_EXPIRATION_DATE = "yyyy-MM-dd"; - - private String mRemoteFilePath; - private ShareType mShareType; - private String mShareWith; - 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 = 0; - - /** - * Access permissions for the file bound to the share - */ - private int mPermissions; - - /** - * Upload permissions for the public link (only folders) - */ - private Boolean mPublicUpload; - - /** - * Constructor - * - * @param remoteFilePath Full path of the file/folder being shared. Mandatory argument - * @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument - * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType - * of 0 or 1 - * @param publicUpload If false (default) public cannot upload to a public shared folder. - * If true public can upload to a shared folder. Only available for public link shares - * @param password Password to protect a public link share. Only available for public link shares - * @param permissions 1 - Read only Default for public shares - * 2 - Update - * 4 - Create - * 8 - Delete - * 16- Re-share - * 31- All above Default for private shares - * For user or group shares. - * To obtain combinations, add the desired values together. - * 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 - ) { - - mRemoteFilePath = remoteFilePath; - mShareType = shareType; - mShareWith = shareWith; - mPublicUpload = publicUpload; - mPassword = password; - mPermissions = permissions; - 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. - * Null or empty string result in no value set for the name. - */ - public void setName(String 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; - } - - /** - * 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; - } - - /** - * Set permissions to create in Share resource. - * - * @param permissions Permissions to set to the target share. - * Values <= 0 result in value set 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 void setGetShareDetails(boolean set) { - mGetShareDetails = set; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; - - try { - FormBody.Builder formBodyBuilder = new FormBody.Builder() - .add(PARAM_PATH, mRemoteFilePath) - .add(PARAM_SHARE_TYPE, Integer.toString(mShareType.getValue())) - .add(PARAM_SHARE_WITH, mShareWith); - - if (mName.length() > 0) { - formBodyBuilder.add(PARAM_NAME, mName); - } - - if (mExpirationDateInMillis > 0) { - DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()); - Calendar expirationDate = Calendar.getInstance(); - expirationDate.setTimeInMillis(mExpirationDateInMillis); - String formattedExpirationDate = dateFormat.format(expirationDate.getTime()); - formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate); - } - - if (mPublicUpload) { - formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, Boolean.toString(true)); - } - if (mPassword != null && mPassword.length() > 0) { - formBodyBuilder.add(PARAM_PASSWORD, mPassword); - } - if (RemoteShare.DEFAULT_PERMISSION != mPermissions) { - formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)); - } - - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon(); - uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH); - - PostMethod postMethod = new PostMethod(new URL(uriBuilder.build().toString())); - - postMethod.setRequestBody(formBodyBuilder.build()); - - postMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8); - postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.executeHttpMethod(postMethod); - - ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser( - new ShareXMLParser() - ); - - if (isSuccess(status)) { - parser.setOneOrMoreSharesRequired(true); - parser.setOwnCloudVersion(client.getOwnCloudVersion()); - parser.setServerBaseUri(client.getBaseUri()); - result = parser.parse(postMethod.getResponseBodyAsString()); - - if (result.isSuccess() && mGetShareDetails) { - - // TODO Use executeHttpMethod - // retrieve more info - POST only returns the index of the new share - RemoteShare emptyShare = result.getData().getShares().get(0); - GetRemoteShareOperation getInfo = new GetRemoteShareOperation( - emptyShare.getRemoteId() - ); - result = getInfo.execute(client); - } - - } else { - result = parser.parse(postMethod.getResponseBodyAsString()); - } - - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Exception while Creating New Share", e); - } - return result; - } - - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt new file mode 100644 index 00000000..01cbfc3a --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -0,0 +1,252 @@ +/* ownCloud Android Library is available under MIT license + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod +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 okhttp3.FormBody +import java.net.URL +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. + * + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + */ +class CreateRemoteShareOperation +/** + * Constructor + * + * @param remoteFilePath Full path of the file/folder being shared. Mandatory argument + * @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument + * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType + * of 0 or 1 + * @param publicUpload If false (default) public cannot upload to a public shared folder. + * If true public can upload to a shared folder. Only available for public link shares + * @param password Password to protect a public link share. Only available for public link shares + * @param permissions 1 - Read only Default for public shares + * 2 - Update + * 4 - Create + * 8 - Delete + * 16- Re-share + * 31- All above Default for private shares + * For user or group shares. + * To obtain combinations, add the desired values together. + * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. + */ + ( + private val mRemoteFilePath: String, + private val mShareType: ShareType, + private val mShareWith: String, + /** + * Upload permissions for the public link (only folders) + */ + private var mPublicUpload: Boolean?, + /** + * Password to set for the public link + */ + private var mPassword: String?, + /** + * Access permissions for the file bound to the share + */ + private var mPermissions: Int +) : RemoteOperation() { + private var mGetShareDetails: Boolean = false + + /** + * Name to set for the public link + */ + private var mName = "" + + /** + * Expiration date to set for the public link + */ + private var mExpirationDateInMillis: Long = 0 + + init { + 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. + * Null or empty string result in no value set for the name. + */ + fun setName(name: String?) { + this.mName = 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. + */ + fun setPassword(password: String) { + mPassword = password + } + + /** + * 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. + */ + fun setExpirationDate(expirationDateInMillis: Long) { + mExpirationDateInMillis = expirationDateInMillis + } + + /** + * Set permissions to create in Share resource. + * + * @param permissions Permissions to set to the target share. + * Values <= 0 result in value set to the permissions. + */ + fun setPermissions(permissions: Int) { + 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. + */ + fun setPublicUpload(publicUpload: Boolean?) { + mPublicUpload = publicUpload + } + + fun setGetShareDetails(set: Boolean) { + mGetShareDetails = set + } + + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + try { + val formBodyBuilder = FormBody.Builder() + .add(PARAM_PATH, mRemoteFilePath) + .add(PARAM_SHARE_TYPE, Integer.toString(mShareType.value)) + .add(PARAM_SHARE_WITH, mShareWith) + + if (mName.length > 0) { + formBodyBuilder.add(PARAM_NAME, mName) + } + + if (mExpirationDateInMillis > 0) { + val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) + val expirationDate = Calendar.getInstance() + expirationDate.timeInMillis = mExpirationDateInMillis + val formattedExpirationDate = dateFormat.format(expirationDate.time) + formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate) + } + + if (mPublicUpload!!) { + formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, java.lang.Boolean.toString(true)) + } + if (mPassword != null && mPassword!!.length > 0) { + formBodyBuilder.add(PARAM_PASSWORD, mPassword!!) + } + if (RemoteShare.DEFAULT_PERMISSION != mPermissions) { + formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)) + } + + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) + + val postMethod = PostMethod(URL(uriBuilder.build().toString())) + + postMethod.setRequestBody(formBodyBuilder.build()) + + postMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8) + postMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + + val status = client.executeHttpMethod(postMethod) + + val parser = ShareToRemoteOperationResultParser( + ShareXMLParser() + ) + + if (isSuccess(status)) { + parser.setOneOrMoreSharesRequired(true) + parser.setOwnCloudVersion(client.ownCloudVersion) + parser.setServerBaseUri(client.baseUri) + result = parser.parse(postMethod.responseBodyAsString) + + if (result.isSuccess && mGetShareDetails) { + + // TODO Use executeHttpMethod + // retrieve more info - POST only returns the index of the new share + val emptyShare = result.data.shares[0] + val getInfo = GetRemoteShareOperation( + emptyShare.remoteId + ) + result = getInfo.execute(client) + } + + } else { + result = parser.parse(postMethod.responseBodyAsString) + } + + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while Creating New Share", e) + } + + return result + } + + private fun isSuccess(status: Int): Boolean { + return status == HttpConstants.HTTP_OK + } + + companion object { + + private val TAG = CreateRemoteShareOperation::class.java.simpleName + + private val PARAM_NAME = "name" + private val PARAM_PASSWORD = "password" + private val PARAM_EXPIRATION_DATE = "expireDate" + private val PARAM_PUBLIC_UPLOAD = "publicUpload" + private val PARAM_PATH = "path" + private val PARAM_SHARE_TYPE = "shareType" + private val PARAM_SHARE_WITH = "shareWith" + private val PARAM_PERMISSIONS = "permissions" + private val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java deleted file mode 100644 index 5d340524..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.java +++ /dev/null @@ -1,343 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import java.io.File; -import java.io.Serializable; - -import android.os.Parcel; -import android.os.Parcelable; - -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.files.FileUtils; - - - -/** - * Contains the data of a Share from the Share API - * - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - */ -public class RemoteShare implements Parcelable, Serializable { - - /** - * Generated - should be refreshed every time the class changes!! - */ - private static final long serialVersionUID = 4124975224281327921L; - - private static final String TAG = RemoteShare.class.getSimpleName(); - - public static final int DEFAULT_PERMISSION = -1; - public static final int READ_PERMISSION_FLAG = 1; - public static final int UPDATE_PERMISSION_FLAG = 2; - public static final int CREATE_PERMISSION_FLAG = 4; - public static final int DELETE_PERMISSION_FLAG = 8; - 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; - public static final int MAXIMUM_PERMISSIONS_FOR_FOLDER = - MAXIMUM_PERMISSIONS_FOR_FILE + - CREATE_PERMISSION_FLAG + - DELETE_PERMISSION_FLAG; - public static final int FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9 = - READ_PERMISSION_FLAG + - UPDATE_PERMISSION_FLAG; - public static final int FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9 = - READ_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; - public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = - FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + - SHARE_PERMISSION_FLAG; - - private long mFileSource; - private long mItemSource; - private ShareType mShareType; - private String mShareWith; - private String mPath; - private int mPermissions; - private long mSharedDate; - private long mExpirationDate; - private String mToken; - private String mSharedWithDisplayName; - private String mSharedWithAdditionalInfo; - private String mName; - private boolean mIsFolder; - private long mUserId; - private long mRemoteId; - private String mShareLink; - - public RemoteShare() { - super(); - resetData(); - } - - public RemoteShare(String path) { - resetData(); - if (path == null || path.length() <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) { - Log_OC.e(TAG, "Trying to create a RemoteShare with a non valid path"); - throw new IllegalArgumentException("Trying to create a RemoteShare with a non valid path: " + path); - } - mPath = path; - } - - /** - * Used internally. Reset all file properties - */ - private void resetData() { - mFileSource = 0; - mItemSource = 0; - mShareType = ShareType.NO_SHARED; - mShareWith = ""; - mPath = ""; - mPermissions = -1; - mSharedDate = 0; - mExpirationDate = 0; - mToken = ""; - mSharedWithDisplayName = ""; - mSharedWithAdditionalInfo = ""; - mIsFolder = false; - mUserId = -1; - mRemoteId = -1; - mShareLink = ""; - mName = ""; - } - - /// Getters and Setters - public long getFileSource() { - return mFileSource; - } - - public void setFileSource(long fileSource) { - this.mFileSource = fileSource; - } - - public long getItemSource() { - return mItemSource; - } - - public void setItemSource(long itemSource) { - this.mItemSource = itemSource; - } - - public ShareType getShareType() { - return mShareType; - } - - public void setShareType(ShareType shareType) { - this.mShareType = shareType; - } - - public String getShareWith() { - return mShareWith; - } - - public void setShareWith(String shareWith) { - this.mShareWith = (shareWith != null) ? shareWith : ""; - } - - public String getPath() { - return mPath; - } - - public void setPath(String path) { - this.mPath = (path != null) ? path : ""; - } - - public int getPermissions() { - return mPermissions; - } - - public void setPermissions(int permissions) { - this.mPermissions = permissions; - } - - public long getSharedDate() { - return mSharedDate; - } - - public void setSharedDate(long sharedDate) { - this.mSharedDate = sharedDate; - } - - public long getExpirationDate() { - return mExpirationDate; - } - - public void setExpirationDate(long expirationDate) { - this.mExpirationDate = expirationDate; - } - - public String getToken() { - return mToken; - } - - public void setToken(String token) { - this.mToken = (token != null) ? token : ""; - } - - public String getSharedWithDisplayName() { - return mSharedWithDisplayName; - } - - public void setSharedWithDisplayName(String sharedWithDisplayName) { - this.mSharedWithDisplayName = (sharedWithDisplayName != null) ? sharedWithDisplayName : ""; - } - - public String getSharedWithAdditionalInfo() { - return mSharedWithAdditionalInfo; - } - - public void setSharedWithAdditionalInfo(String sharedWithAdditionalInfo) { - this.mSharedWithAdditionalInfo = sharedWithAdditionalInfo; - } - - public String getName() { - return mName; - } - - public void setName(String name) { - mName = (name != null) ? name : ""; - } - - public boolean isFolder() { - return mIsFolder; - } - - public void setIsFolder(boolean isFolder) { - this.mIsFolder = isFolder; - } - - public long getUserId() { - return mUserId; - } - - public void setUserId(long userId) { - this.mUserId = userId; - } - - public long getRemoteId() { - return mRemoteId; - } - - public void setIdRemoteShared(long remoteId) { - this.mRemoteId = remoteId; - } - - public String getShareLink() { - return this.mShareLink; - } - - public void setShareLink(String shareLink) { - this.mShareLink = (shareLink != null) ? shareLink : ""; - } - - public boolean isPasswordProtected() { - return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0; - } - - /** - * Parcelable Methods - */ - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public RemoteShare createFromParcel(Parcel source) { - return new RemoteShare(source); - } - - @Override - public RemoteShare[] newArray(int size) { - return new RemoteShare[size]; - } - }; - - /** - * Reconstruct from parcel - * - * @param source The source parcel - */ - protected RemoteShare(Parcel source) { - readFromParcel(source); - } - - public void readFromParcel(Parcel source) { - mFileSource = source.readLong(); - mItemSource = source.readLong(); - try { - mShareType = ShareType.valueOf(source.readString()); - } catch (IllegalArgumentException x) { - mShareType = ShareType.NO_SHARED; - } - mShareWith = source.readString(); - mPath = source.readString(); - mPermissions = source.readInt(); - mSharedDate = source.readLong(); - mExpirationDate = source.readLong(); - mToken = source.readString(); - mSharedWithDisplayName = source.readString(); - mSharedWithAdditionalInfo = source.readString(); - mIsFolder = source.readInt() == 0; - mUserId = source.readLong(); - mRemoteId = source.readLong(); - mShareLink = source.readString(); - mName = source.readString(); - } - - - @Override - public int describeContents() { - return this.hashCode(); - } - - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeLong(mFileSource); - dest.writeLong(mItemSource); - dest.writeString((mShareType == null) ? "" : mShareType.name()); - dest.writeString(mShareWith); - dest.writeString(mPath); - dest.writeInt(mPermissions); - dest.writeLong(mSharedDate); - dest.writeLong(mExpirationDate); - dest.writeString(mToken); - dest.writeString(mSharedWithDisplayName); - dest.writeString(mSharedWithAdditionalInfo); - dest.writeInt(mIsFolder ? 1 : 0); - dest.writeLong(mUserId); - dest.writeLong(mRemoteId); - dest.writeString(mShareLink); - dest.writeString(mName); - } -} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt new file mode 100644 index 00000000..64baee1b --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -0,0 +1,241 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import android.os.Parcel +import android.os.Parcelable +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.files.FileUtils +import java.io.Serializable + +/** + * Contains the data of a Share from the Share API + * + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + */ +class RemoteShare : Parcelable, Serializable { + + /// Getters and Setters + var fileSource: Long = 0 + var itemSource: Long = 0 + var shareType: ShareType? = null + private var mShareWith: String? = null + private var mPath: String? = null + var permissions: Int = 0 + var sharedDate: Long = 0 + var expirationDate: Long = 0 + private var mToken: String? = null + private var mSharedWithDisplayName: String? = null + var sharedWithAdditionalInfo: String? = null + private var mName: String? = null + var isFolder: Boolean = false + var userId: Long = 0 + var remoteId: Long = 0 + private set + private var mShareLink: String? = null + + var shareWith: String? + get() = mShareWith + set(shareWith) { + this.mShareWith = shareWith ?: "" + } + + var path: String? + get() = mPath + set(path) { + this.mPath = path ?: "" + } + + var token: String? + get() = mToken + set(token) { + this.mToken = token ?: "" + } + + var sharedWithDisplayName: String? + get() = mSharedWithDisplayName + set(sharedWithDisplayName) { + this.mSharedWithDisplayName = sharedWithDisplayName ?: "" + } + + var name: String? + get() = mName + set(name) { + mName = name ?: "" + } + + var shareLink: String? + get() = this.mShareLink + set(shareLink) { + this.mShareLink = shareLink ?: "" + } + + val isPasswordProtected: Boolean + get() = ShareType.PUBLIC_LINK == shareType && mShareWith!!.length > 0 + + constructor() : super() { + resetData() + } + + constructor(path: String?) { + resetData() + if (path == null || path.length <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) { + Log_OC.e(TAG, "Trying to create a RemoteShare with a non valid path") + throw IllegalArgumentException("Trying to create a RemoteShare with a non valid path: " + path!!) + } + mPath = path + } + + /** + * Used internally. Reset all file properties + */ + private fun resetData() { + fileSource = 0 + itemSource = 0 + shareType = ShareType.NO_SHARED + mShareWith = "" + mPath = "" + permissions = -1 + sharedDate = 0 + expirationDate = 0 + mToken = "" + mSharedWithDisplayName = "" + sharedWithAdditionalInfo = "" + isFolder = false + userId = -1 + remoteId = -1 + mShareLink = "" + mName = "" + } + + fun setIdRemoteShared(remoteId: Long) { + this.remoteId = remoteId + } + + /** + * Reconstruct from parcel + * + * @param source The source parcel + */ + protected constructor(source: Parcel) { + readFromParcel(source) + } + + fun readFromParcel(source: Parcel) { + fileSource = source.readLong() + itemSource = source.readLong() + try { + shareType = ShareType.valueOf(source.readString()) + } catch (x: IllegalArgumentException) { + shareType = ShareType.NO_SHARED + } + + mShareWith = source.readString() + mPath = source.readString() + permissions = source.readInt() + sharedDate = source.readLong() + expirationDate = source.readLong() + mToken = source.readString() + mSharedWithDisplayName = source.readString() + sharedWithAdditionalInfo = source.readString() + isFolder = source.readInt() == 0 + userId = source.readLong() + remoteId = source.readLong() + mShareLink = source.readString() + mName = source.readString() + } + + override fun describeContents(): Int { + return this.hashCode() + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeLong(fileSource) + dest.writeLong(itemSource) + dest.writeString(if (shareType == null) "" else shareType!!.name) + dest.writeString(mShareWith) + dest.writeString(mPath) + dest.writeInt(permissions) + dest.writeLong(sharedDate) + dest.writeLong(expirationDate) + dest.writeString(mToken) + dest.writeString(mSharedWithDisplayName) + dest.writeString(sharedWithAdditionalInfo) + dest.writeInt(if (isFolder) 1 else 0) + dest.writeLong(userId) + dest.writeLong(remoteId) + dest.writeString(mShareLink) + dest.writeString(mName) + } + + companion object { + + /** + * Generated - should be refreshed every time the class changes!! + */ + private const val serialVersionUID = 4124975224281327921L + + private val TAG = RemoteShare::class.java.simpleName + + val DEFAULT_PERMISSION = -1 + val READ_PERMISSION_FLAG = 1 + val UPDATE_PERMISSION_FLAG = 2 + val CREATE_PERMISSION_FLAG = 4 + val DELETE_PERMISSION_FLAG = 8 + val SHARE_PERMISSION_FLAG = 16 + val MAXIMUM_PERMISSIONS_FOR_FILE = READ_PERMISSION_FLAG + + UPDATE_PERMISSION_FLAG + + SHARE_PERMISSION_FLAG + val MAXIMUM_PERMISSIONS_FOR_FOLDER = MAXIMUM_PERMISSIONS_FOR_FILE + + CREATE_PERMISSION_FLAG + + DELETE_PERMISSION_FLAG + val FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9 = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG + val FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9 = READ_PERMISSION_FLAG + + UPDATE_PERMISSION_FLAG + + SHARE_PERMISSION_FLAG + val FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 = READ_PERMISSION_FLAG + + UPDATE_PERMISSION_FLAG + + CREATE_PERMISSION_FLAG + + DELETE_PERMISSION_FLAG + val FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = + FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + SHARE_PERMISSION_FLAG + + /** + * Parcelable Methods + */ + @JvmField + val CREATOR: Parcelable.Creator = object : Parcelable.Creator { + override fun createFromParcel(source: Parcel): RemoteShare { + return RemoteShare(source) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt similarity index 50% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt index facf141f..6494a4c1 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt @@ -25,18 +25,15 @@ * */ -package com.owncloud.android.lib.resources.shares; +package com.owncloud.android.lib.resources.shares -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.DeleteMethod; -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.net.URL; +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.DeleteMethod +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.net.URL /** * Remove a share @@ -46,63 +43,59 @@ import java.net.URL; * @author David González Verdugo */ -public class RemoveRemoteShareOperation extends RemoteOperation { +class RemoveRemoteShareOperation +/** + * Constructor + * + * @param remoteShareId Share ID + */ + (private val mRemoteShareId: Long) : RemoteOperation() { - private static final String TAG = RemoveRemoteShareOperation.class.getSimpleName(); - - private long mRemoteShareId; - - /** - * Constructor - * - * @param remoteShareId Share ID - */ - - public RemoveRemoteShareOperation(long remoteShareId) { - mRemoteShareId = remoteShareId; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult try { - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon(); - uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH); - uriBuilder.appendEncodedPath(String.valueOf(mRemoteShareId)); + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) + uriBuilder.appendEncodedPath(mRemoteShareId.toString()) - DeleteMethod deleteMethod = new DeleteMethod( - new URL(uriBuilder.build().toString()) - ); + val deleteMethod = DeleteMethod( + URL(uriBuilder.build().toString()) + ) - deleteMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); + deleteMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) - int status = client.executeHttpMethod(deleteMethod); + val status = client.executeHttpMethod(deleteMethod) if (isSuccess(status)) { // Parse xml response and obtain the list of shares - ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser( - new ShareXMLParser() - ); - result = parser.parse(deleteMethod.getResponseBodyAsString()); + val parser = ShareToRemoteOperationResultParser( + ShareXMLParser() + ) + result = parser.parse(deleteMethod.responseBodyAsString) - Log_OC.d(TAG, "Unshare " + mRemoteShareId + ": " + result.getLogMessage()); + Log_OC.d(TAG, "Unshare " + mRemoteShareId + ": " + result.logMessage) } else { - result = new RemoteOperationResult<>(deleteMethod); + result = RemoteOperationResult(deleteMethod) } - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Unshare Link Exception " + result.getLogMessage(), e); + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Unshare Link Exception " + result.logMessage, e) } - return result; + return result } - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); + private fun isSuccess(status: Int): Boolean { + return status == HttpConstants.HTTP_OK + } + + companion object { + + private val TAG = RemoveRemoteShareOperation::class.java.simpleName } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt similarity index 71% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt index a03a5839..e4c0e9ed 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt @@ -23,24 +23,8 @@ * */ -package com.owncloud.android.lib.resources.shares; +package com.owncloud.android.lib.resources.shares -import java.util.ArrayList; +import java.util.ArrayList -public class ShareParserResult { - private ArrayList shares; - private String parserMessage; - - public ShareParserResult(ArrayList shares, String parserMessage) { - this.shares = shares; - this.parserMessage = parserMessage; - } - - public ArrayList getShares() { - return shares; - } - - public String getParserMessage() { - return parserMessage; - } -} \ No newline at end of file +class ShareParserResult(val shares: ArrayList, val parserMessage: String) \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt similarity index 77% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt index a38d7970..18be72d7 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt @@ -1,6 +1,6 @@ /* ownCloud Android Library is available under MIT license * @author David A. Velasco - * Copyright (C) 2016 ownCloud GmbH. + * Copyright (C) 2019 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 @@ -23,16 +23,16 @@ * */ -package com.owncloud.android.lib.resources.shares; +package com.owncloud.android.lib.resources.shares /** * Provides method to define a set of share permissions and calculate the appropiate * int value representing it. */ -public class SharePermissionsBuilder { +class SharePermissionsBuilder { - /** Set of permissions */ - private int mPermissions = RemoteShare.READ_PERMISSION_FLAG; // READ is minimum permission + /** Set of permissions */ + private var mPermissions = RemoteShare.READ_PERMISSION_FLAG // READ is minimum permission /** * Sets or clears permission to reshare a file or folder. @@ -40,9 +40,9 @@ public class SharePermissionsBuilder { * @param enabled 'True' to set, 'false' to clear. * @return Instance to builder itself, to allow consecutive calls to setters */ - public SharePermissionsBuilder setSharePermission(boolean enabled) { - updatePermission(RemoteShare.SHARE_PERMISSION_FLAG, enabled); - return this; + fun setSharePermission(enabled: Boolean): SharePermissionsBuilder { + updatePermission(RemoteShare.SHARE_PERMISSION_FLAG, enabled) + return this } /** @@ -51,9 +51,9 @@ public class SharePermissionsBuilder { * @param enabled 'True' to set, 'false' to clear. * @return Instance to builder itself, to allow consecutive calls to setters */ - public SharePermissionsBuilder setUpdatePermission(boolean enabled) { - updatePermission(RemoteShare.UPDATE_PERMISSION_FLAG, enabled); - return this; + fun setUpdatePermission(enabled: Boolean): SharePermissionsBuilder { + updatePermission(RemoteShare.UPDATE_PERMISSION_FLAG, enabled) + return this } /** @@ -62,9 +62,9 @@ public class SharePermissionsBuilder { * @param enabled 'True' to set, 'false' to clear. * @return Instance to builder itself, to allow consecutive calls to setters */ - public SharePermissionsBuilder setCreatePermission(boolean enabled) { - updatePermission(RemoteShare.CREATE_PERMISSION_FLAG, enabled); - return this; + fun setCreatePermission(enabled: Boolean): SharePermissionsBuilder { + updatePermission(RemoteShare.CREATE_PERMISSION_FLAG, enabled) + return this } /** @@ -73,9 +73,9 @@ public class SharePermissionsBuilder { * @param enabled 'True' to set, 'false' to clear. * @return Instance to builder itself, to allow consecutive calls to setters */ - public SharePermissionsBuilder setDeletePermission(boolean enabled) { - updatePermission(RemoteShare.DELETE_PERMISSION_FLAG, enabled); - return this; + fun setDeletePermission(enabled: Boolean): SharePermissionsBuilder { + updatePermission(RemoteShare.DELETE_PERMISSION_FLAG, enabled) + return this } /** @@ -84,13 +84,13 @@ public class SharePermissionsBuilder { * @param permissionsFlag Flag for the permission to update. * @param enable 'True' to set, 'false' to clear. */ - private void updatePermission(int permissionsFlag, boolean enable) { + private fun updatePermission(permissionsFlag: Int, enable: Boolean) { if (enable) { // add permission - mPermissions |= permissionsFlag; + mPermissions = mPermissions or permissionsFlag } else { // delete permission - mPermissions &= ~permissionsFlag; + mPermissions = mPermissions and permissionsFlag.inv() } } @@ -99,7 +99,7 @@ public class SharePermissionsBuilder { * * @return An int value representing the accumulated set of permissions. */ - public int build() { - return mPermissions; + fun build(): Int { + return mPermissions } } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java deleted file mode 100644 index 8292ca02..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.java +++ /dev/null @@ -1,140 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * @author David A. Velasco - * @author David González Verdugo - * @author Christian Schabesberger - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.net.Uri; - -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.status.OwnCloudVersion; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -public class ShareToRemoteOperationResultParser { - - private static final String TAG = ShareToRemoteOperationResultParser.class.getSimpleName(); - - private ShareXMLParser mShareXmlParser = null; - private boolean mOneOrMoreSharesRequired = false; - private OwnCloudVersion mOwnCloudVersion = null; - private Uri mServerBaseUri = null; - - public ShareToRemoteOperationResultParser(ShareXMLParser shareXmlParser) { - mShareXmlParser = shareXmlParser; - } - - public void setOneOrMoreSharesRequired(boolean oneOrMoreSharesRequired) { - mOneOrMoreSharesRequired = oneOrMoreSharesRequired; - } - - public void setOwnCloudVersion(OwnCloudVersion ownCloudVersion) { - mOwnCloudVersion = ownCloudVersion; - } - - public void setServerBaseUri(Uri serverBaseURi) { - mServerBaseUri = serverBaseURi; - } - - public RemoteOperationResult parse(String serverResponse) { - if (serverResponse == null || serverResponse.length() == 0) { - return new RemoteOperationResult<>(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE); - } - - RemoteOperationResult result; - final ArrayList resultData = new ArrayList<>(); - - try { - // Parse xml response and obtain the list of shares - InputStream is = new ByteArrayInputStream(serverResponse.getBytes()); - if (mShareXmlParser == null) { - Log_OC.w(TAG, "No ShareXmlParser provided, creating new instance "); - mShareXmlParser = new ShareXMLParser(); - } - List shares = mShareXmlParser.parseXMLResponse(is); - - if (mShareXmlParser.isSuccess()) { - if ((shares != null && shares.size() > 0) || !mOneOrMoreSharesRequired) { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.OK); - if (shares != null) { - for (RemoteShare share : shares) { - resultData.add(share); - // 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) { - 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 :("); - } - } - } - } - result.setData(new ShareParserResult(resultData, "")); - - } else { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE); - Log_OC.e(TAG, "Successful status with no share in the response"); - } - - } else if (mShareXmlParser.isWrongParameter()) { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER); - result.setData(new ShareParserResult(null, mShareXmlParser.getMessage())); - - } else if (mShareXmlParser.isNotFound()) { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND); - result.setData(new ShareParserResult(null, mShareXmlParser.getMessage())); - - } else if (mShareXmlParser.isForbidden()) { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN); - result.setData(new ShareParserResult(null, mShareXmlParser.getMessage())); - - } else { - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE); - } - - } catch (XmlPullParserException e) { - Log_OC.e(TAG, "Error parsing response from server ", e); - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE); - - } catch (IOException e) { - Log_OC.e(TAG, "Error reading response from server ", e); - result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE); - } - - return result; - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt new file mode 100644 index 00000000..55786c41 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -0,0 +1,142 @@ +/* ownCloud Android Library is available under MIT license + * @author David A. Velasco + * @author David González Verdugo + * @author Christian Schabesberger + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import android.net.Uri + +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.resources.status.OwnCloudVersion +import org.xmlpull.v1.XmlPullParserException + +import java.io.ByteArrayInputStream +import java.io.IOException +import java.io.InputStream +import java.util.ArrayList + +class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { + + private var mShareXmlParser: ShareXMLParser? = null + private var mOneOrMoreSharesRequired = false + private var mOwnCloudVersion: OwnCloudVersion? = null + private var mServerBaseUri: Uri? = null + + init { + mShareXmlParser = shareXmlParser + } + + fun setOneOrMoreSharesRequired(oneOrMoreSharesRequired: Boolean) { + mOneOrMoreSharesRequired = oneOrMoreSharesRequired + } + + fun setOwnCloudVersion(ownCloudVersion: OwnCloudVersion) { + mOwnCloudVersion = ownCloudVersion + } + + fun setServerBaseUri(serverBaseURi: Uri) { + mServerBaseUri = serverBaseURi + } + + fun parse(serverResponse: String?): RemoteOperationResult { + if (serverResponse == null || serverResponse.length == 0) { + return RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + } + + var result: RemoteOperationResult + val resultData = ArrayList() + + try { + // Parse xml response and obtain the list of shares + val `is` = ByteArrayInputStream(serverResponse.toByteArray()) + if (mShareXmlParser == null) { + Log_OC.w(TAG, "No ShareXmlParser provided, creating new instance ") + mShareXmlParser = ShareXMLParser() + } + val shares = mShareXmlParser!!.parseXMLResponse(`is`) + + if (mShareXmlParser!!.isSuccess) { + if (shares != null && shares.size > 0 || !mOneOrMoreSharesRequired) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) + if (shares != null) { + for (share in shares) { + resultData.add(share) + // build the share link if not in the response + // (needed for OC servers < 9.0.0, see ShareXMLParser.java#line256) + if (share.shareType == ShareType.PUBLIC_LINK + && (share.shareLink == null || share.shareLink!!.length <= 0) + && share.token!!.length > 0 + ) { + if (mServerBaseUri != null) { + val sharingLinkPath = ShareUtils.getSharingLinkPath(mOwnCloudVersion) + share.shareLink = mServerBaseUri.toString() + sharingLinkPath + share.token + } else { + Log_OC.e(TAG, "Couldn't build link for public share :(") + } + } + } + } + result.setData(ShareParserResult(resultData, "")) + + } else { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + Log_OC.e(TAG, "Successful status with no share in the response") + } + + } else if (mShareXmlParser!!.isWrongParameter) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER) + result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) + + } else if (mShareXmlParser!!.isNotFound) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) + result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) + + } else if (mShareXmlParser!!.isForbidden) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN) + result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) + + } else { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + } + + } catch (e: XmlPullParserException) { + Log_OC.e(TAG, "Error parsing response from server ", e) + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + + } catch (e: IOException) { + Log_OC.e(TAG, "Error reading response from server ", e) + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + } + + return result + } + + companion object { + + private val TAG = ShareToRemoteOperationResultParser::class.java.simpleName + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java deleted file mode 100644 index fb8e877c..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java +++ /dev/null @@ -1,441 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.util.Xml; - -import com.owncloud.android.lib.common.network.WebdavUtils; -import com.owncloud.android.lib.resources.files.FileUtils; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; - -/** - * Parser for Share API Response - * - * @author masensio - * @author David González Verdugo - */ - -public class ShareXMLParser { - - //private static final String TAG = ShareXMLParser.class.getSimpleName(); - - // No namespaces - private static final String ns = null; - - // NODES for XML Parser - private static final String NODE_OCS = "ocs"; - - private static final String NODE_META = "meta"; - private static final String NODE_STATUS = "status"; - private static final String NODE_STATUS_CODE = "statuscode"; - private static final String NODE_MESSAGE = "message"; - - private static final String NODE_DATA = "data"; - private static final String NODE_ELEMENT = "element"; - private static final String NODE_ID = "id"; - private static final String NODE_ITEM_TYPE = "item_type"; - private static final String NODE_ITEM_SOURCE = "item_source"; - private static final String NODE_PARENT = "parent"; - private static final String NODE_SHARE_TYPE = "share_type"; - private static final String NODE_SHARE_WITH = "share_with"; - private static final String NODE_FILE_SOURCE = "file_source"; - private static final String NODE_PATH = "path"; - private static final String NODE_PERMISSIONS = "permissions"; - private static final String NODE_STIME = "stime"; - private static final String NODE_EXPIRATION = "expiration"; - private static final String NODE_TOKEN = "token"; - 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_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info"; - private static final String NODE_NAME = "name"; - - private static final String NODE_URL = "url"; - - private static final String TYPE_FOLDER = "folder"; - - private static final int SUCCESS = 200; - private static final int ERROR_WRONG_PARAMETER = 400; - private static final int ERROR_FORBIDDEN = 403; - private static final int ERROR_NOT_FOUND = 404; - - private String mStatus; - private int mStatusCode; - private String mMessage; - - // Getters and Setters - public String getStatus() { - return mStatus; - } - - public void setStatus(String status) { - this.mStatus = status; - } - - public int getStatusCode() { - return mStatusCode; - } - - public void setStatusCode(int statusCode) { - this.mStatusCode = statusCode; - } - - public String getMessage() { - return mMessage; - } - - public void setMessage(String message) { - this.mMessage = message; - } - - // Constructor - public ShareXMLParser() { - mStatusCode = -1; - } - - public boolean isSuccess() { - return mStatusCode == SUCCESS; - } - - public boolean isForbidden() { - return mStatusCode == ERROR_FORBIDDEN; - } - - public boolean isNotFound() { - return mStatusCode == ERROR_NOT_FOUND; - } - - public boolean isWrongParameter() { - return mStatusCode == ERROR_WRONG_PARAMETER; - } - - /** - * Parse is as response of Share API - * @param is - * @return List of ShareRemoteFiles - * @throws XmlPullParserException - * @throws IOException - */ - public ArrayList parseXMLResponse(InputStream is) throws XmlPullParserException, - IOException { - - try { - // XMLPullParser - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); - - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(is, null); - parser.nextTag(); - return readOCS(parser); - - } finally { - is.close(); - } - } - - /** - * Parse OCS node - * @param parser - * @return List of ShareRemoteFiles - * @throws XmlPullParserException - * @throws IOException - */ - private ArrayList readOCS (XmlPullParser parser) throws XmlPullParserException, - IOException { - ArrayList shares = new ArrayList<>(); - parser.require(XmlPullParser.START_TAG, ns , NODE_OCS); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - // read NODE_META and NODE_DATA - if (name.equalsIgnoreCase(NODE_META)) { - readMeta(parser); - } else if (name.equalsIgnoreCase(NODE_DATA)) { - shares = readData(parser); - } else { - skip(parser); - } - - } - return shares; - } - - /** - * Parse Meta node - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { - parser.require(XmlPullParser.START_TAG, ns, NODE_META); - //Log_OC.d(TAG, "---- NODE META ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - - if (name.equalsIgnoreCase(NODE_STATUS)) { - setStatus(readNode(parser, NODE_STATUS)); - - } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { - setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); - - } else if (name.equalsIgnoreCase(NODE_MESSAGE)) { - setMessage(readNode(parser, NODE_MESSAGE)); - - } else { - skip(parser); - } - - } - } - - /** - * Parse Data node - * @param parser - * @return - * @throws XmlPullParserException - * @throws IOException - */ - private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, - IOException { - ArrayList shares = new ArrayList(); - RemoteShare share = null; - - parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); - //Log_OC.d(TAG, "---- NODE DATA ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - if (name.equalsIgnoreCase(NODE_ELEMENT)) { - readElement(parser, shares); - - } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response - share = new RemoteShare(); - String value = readNode(parser, NODE_ID); - 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); - - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - - } else { - skip(parser); - - } - } - - if (share != null) { - // this is the response of a request for creation; don't pass to isValidShare() - shares.add(share); - } - - return shares; - - } - - - /** - * Parse Element node - * @param parser - * @return - * @throws XmlPullParserException - * @throws IOException - */ - private void readElement(XmlPullParser parser, ArrayList shares) - throws XmlPullParserException, IOException { - parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); - - RemoteShare share = new RemoteShare(); - - //Log_OC.d(TAG, "---- NODE ELEMENT ---"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - - String name = parser.getName(); - - if (name.equalsIgnoreCase(NODE_ELEMENT)) { - // 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))); - - } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { - share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); - fixPathForFolder(share); - - } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { - share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); - - } else if (name.equalsIgnoreCase(NODE_PARENT)) { - readNode(parser, NODE_PARENT); - - } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) { - int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); - share.setShareType(ShareType.fromValue(value)); - - } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { - share.setShareWith(readNode(parser, NODE_SHARE_WITH)); - - } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { - share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); - - } else if (name.equalsIgnoreCase(NODE_PATH)) { - share.setPath(readNode(parser, NODE_PATH)); - fixPathForFolder(share); - - } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { - share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); - - } else if (name.equalsIgnoreCase(NODE_STIME)) { - share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); - - } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { - String value = readNode(parser, NODE_EXPIRATION); - if (!(value.length() == 0)) { - share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime()); - } - - } else if (name.equalsIgnoreCase(NODE_TOKEN)) { - share.setToken(readNode(parser, NODE_TOKEN)); - - } else if (name.equalsIgnoreCase(NODE_STORAGE)) { - readNode(parser, NODE_STORAGE); - } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { - readNode(parser, NODE_MAIL_SEND); - - } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { - share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); - - } else if (name.equalsIgnoreCase(NODE_URL)) { - String value = readNode(parser, NODE_URL); - share.setShareLink(value); - - } else if (name.equalsIgnoreCase(NODE_NAME)) { - share.setName(readNode(parser, NODE_NAME)); - - } else { - skip(parser); - } - } - - if (isValidShare(share)) { - shares.add(share); - } - } - - private boolean isValidShare(RemoteShare share) { - return (share.getRemoteId() > -1); - } - - private void fixPathForFolder(RemoteShare share) { - if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && - !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { - share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); - } - } - - /** - * Parse a node, to obtain its text. Needs readText method - * @param parser - * @param node - * @return Text of the node - * @throws XmlPullParserException - * @throws IOException - */ - private String readNode (XmlPullParser parser, String node) throws XmlPullParserException, - IOException{ - parser.require(XmlPullParser.START_TAG, ns, node); - String value = readText(parser); - //Log_OC.d(TAG, "node= " + node + ", value= " + value); - parser.require(XmlPullParser.END_TAG, ns, node); - return value; - } - - /** - * Read the text from a node - * @param parser - * @return Text of the node - * @throws IOException - * @throws XmlPullParserException - */ - private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { - String result = ""; - if (parser.next() == XmlPullParser.TEXT) { - result = parser.getText(); - parser.nextTag(); - } - return result; - } - - /** - * Skip tags in parser procedure - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { - if (parser.getEventType() != XmlPullParser.START_TAG) { - throw new IllegalStateException(); - } - int depth = 1; - while (depth != 0) { - switch (parser.next()) { - case XmlPullParser.END_TAG: - depth--; - break; - case XmlPullParser.START_TAG: - depth++; - break; - } - } - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt new file mode 100644 index 00000000..23f9435f --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -0,0 +1,415 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import android.util.Xml + +import com.owncloud.android.lib.common.network.WebdavUtils +import com.owncloud.android.lib.resources.files.FileUtils + +import org.xmlpull.v1.XmlPullParser +import org.xmlpull.v1.XmlPullParserException +import org.xmlpull.v1.XmlPullParserFactory + +import java.io.IOException +import java.io.InputStream +import java.util.ArrayList + +/** + * Parser for Share API Response + * + * @author masensio + * @author David González Verdugo + */ + +class ShareXMLParser { + + // Getters and Setters + var status: String? = null + var statusCode: Int = 0 + var message: String? = null + + val isSuccess: Boolean + get() = statusCode == SUCCESS + + val isForbidden: Boolean + get() = statusCode == ERROR_FORBIDDEN + + val isNotFound: Boolean + get() = statusCode == ERROR_NOT_FOUND + + val isWrongParameter: Boolean + get() = statusCode == ERROR_WRONG_PARAMETER + + // Constructor + init { + statusCode = -1 + } + + /** + * Parse is as response of Share API + * @param is + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + fun parseXMLResponse(`is`: InputStream): ArrayList { + + try { + // XMLPullParser + val factory = XmlPullParserFactory.newInstance() + factory.isNamespaceAware = true + + val parser = Xml.newPullParser() + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) + parser.setInput(`is`, null) + parser.nextTag() + return readOCS(parser) + + } finally { + `is`.close() + } + } + + /** + * Parse OCS node + * @param parser + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun readOCS(parser: XmlPullParser): ArrayList { + var shares = ArrayList() + parser.require(XmlPullParser.START_TAG, ns, NODE_OCS) + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + val name = parser.name + // read NODE_META and NODE_DATA + if (name.equals(NODE_META, ignoreCase = true)) { + readMeta(parser) + } else if (name.equals(NODE_DATA, ignoreCase = true)) { + shares = readData(parser) + } else { + skip(parser) + } + + } + return shares + } + + /** + * Parse Meta node + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun readMeta(parser: XmlPullParser) { + parser.require(XmlPullParser.START_TAG, ns, NODE_META) + //Log_OC.d(TAG, "---- NODE META ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + val name = parser.name + + if (name.equals(NODE_STATUS, ignoreCase = true)) { + status = readNode(parser, NODE_STATUS) + + } else if (name.equals(NODE_STATUS_CODE, ignoreCase = true)) { + statusCode = Integer.parseInt(readNode(parser, NODE_STATUS_CODE)) + + } else if (name.equals(NODE_MESSAGE, ignoreCase = true)) { + message = readNode(parser, NODE_MESSAGE) + + } else { + skip(parser) + } + + } + } + + /** + * Parse Data node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun readData(parser: XmlPullParser): ArrayList { + val shares = ArrayList() + var share: RemoteShare? = null + + parser.require(XmlPullParser.START_TAG, ns, NODE_DATA) + //Log_OC.d(TAG, "---- NODE DATA ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + val name = parser.name + if (name.equals(NODE_ELEMENT, ignoreCase = true)) { + readElement(parser, shares) + + } else if (name.equals(NODE_ID, ignoreCase = true)) {// Parse Create XML Response + share = RemoteShare() + val value = readNode(parser, NODE_ID) + share.setIdRemoteShared(Integer.parseInt(value).toLong()) + + } else if (name.equals(NODE_URL, ignoreCase = true)) { + // 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!!.shareType = ShareType.PUBLIC_LINK + val value = readNode(parser, NODE_URL) + share.shareLink = value + + } else if (name.equals(NODE_TOKEN, ignoreCase = true)) { + share!!.token = readNode(parser, NODE_TOKEN) + + } else { + skip(parser) + + } + } + + if (share != null) { + // this is the response of a request for creation; don't pass to isValidShare() + shares.add(share) + } + + return shares + + } + + /** + * Parse Element node + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun readElement(parser: XmlPullParser, shares: ArrayList) { + parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT) + + val share = RemoteShare() + + //Log_OC.d(TAG, "---- NODE ELEMENT ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.eventType != XmlPullParser.START_TAG) { + continue + } + + val name = parser.name + + if (name.equals(NODE_ELEMENT, ignoreCase = true)) { + // 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.equals(NODE_ID, ignoreCase = true)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID)).toLong()) + + } else if (name.equals(NODE_ITEM_TYPE, ignoreCase = true)) { + share.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) + fixPathForFolder(share) + + } else if (name.equals(NODE_ITEM_SOURCE, ignoreCase = true)) { + share.itemSource = java.lang.Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)) + + } else if (name.equals(NODE_PARENT, ignoreCase = true)) { + readNode(parser, NODE_PARENT) + + } else if (name.equals(NODE_SHARE_TYPE, ignoreCase = true)) { + val value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)) + share.shareType = ShareType.fromValue(value) + + } else if (name.equals(NODE_SHARE_WITH, ignoreCase = true)) { + share.shareWith = readNode(parser, NODE_SHARE_WITH) + + } else if (name.equals(NODE_FILE_SOURCE, ignoreCase = true)) { + share.fileSource = java.lang.Long.parseLong(readNode(parser, NODE_FILE_SOURCE)) + + } else if (name.equals(NODE_PATH, ignoreCase = true)) { + share.path = readNode(parser, NODE_PATH) + fixPathForFolder(share) + + } else if (name.equals(NODE_PERMISSIONS, ignoreCase = true)) { + share.permissions = Integer.parseInt(readNode(parser, NODE_PERMISSIONS)) + + } else if (name.equals(NODE_STIME, ignoreCase = true)) { + share.sharedDate = java.lang.Long.parseLong(readNode(parser, NODE_STIME)) + + } else if (name.equals(NODE_EXPIRATION, ignoreCase = true)) { + val value = readNode(parser, NODE_EXPIRATION) + if (value.length != 0) { + share.expirationDate = WebdavUtils.parseResponseDate(value)!!.time + } + + } else if (name.equals(NODE_TOKEN, ignoreCase = true)) { + share.token = readNode(parser, NODE_TOKEN) + + } else if (name.equals(NODE_STORAGE, ignoreCase = true)) { + readNode(parser, NODE_STORAGE) + } else if (name.equals(NODE_MAIL_SEND, ignoreCase = true)) { + readNode(parser, NODE_MAIL_SEND) + + } else if (name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true)) { + share.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) + + } else if (name.equals(NODE_URL, ignoreCase = true)) { + val value = readNode(parser, NODE_URL) + share.shareLink = value + + } else if (name.equals(NODE_NAME, ignoreCase = true)) { + share.name = readNode(parser, NODE_NAME) + + } else { + skip(parser) + } + } + + if (isValidShare(share)) { + shares.add(share) + } + } + + private fun isValidShare(share: RemoteShare): Boolean { + return share.remoteId > -1 + } + + private fun fixPathForFolder(share: RemoteShare) { + if (share.isFolder && share.path != null && share.path!!.length > 0 && + !share.path!!.endsWith(FileUtils.PATH_SEPARATOR) + ) { + share.path = share.path!! + FileUtils.PATH_SEPARATOR + } + } + + /** + * Parse a node, to obtain its text. Needs readText method + * @param parser + * @param node + * @return Text of the node + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun readNode(parser: XmlPullParser, node: String): String { + parser.require(XmlPullParser.START_TAG, ns, node) + val value = readText(parser) + //Log_OC.d(TAG, "node= " + node + ", value= " + value); + parser.require(XmlPullParser.END_TAG, ns, node) + return value + } + + /** + * Read the text from a node + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + @Throws(IOException::class, XmlPullParserException::class) + private fun readText(parser: XmlPullParser): String { + var result = "" + if (parser.next() == XmlPullParser.TEXT) { + result = parser.text + parser.nextTag() + } + return result + } + + /** + * Skip tags in parser procedure + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + @Throws(XmlPullParserException::class, IOException::class) + private fun skip(parser: XmlPullParser) { + if (parser.eventType != XmlPullParser.START_TAG) { + throw IllegalStateException() + } + var depth = 1 + while (depth != 0) { + when (parser.next()) { + XmlPullParser.END_TAG -> depth-- + XmlPullParser.START_TAG -> depth++ + } + } + } + + companion object { + + //private static final String TAG = ShareXMLParser.class.getSimpleName(); + + // No namespaces + private val ns: String? = null + + // NODES for XML Parser + private val NODE_OCS = "ocs" + + private val NODE_META = "meta" + private val NODE_STATUS = "status" + private val NODE_STATUS_CODE = "statuscode" + private val NODE_MESSAGE = "message" + + private val NODE_DATA = "data" + private val NODE_ELEMENT = "element" + private val NODE_ID = "id" + private val NODE_ITEM_TYPE = "item_type" + private val NODE_ITEM_SOURCE = "item_source" + private val NODE_PARENT = "parent" + private val NODE_SHARE_TYPE = "share_type" + private val NODE_SHARE_WITH = "share_with" + private val NODE_FILE_SOURCE = "file_source" + private val NODE_PATH = "path" + private val NODE_PERMISSIONS = "permissions" + private val NODE_STIME = "stime" + private val NODE_EXPIRATION = "expiration" + private val NODE_TOKEN = "token" + private val NODE_STORAGE = "storage" + private val NODE_MAIL_SEND = "mail_send" + private val NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname" + private val NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info" + private val NODE_NAME = "name" + + private val NODE_URL = "url" + + private val TYPE_FOLDER = "folder" + + private val SUCCESS = 200 + private val ERROR_WRONG_PARAMETER = 400 + private val ERROR_FORBIDDEN = 403 + private val ERROR_NOT_FOUND = 404 + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java deleted file mode 100644 index 83bb4d37..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ /dev/null @@ -1,233 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.PutMethod; -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 okhttp3.FormBody; - -import java.net.URL; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Locale; - -/** - * Updates parameters of an existing Share resource, known its remote ID. - *

- * Allow updating several parameters, triggering a request to the server per parameter. - * - * @author David A. Velasco - * @author David González Verdugo - */ - -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"; - private static final String PARAM_PUBLIC_UPLOAD = "publicUpload"; - private static final String FORMAT_EXPIRATION_DATE = "yyyy-MM-dd"; - private static final String ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded"; - private static final String ENTITY_CHARSET = "UTF-8"; - - /** - * Identifier of the share to update - */ - private long mRemoteId; - - /** - * 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; - private String mName; - - /** - * Constructor. No update is initialized by default, need to be applied with setters below. - * - * @param remoteId Identifier of the share to update. - */ - public UpdateRemoteShareOperation(long remoteId) { - mRemoteId = remoteId; - mPassword = null; // no update - mExpirationDateInMillis = 0; // no update - mPublicUpload = null; - mPermissions = RemoteShare.DEFAULT_PERMISSION; - } - - /** - * 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. - * - * @param password Password to set to the target share. - * Empty string clears the current password. - * Null results in no update applied to the password. - */ - public void setPassword(String password) { - mPassword = password; - } - - /** - * Set expiration date to update in Share resource. - * - * @param expirationDateInMillis Expiration date to set to the target share. - * A negative value clears the current expiration date. - * Zero value (start-of-epoch) results in no update done on - * the expiration date. - */ - public void setExpirationDate(long expirationDateInMillis) { - mExpirationDateInMillis = expirationDateInMillis; - } - - /** - * Set permissions to update 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 update 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; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; - - try { - FormBody.Builder formBodyBuilder = new FormBody.Builder(); - - // Parameters to update - if (mName != null) { - formBodyBuilder.add(PARAM_NAME, mName); - } - - if (mExpirationDateInMillis < 0) { - // clear expiration date - formBodyBuilder.add(PARAM_EXPIRATION_DATE, ""); - - } else if (mExpirationDateInMillis > 0) { - // set expiration date - DateFormat dateFormat = new SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.GERMAN); - Calendar expirationDate = Calendar.getInstance(); - expirationDate.setTimeInMillis(mExpirationDateInMillis); - String formattedExpirationDate = dateFormat.format(expirationDate.getTime()); - formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate); - } // else, ignore - no update - - if (mPublicUpload != null) { - formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, Boolean.toString(mPublicUpload)); - } - - // IMPORTANT: permissions parameter needs to be updated after mPublicUpload parameter, - // otherwise they would be set always as 1 (READ) in the server when mPublicUpload was updated - if (mPermissions > 0) { - // set permissions - formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)); - } - - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon(); - uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH); - uriBuilder.appendEncodedPath(Long.toString(mRemoteId)); - - PutMethod putMethod = new PutMethod(new URL(uriBuilder.build().toString())); - - putMethod.setRequestBody(formBodyBuilder.build()); - - putMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8); - putMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.executeHttpMethod(putMethod); - - if (isSuccess(status)) { - // Parse xml response - ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser( - new ShareXMLParser() - ); - parser.setOwnCloudVersion(client.getOwnCloudVersion()); - parser.setServerBaseUri(client.getBaseUri()); - result = parser.parse(putMethod.getResponseBodyAsString()); - - } else { - result = new RemoteOperationResult<>(putMethod); - } - - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Exception while Creating New Share", e); - } - - return result; - } - - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt new file mode 100644 index 00000000..64217546 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -0,0 +1,232 @@ +/* ownCloud Android Library is available under MIT license + * + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.PutMethod +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 okhttp3.FormBody +import java.net.URL +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale + +/** + * Updates parameters of an existing Share resource, known its remote ID. + * + * + * Allow updating several parameters, triggering a request to the server per parameter. + * + * @author David A. Velasco + * @author David González Verdugo + */ + +class UpdateRemoteShareOperation +/** + * Constructor. No update is initialized by default, need to be applied with setters below. + * + * @param remoteId Identifier of the share to update. + */ + ( + /** + * Identifier of the share to update + */ + private val mRemoteId: Long +) : RemoteOperation() { + + /** + * Password to set for the public link + */ + private var mPassword: String? = null + + /** + * Expiration date to set for the public link + */ + private var mExpirationDateInMillis: Long = 0 + + /** + * Access permissions for the file bound to the share + */ + private var mPermissions: Int = 0 + + /** + * Upload permissions for the public link (only folders) + */ + private var mPublicUpload: Boolean? = null + private var mName: String? = null + + init { + mPassword = null // no update + mExpirationDateInMillis = 0 // no update + mPublicUpload = null + mPermissions = RemoteShare.DEFAULT_PERMISSION + } + + /** + * 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. + */ + fun setName(name: String) { + this.mName = name + } + + /** + * Set password to update in Share resource. + * + * @param password Password to set to the target share. + * Empty string clears the current password. + * Null results in no update applied to the password. + */ + fun setPassword(password: String) { + mPassword = password + } + + /** + * Set expiration date to update in Share resource. + * + * @param expirationDateInMillis Expiration date to set to the target share. + * A negative value clears the current expiration date. + * Zero value (start-of-epoch) results in no update done on + * the expiration date. + */ + fun setExpirationDate(expirationDateInMillis: Long) { + mExpirationDateInMillis = expirationDateInMillis + } + + /** + * Set permissions to update in Share resource. + * + * @param permissions Permissions to set to the target share. + * Values <= 0 result in no update applied to the permissions. + */ + fun setPermissions(permissions: Int) { + mPermissions = permissions + } + + /** + * Enable upload permissions to update in Share resource. + * + * @param publicUpload Upload permission to set to the target share. + * Null results in no update applied to the upload permission. + */ + fun setPublicUpload(publicUpload: Boolean?) { + mPublicUpload = publicUpload + } + + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + try { + val formBodyBuilder = FormBody.Builder() + + // Parameters to update + if (mName != null) { + formBodyBuilder.add(PARAM_NAME, mName!!) + } + + if (mExpirationDateInMillis < 0) { + // clear expiration date + formBodyBuilder.add(PARAM_EXPIRATION_DATE, "") + + } else if (mExpirationDateInMillis > 0) { + // set expiration date + val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.GERMAN) + val expirationDate = Calendar.getInstance() + expirationDate.timeInMillis = mExpirationDateInMillis + val formattedExpirationDate = dateFormat.format(expirationDate.time) + formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate) + } // else, ignore - no update + + if (mPublicUpload != null) { + formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, java.lang.Boolean.toString(mPublicUpload!!)) + } + + // IMPORTANT: permissions parameter needs to be updated after mPublicUpload parameter, + // otherwise they would be set always as 1 (READ) in the server when mPublicUpload was updated + if (mPermissions > 0) { + // set permissions + formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)) + } + + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) + uriBuilder.appendEncodedPath(java.lang.Long.toString(mRemoteId)) + + val putMethod = PutMethod(URL(uriBuilder.build().toString())) + + putMethod.setRequestBody(formBodyBuilder.build()) + + putMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8) + putMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + + val status = client.executeHttpMethod(putMethod) + + if (isSuccess(status)) { + // Parse xml response + val parser = ShareToRemoteOperationResultParser( + ShareXMLParser() + ) + parser.setOwnCloudVersion(client.ownCloudVersion) + parser.setServerBaseUri(client.baseUri) + result = parser.parse(putMethod.responseBodyAsString) + + } else { + result = RemoteOperationResult(putMethod) + } + + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while Creating New Share", e) + } + + return result + } + + private fun isSuccess(status: Int): Boolean { + return status == HttpConstants.HTTP_OK + } + + companion object { + + private val TAG = GetRemoteShareOperation::class.java.simpleName + + private val PARAM_NAME = "name" + private val PARAM_PASSWORD = "password" + private val PARAM_EXPIRATION_DATE = "expireDate" + private val PARAM_PERMISSIONS = "permissions" + private val PARAM_PUBLIC_UPLOAD = "publicUpload" + private val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + private val ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded" + private val ENTITY_CHARSET = "UTF-8" + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java deleted file mode 100644 index c8fd34a4..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ /dev/null @@ -1,213 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * Copyright (C) 2012 Bartek Przybylski - * - * 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.lib.resources.status; - -import android.os.Parcel; -import android.os.Parcelable; - -public class OwnCloudVersion implements Comparable, Parcelable { - - public static final int MINIMUN_VERSION_FOR_CHUNKED_UPLOADS = 0x04050000; // 4.5 - - public static final int MINIMUM_VERSION_FOR_SHARING_API = 0x05001B00; // 5.0.27 - - public static final int MINIMUM_VERSION_WITH_FORBIDDEN_CHARS = 0x08010000; // 8.1 - - public static final int MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS = 0x07080000; // 7.8.0 - - public static final int MINIMUM_VERSION_FOR_SEARCHING_USERS = 0x08020000; //8.2 - - public static final int VERSION_8 = 0x08000000; // 8.0 - - public static final int MINIMUM_VERSION_CAPABILITIES_API = 0x08010000; // 8.1 - - private static final int MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED = 0x09010000; // 9.1 - - private static final int MINIMUM_VERSION_WITH_SESSION_MONITORING = 0x09010000; // 9.1 - - 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 = 0xA000000; // 10.0.0 - - private static final int MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING = 0xA000100; // 10.0.1 - - private static final String INVALID_ZERO_VERSION = "0.0.0"; - - private static final int MAX_DOTS = 3; - - // format is in version - // 0xAABBCCDD - // for version AA.BB.CC.DD - // ie version 2.0.3 will be stored as 0x02000300 - private int mVersion; - private boolean mIsValid; - - public OwnCloudVersion(String version) { - mVersion = 0; - mIsValid = false; - int countDots = version.length() - version.replace(".", "").length(); - - // Complete the version. Version must have 3 dots - for (int i = countDots; i < MAX_DOTS; i++) { - version = version + ".0"; - } - - parseVersion(version); - - } - - public String toString() { - // gets the first digit of version, shifting hexadecimal version to right 'til max position - String versionToString = String.valueOf((mVersion >> (8 * MAX_DOTS)) % 256); - for (int i = MAX_DOTS - 1; i >= 0; i--) { - // gets another digit of version, shifting hexadecimal version to right 8*i bits and... - // ...discarding left part with mod 256 - versionToString = versionToString + "." + String.valueOf((mVersion >> (8 * i)) % 256); - } - if (!mIsValid) { - versionToString += " INVALID"; - } - return versionToString; - } - - public String getVersion() { - if (mIsValid) { - return toString(); - } else { - return INVALID_ZERO_VERSION; - } - } - - public boolean isVersionValid() { - return mIsValid; - } - - @Override - public int compareTo(OwnCloudVersion another) { - return another.mVersion == mVersion ? 0 - : another.mVersion < mVersion ? 1 : -1; - } - - private void parseVersion(String version) { - try { - mVersion = getParsedVersion(version); - mIsValid = true; - - } catch (Exception e) { - mIsValid = false; - // if invalid, the instance will respond as if server is 8.1, minimum with capabilities API, - // and "dead" : https://github.com/owncloud/core/wiki/Maintenance-and-Release-Schedule - mVersion = MINIMUM_VERSION_CAPABILITIES_API; - } - } - - private int getParsedVersion(String version) throws NumberFormatException { - int versionValue = 0; - - // get only numeric part - version = version.replaceAll("[^\\d.]", ""); - - String[] nums = version.split("\\."); - for (int i = 0; i < nums.length && i <= MAX_DOTS; i++) { - versionValue += Integer.parseInt(nums[i]); - if (i < nums.length - 1) { - versionValue = versionValue << 8; - } - } - - return versionValue; - } - - public boolean isChunkedUploadSupported() { - return (mVersion >= MINIMUN_VERSION_FOR_CHUNKED_UPLOADS); - } - - public boolean isSharedSupported() { - return (mVersion >= MINIMUM_VERSION_FOR_SHARING_API); - } - - public boolean isVersionWithForbiddenCharacters() { - return (mVersion >= MINIMUM_VERSION_WITH_FORBIDDEN_CHARS); - } - - public boolean supportsRemoteThumbnails() { - return (mVersion >= MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS); - } - - public boolean isAfter8Version() { - return (mVersion >= VERSION_8); - } - - public boolean isSearchUsersSupported() { - return (mVersion >= MINIMUM_VERSION_FOR_SEARCHING_USERS); - } - - public boolean isVersionWithCapabilitiesAPI() { - return (mVersion >= MINIMUM_VERSION_CAPABILITIES_API); - } - - public boolean isNotReshareableFederatedSupported() { - return (mVersion >= MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED); - } - - public boolean isSessionMonitoringSupported() { - return (mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING); - } - - /** - * From OC 9.1 session tracking is a feature, but to get it working in the OC app we need the preemptive - * mode of basic authentication is disabled. This changes in OC 9.1.3, where preemptive mode is compatible - * with session tracking again. - * - * @return True for every version before 9.1 and from 9.1.3, false otherwise - */ - public boolean isPreemptiveAuthenticationPreferred() { - return ( - (mVersion < MINIMUM_VERSION_WITH_SESSION_MONITORING) || - (mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE) - ); - } - - public boolean isMultiplePublicSharingSupported() { - return (mVersion >= MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING); - } - - public boolean isPublicSharingWriteOnlySupported() { - return (mVersion >= MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING); - } - - @Override - public int describeContents() { - return super.hashCode(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mVersion); - dest.writeInt(mIsValid ? 1 : 0); - } -} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt new file mode 100644 index 00000000..80b8814e --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt @@ -0,0 +1,202 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2016 ownCloud GmbH. + * Copyright (C) 2012 Bartek Przybylski + * + * 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.lib.resources.status + +import android.os.Parcel +import android.os.Parcelable + +class OwnCloudVersion(version: String) : Comparable, Parcelable { + + // format is in version + // 0xAABBCCDD + // for version AA.BB.CC.DD + // ie version 2.0.3 will be stored as 0x02000300 + private var mVersion: Int = 0 + var isVersionValid: Boolean = false + private set + + val version: String + get() = if (isVersionValid) { + toString() + } else { + INVALID_ZERO_VERSION + } + + val isChunkedUploadSupported: Boolean + get() = mVersion >= MINIMUN_VERSION_FOR_CHUNKED_UPLOADS + + val isSharedSupported: Boolean + get() = mVersion >= MINIMUM_VERSION_FOR_SHARING_API + + val isVersionWithForbiddenCharacters: Boolean + get() = mVersion >= MINIMUM_VERSION_WITH_FORBIDDEN_CHARS + + val isAfter8Version: Boolean + get() = mVersion >= VERSION_8 + + val isSearchUsersSupported: Boolean + get() = mVersion >= MINIMUM_VERSION_FOR_SEARCHING_USERS + + val isVersionWithCapabilitiesAPI: Boolean + get() = mVersion >= MINIMUM_VERSION_CAPABILITIES_API + + val isNotReshareableFederatedSupported: Boolean + get() = mVersion >= MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED + + val isSessionMonitoringSupported: Boolean + get() = mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING + + /** + * From OC 9.1 session tracking is a feature, but to get it working in the OC app we need the preemptive + * mode of basic authentication is disabled. This changes in OC 9.1.3, where preemptive mode is compatible + * with session tracking again. + * + * @return True for every version before 9.1 and from 9.1.3, false otherwise + */ + val isPreemptiveAuthenticationPreferred: Boolean + get() = mVersion < MINIMUM_VERSION_WITH_SESSION_MONITORING || mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE + + val isMultiplePublicSharingSupported: Boolean + get() = mVersion >= MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING + + val isPublicSharingWriteOnlySupported: Boolean + get() = mVersion >= MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING + + init { + var version = version + mVersion = 0 + isVersionValid = false + val countDots = version.length - version.replace(".", "").length + + // Complete the version. Version must have 3 dots + for (i in countDots until MAX_DOTS) { + version = "$version.0" + } + + parseVersion(version) + + } + + override fun toString(): String { + // gets the first digit of version, shifting hexadecimal version to right 'til max position + var versionToString = ((mVersion shr 8 * MAX_DOTS) % 256).toString() + for (i in MAX_DOTS - 1 downTo 0) { + // gets another digit of version, shifting hexadecimal version to right 8*i bits and... + // ...discarding left part with mod 256 + versionToString = versionToString + "." + ((mVersion shr 8 * i) % 256).toString() + } + if (!isVersionValid) { + versionToString += " INVALID" + } + return versionToString + } + + override fun compareTo(another: OwnCloudVersion): Int { + return if (another.mVersion == mVersion) + 0 + else if (another.mVersion < mVersion) 1 else -1 + } + + private fun parseVersion(version: String) { + try { + mVersion = getParsedVersion(version) + isVersionValid = true + + } catch (e: Exception) { + isVersionValid = false + // if invalid, the instance will respond as if server is 8.1, minimum with capabilities API, + // and "dead" : https://github.com/owncloud/core/wiki/Maintenance-and-Release-Schedule + mVersion = MINIMUM_VERSION_CAPABILITIES_API + } + + } + + @Throws(NumberFormatException::class) + private fun getParsedVersion(version: String): Int { + var version = version + var versionValue = 0 + + // get only numeric part + version = version.replace("[^\\d.]".toRegex(), "") + + val nums = version.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + var i = 0 + while (i < nums.size && i <= MAX_DOTS) { + versionValue += Integer.parseInt(nums[i]) + if (i < nums.size - 1) { + versionValue = versionValue shl 8 + } + i++ + } + + return versionValue + } + + fun supportsRemoteThumbnails(): Boolean { + return mVersion >= MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS + } + + override fun describeContents(): Int { + return super.hashCode() + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeInt(mVersion) + dest.writeInt(if (isVersionValid) 1 else 0) + } + + companion object { + + val MINIMUN_VERSION_FOR_CHUNKED_UPLOADS = 0x04050000 // 4.5 + + val MINIMUM_VERSION_FOR_SHARING_API = 0x05001B00 // 5.0.27 + + val MINIMUM_VERSION_WITH_FORBIDDEN_CHARS = 0x08010000 // 8.1 + + val MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS = 0x07080000 // 7.8.0 + + val MINIMUM_VERSION_FOR_SEARCHING_USERS = 0x08020000 //8.2 + + val VERSION_8 = 0x08000000 // 8.0 + + val MINIMUM_VERSION_CAPABILITIES_API = 0x08010000 // 8.1 + + private val MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED = 0x09010000 // 9.1 + + private val MINIMUM_VERSION_WITH_SESSION_MONITORING = 0x09010000 // 9.1 + + private val 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 val MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA000000 // 10.0.0 + + private val MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING = 0xA000100 // 10.0.1 + + private val INVALID_ZERO_VERSION = "0.0.0" + + private val MAX_DOTS = 3 + } +} From 4e78a5f3e8a60bc129fee10ccaf669212e31e00e Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 1 Mar 2019 13:10:37 +0100 Subject: [PATCH 06/37] Use openfortesting for new Kotlin files needed in tests --- owncloudComLibrary/build.gradle | 7 +++++ .../android/lib/testing/OpenForTesting.kt | 31 +++++++++++++++++++ .../lib/resources/status/OwnCloudVersion.kt | 4 ++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 owncloudComLibrary/src/debug/java/com/owncloud/android/lib/testing/OpenForTesting.kt diff --git a/owncloudComLibrary/build.gradle b/owncloudComLibrary/build.gradle index 3b04c31f..463d135a 100644 --- a/owncloudComLibrary/build.gradle +++ b/owncloudComLibrary/build.gradle @@ -2,12 +2,19 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' +apply plugin: 'kotlin-allopen' + dependencies { api 'com.squareup.okhttp3:okhttp:3.12.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" api 'com.gitlab.ownclouders:dav4android:oc_support_1.0.1' } +allOpen { + // allows mocking for classes w/o directly opening them for release builds + annotation 'com.owncloud.android.lib.testing.OpenClass' +} + android { compileSdkVersion 28 diff --git a/owncloudComLibrary/src/debug/java/com/owncloud/android/lib/testing/OpenForTesting.kt b/owncloudComLibrary/src/debug/java/com/owncloud/android/lib/testing/OpenForTesting.kt new file mode 100644 index 00000000..3c91e836 --- /dev/null +++ b/owncloudComLibrary/src/debug/java/com/owncloud/android/lib/testing/OpenForTesting.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.owncloud.android.lib.testing + +/** + * This annotation allows us to open some classes for mocking purposes while they are final in + * release builds. + */ +@Target(AnnotationTarget.ANNOTATION_CLASS) +annotation class OpenClass + +/** + * Annotate a class with [OpenForTesting] if you want it to be extendable in debug builds. + */ +@OpenClass +@Target(AnnotationTarget.CLASS) +annotation class OpenForTesting diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt index 80b8814e..8b09859e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt @@ -27,7 +27,9 @@ package com.owncloud.android.lib.resources.status import android.os.Parcel import android.os.Parcelable +import com.owncloud.android.lib.testing.OpenForTesting +@OpenForTesting class OwnCloudVersion(version: String) : Comparable, Parcelable { // format is in version @@ -36,7 +38,7 @@ class OwnCloudVersion(version: String) : Comparable, Parcelable // ie version 2.0.3 will be stored as 0x02000300 private var mVersion: Int = 0 var isVersionValid: Boolean = false - private set + set val version: String get() = if (isVersionValid) { From 92d57eadbed627fadad0517313a1a12496a6f044 Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 1 Mar 2019 13:24:18 +0100 Subject: [PATCH 07/37] Fix tiny bug when parsing shares --- .../lib/resources/shares/ShareToRemoteOperationResultParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt index 55786c41..5cd54f64 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -54,7 +54,7 @@ class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { mOneOrMoreSharesRequired = oneOrMoreSharesRequired } - fun setOwnCloudVersion(ownCloudVersion: OwnCloudVersion) { + fun setOwnCloudVersion(ownCloudVersion: OwnCloudVersion?) { mOwnCloudVersion = ownCloudVersion } From 418f5af783c366a415a2a96d956b15126032d080 Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 1 Mar 2019 14:12:14 +0100 Subject: [PATCH 08/37] Fix some dependencies --- build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 0f79bf7f..d730ec48 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,17 @@ buildscript { + ext { + // Libraries + kotlinVersion = '1.3.11' + } + repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.3.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" + classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion" } } From 261e7a762d35007f7c71fe2885aa8a87b3d33f6c Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 1 Mar 2019 14:31:30 +0100 Subject: [PATCH 09/37] Fix build --- .../android/lib/testing/OpenForTesting.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 owncloudComLibrary/src/release/java/com/owncloud/android/lib/testing/OpenForTesting.kt diff --git a/owncloudComLibrary/src/release/java/com/owncloud/android/lib/testing/OpenForTesting.kt b/owncloudComLibrary/src/release/java/com/owncloud/android/lib/testing/OpenForTesting.kt new file mode 100644 index 00000000..3c91e836 --- /dev/null +++ b/owncloudComLibrary/src/release/java/com/owncloud/android/lib/testing/OpenForTesting.kt @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.owncloud.android.lib.testing + +/** + * This annotation allows us to open some classes for mocking purposes while they are final in + * release builds. + */ +@Target(AnnotationTarget.ANNOTATION_CLASS) +annotation class OpenClass + +/** + * Annotate a class with [OpenForTesting] if you want it to be extendable in debug builds. + */ +@OpenClass +@Target(AnnotationTarget.CLASS) +annotation class OpenForTesting From af6b18e0429ff43d0f51894d80524a393bad3ef5 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 5 Mar 2019 15:59:34 +0100 Subject: [PATCH 10/37] Apply code review changes --- .../shares/CreateRemoteShareOperation.kt | 119 +++++------------- .../lib/resources/shares/RemoteShare.kt | 102 +++++---------- .../shares/RemoveRemoteShareOperation.kt | 4 +- .../ShareToRemoteOperationResultParser.kt | 71 ++++------- .../lib/resources/shares/ShareXMLParser.kt | 80 ++++++------ .../shares/UpdateRemoteShareOperation.kt | 56 ++++----- 6 files changed, 153 insertions(+), 279 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 01cbfc3a..a8c2d68b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -68,90 +68,27 @@ class CreateRemoteShareOperation * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ ( - private val mRemoteFilePath: String, - private val mShareType: ShareType, - private val mShareWith: String, - /** - * Upload permissions for the public link (only folders) - */ - private var mPublicUpload: Boolean?, - /** - * Password to set for the public link - */ - private var mPassword: String?, - /** - * Access permissions for the file bound to the share - */ - private var mPermissions: Int + private val remoteFilePath: String, + private val shareType: ShareType, + private val shareWith: String, + var publicUpload: Boolean?, // Upload permissions for the public link (only folders) + var password: String?, // Password to set for the public link + var permissions: Int // Access permissions for the file bound to the share ) : RemoteOperation() { - private var mGetShareDetails: Boolean = false + var getShareDetails: Boolean = false /** * Name to set for the public link */ - private var mName = "" + var name = "" /** * Expiration date to set for the public link */ - private var mExpirationDateInMillis: Long = 0 + var expirationDateInMillis: Long = INITIAL_EXPIRATION_DATE_IN_MILLIS init { - 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. - * Null or empty string result in no value set for the name. - */ - fun setName(name: String?) { - this.mName = 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. - */ - fun setPassword(password: String) { - mPassword = password - } - - /** - * 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. - */ - fun setExpirationDate(expirationDateInMillis: Long) { - mExpirationDateInMillis = expirationDateInMillis - } - - /** - * Set permissions to create in Share resource. - * - * @param permissions Permissions to set to the target share. - * Values <= 0 result in value set to the permissions. - */ - fun setPermissions(permissions: Int) { - 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. - */ - fun setPublicUpload(publicUpload: Boolean?) { - mPublicUpload = publicUpload - } - - fun setGetShareDetails(set: Boolean) { - mGetShareDetails = set + getShareDetails = false // defaults to false for backwards compatibility } override fun run(client: OwnCloudClient): RemoteOperationResult { @@ -159,30 +96,30 @@ class CreateRemoteShareOperation try { val formBodyBuilder = FormBody.Builder() - .add(PARAM_PATH, mRemoteFilePath) - .add(PARAM_SHARE_TYPE, Integer.toString(mShareType.value)) - .add(PARAM_SHARE_WITH, mShareWith) + .add(PARAM_PATH, remoteFilePath) + .add(PARAM_SHARE_TYPE, Integer.toString(shareType.value)) + .add(PARAM_SHARE_WITH, shareWith) - if (mName.length > 0) { - formBodyBuilder.add(PARAM_NAME, mName) + if (name.isNotEmpty()) { + formBodyBuilder.add(PARAM_NAME, name) } - if (mExpirationDateInMillis > 0) { + if (expirationDateInMillis > INITIAL_EXPIRATION_DATE_IN_MILLIS) { val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) val expirationDate = Calendar.getInstance() - expirationDate.timeInMillis = mExpirationDateInMillis + expirationDate.timeInMillis = expirationDateInMillis val formattedExpirationDate = dateFormat.format(expirationDate.time) formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate) } - if (mPublicUpload!!) { - formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, java.lang.Boolean.toString(true)) + if (publicUpload == true) { + formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, publicUpload.toString()) } - if (mPassword != null && mPassword!!.length > 0) { - formBodyBuilder.add(PARAM_PASSWORD, mPassword!!) + if (!password.isNullOrEmpty()) { + formBodyBuilder.add(PARAM_PASSWORD, password!!) } - if (RemoteShare.DEFAULT_PERMISSION != mPermissions) { - formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)) + if (RemoteShare.DEFAULT_PERMISSION != permissions) { + formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(permissions)) } val requestUri = client.baseUri @@ -203,12 +140,12 @@ class CreateRemoteShareOperation ) if (isSuccess(status)) { - parser.setOneOrMoreSharesRequired(true) - parser.setOwnCloudVersion(client.ownCloudVersion) - parser.setServerBaseUri(client.baseUri) + parser.oneOrMoreSharesRequired = true + parser.ownCloudVersion = client.ownCloudVersion + parser.serverBaseUri = client.baseUri result = parser.parse(postMethod.responseBodyAsString) - if (result.isSuccess && mGetShareDetails) { + if (result.isSuccess && getShareDetails) { // TODO Use executeHttpMethod // retrieve more info - POST only returns the index of the new share @@ -248,5 +185,7 @@ class CreateRemoteShareOperation private val PARAM_SHARE_WITH = "shareWith" private val PARAM_PERMISSIONS = "permissions" private val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + + const val INITIAL_EXPIRATION_DATE_IN_MILLIS : Long = 0 } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index 64baee1b..f2bfcb0b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -38,64 +38,26 @@ import java.io.Serializable * @author David González Verdugo */ class RemoteShare : Parcelable, Serializable { - - /// Getters and Setters + var shareWith: String = "" + var path: String = "" + var token: String = "" + var sharedWithDisplayName: String = "" + var sharedWithAdditionalInfo: String = "" + var name: String = "" + var shareLink: String = "" var fileSource: Long = 0 var itemSource: Long = 0 var shareType: ShareType? = null - private var mShareWith: String? = null - private var mPath: String? = null var permissions: Int = 0 var sharedDate: Long = 0 var expirationDate: Long = 0 - private var mToken: String? = null - private var mSharedWithDisplayName: String? = null - var sharedWithAdditionalInfo: String? = null - private var mName: String? = null var isFolder: Boolean = false var userId: Long = 0 var remoteId: Long = 0 private set - private var mShareLink: String? = null - - var shareWith: String? - get() = mShareWith - set(shareWith) { - this.mShareWith = shareWith ?: "" - } - - var path: String? - get() = mPath - set(path) { - this.mPath = path ?: "" - } - - var token: String? - get() = mToken - set(token) { - this.mToken = token ?: "" - } - - var sharedWithDisplayName: String? - get() = mSharedWithDisplayName - set(sharedWithDisplayName) { - this.mSharedWithDisplayName = sharedWithDisplayName ?: "" - } - - var name: String? - get() = mName - set(name) { - mName = name ?: "" - } - - var shareLink: String? - get() = this.mShareLink - set(shareLink) { - this.mShareLink = shareLink ?: "" - } val isPasswordProtected: Boolean - get() = ShareType.PUBLIC_LINK == shareType && mShareWith!!.length > 0 + get() = ShareType.PUBLIC_LINK == shareType && shareWith.isNotEmpty() constructor() : super() { resetData() @@ -103,33 +65,34 @@ class RemoteShare : Parcelable, Serializable { constructor(path: String?) { resetData() - if (path == null || path.length <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) { + if (path == null || path.isEmpty() || !path.startsWith(FileUtils.PATH_SEPARATOR)) { Log_OC.e(TAG, "Trying to create a RemoteShare with a non valid path") throw IllegalArgumentException("Trying to create a RemoteShare with a non valid path: " + path!!) } - mPath = path + this.path = path } /** * Used internally. Reset all file properties */ private fun resetData() { + shareWith = "" + path = "" + token = "" + sharedWithDisplayName = "" + sharedWithAdditionalInfo = "" + name = "" + shareLink = "" fileSource = 0 itemSource = 0 shareType = ShareType.NO_SHARED - mShareWith = "" - mPath = "" - permissions = -1 + permissions = DEFAULT_PERMISSION sharedDate = 0 expirationDate = 0 - mToken = "" - mSharedWithDisplayName = "" sharedWithAdditionalInfo = "" isFolder = false userId = -1 remoteId = -1 - mShareLink = "" - mName = "" } fun setIdRemoteShared(remoteId: Long) { @@ -146,6 +109,13 @@ class RemoteShare : Parcelable, Serializable { } fun readFromParcel(source: Parcel) { + shareWith = source.readString() + path = source.readString() + token = source.readString() + sharedWithDisplayName = source.readString() + sharedWithAdditionalInfo = source.readString() + name = source.readString() + shareLink = source.readString() fileSource = source.readLong() itemSource = source.readLong() try { @@ -153,20 +123,12 @@ class RemoteShare : Parcelable, Serializable { } catch (x: IllegalArgumentException) { shareType = ShareType.NO_SHARED } - - mShareWith = source.readString() - mPath = source.readString() permissions = source.readInt() sharedDate = source.readLong() expirationDate = source.readLong() - mToken = source.readString() - mSharedWithDisplayName = source.readString() - sharedWithAdditionalInfo = source.readString() isFolder = source.readInt() == 0 userId = source.readLong() remoteId = source.readLong() - mShareLink = source.readString() - mName = source.readString() } override fun describeContents(): Int { @@ -174,22 +136,22 @@ class RemoteShare : Parcelable, Serializable { } override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeString(shareWith) + dest.writeString(path) + dest.writeString(token) + dest.writeString(sharedWithDisplayName) + dest.writeString(sharedWithAdditionalInfo) + dest.writeString(name) + dest.writeString(shareLink) dest.writeLong(fileSource) dest.writeLong(itemSource) dest.writeString(if (shareType == null) "" else shareType!!.name) - dest.writeString(mShareWith) - dest.writeString(mPath) dest.writeInt(permissions) dest.writeLong(sharedDate) dest.writeLong(expirationDate) - dest.writeString(mToken) - dest.writeString(mSharedWithDisplayName) - dest.writeString(sharedWithAdditionalInfo) dest.writeInt(if (isFolder) 1 else 0) dest.writeLong(userId) dest.writeLong(remoteId) - dest.writeString(mShareLink) - dest.writeString(mName) } companion object { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt index 6494a4c1..bf37ae80 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt @@ -90,9 +90,7 @@ class RemoveRemoteShareOperation return result } - private fun isSuccess(status: Int): Boolean { - return status == HttpConstants.HTTP_OK - } + private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK companion object { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt index 5cd54f64..abb416a2 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -28,42 +28,21 @@ package com.owncloud.android.lib.resources.shares import android.net.Uri - import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.status.OwnCloudVersion import org.xmlpull.v1.XmlPullParserException - import java.io.ByteArrayInputStream import java.io.IOException -import java.io.InputStream import java.util.ArrayList -class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { - - private var mShareXmlParser: ShareXMLParser? = null - private var mOneOrMoreSharesRequired = false - private var mOwnCloudVersion: OwnCloudVersion? = null - private var mServerBaseUri: Uri? = null - - init { - mShareXmlParser = shareXmlParser - } - - fun setOneOrMoreSharesRequired(oneOrMoreSharesRequired: Boolean) { - mOneOrMoreSharesRequired = oneOrMoreSharesRequired - } - - fun setOwnCloudVersion(ownCloudVersion: OwnCloudVersion?) { - mOwnCloudVersion = ownCloudVersion - } - - fun setServerBaseUri(serverBaseURi: Uri) { - mServerBaseUri = serverBaseURi - } +class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLParser?) { + var oneOrMoreSharesRequired = false + var ownCloudVersion: OwnCloudVersion? = null + var serverBaseUri: Uri? = null fun parse(serverResponse: String?): RemoteOperationResult { - if (serverResponse == null || serverResponse.length == 0) { + if (serverResponse.isNullOrEmpty()) { return RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) } @@ -72,15 +51,15 @@ class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { try { // Parse xml response and obtain the list of shares - val `is` = ByteArrayInputStream(serverResponse.toByteArray()) - if (mShareXmlParser == null) { + val byteArrayServerResponse = ByteArrayInputStream(serverResponse.toByteArray()) + if (shareXmlParser == null) { Log_OC.w(TAG, "No ShareXmlParser provided, creating new instance ") - mShareXmlParser = ShareXMLParser() + shareXmlParser = ShareXMLParser() } - val shares = mShareXmlParser!!.parseXMLResponse(`is`) + val shares = shareXmlParser?.parseXMLResponse(byteArrayServerResponse) - if (mShareXmlParser!!.isSuccess) { - if (shares != null && shares.size > 0 || !mOneOrMoreSharesRequired) { + if (shareXmlParser?.isSuccess!!) { + if (!shares.isNullOrEmpty() || !oneOrMoreSharesRequired) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) if (shares != null) { for (share in shares) { @@ -88,12 +67,12 @@ class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { // build the share link if not in the response // (needed for OC servers < 9.0.0, see ShareXMLParser.java#line256) if (share.shareType == ShareType.PUBLIC_LINK - && (share.shareLink == null || share.shareLink!!.length <= 0) - && share.token!!.length > 0 + && share.shareLink.isEmpty() + && share.token.isNotEmpty() ) { - if (mServerBaseUri != null) { - val sharingLinkPath = ShareUtils.getSharingLinkPath(mOwnCloudVersion) - share.shareLink = mServerBaseUri.toString() + sharingLinkPath + share.token + if (serverBaseUri != null) { + val sharingLinkPath = ShareUtils.getSharingLinkPath(ownCloudVersion) + share.shareLink = serverBaseUri.toString() + sharingLinkPath + share.token } else { Log_OC.e(TAG, "Couldn't build link for public share :(") } @@ -107,18 +86,15 @@ class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { Log_OC.e(TAG, "Successful status with no share in the response") } - } else if (mShareXmlParser!!.isWrongParameter) { + } else if (shareXmlParser?.isWrongParameter!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER) - result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) - - } else if (mShareXmlParser!!.isNotFound) { + result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) + } else if (shareXmlParser?.isNotFound!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) - result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) - - } else if (mShareXmlParser!!.isForbidden) { + result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) + } else if (shareXmlParser?.isForbidden!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN) - result.setData(ShareParserResult(null!!, mShareXmlParser!!.message!!)) - + result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) } else { result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) } @@ -136,7 +112,6 @@ class ShareToRemoteOperationResultParser(shareXmlParser: ShareXMLParser) { } companion object { - private val TAG = ShareToRemoteOperationResultParser::class.java.simpleName } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index 23f9435f..2dc31144 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -45,7 +45,6 @@ import java.util.ArrayList */ class ShareXMLParser { - // Getters and Setters var status: String? = null var statusCode: Int = 0 @@ -65,18 +64,18 @@ class ShareXMLParser { // Constructor init { - statusCode = -1 + statusCode = INIT } /** * Parse is as response of Share API - * @param is + * @param inputStream * @return List of ShareRemoteFiles * @throws XmlPullParserException * @throws IOException */ @Throws(XmlPullParserException::class, IOException::class) - fun parseXMLResponse(`is`: InputStream): ArrayList { + fun parseXMLResponse(inputStream: InputStream): ArrayList { try { // XMLPullParser @@ -85,12 +84,12 @@ class ShareXMLParser { val parser = Xml.newPullParser() parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) - parser.setInput(`is`, null) + parser.setInput(inputStream, null) parser.nextTag() return readOCS(parser) } finally { - `is`.close() + inputStream.close() } } @@ -307,10 +306,10 @@ class ShareXMLParser { } private fun fixPathForFolder(share: RemoteShare) { - if (share.isFolder && share.path != null && share.path!!.length > 0 && - !share.path!!.endsWith(FileUtils.PATH_SEPARATOR) + if (share.isFolder && share.path.isNotEmpty() && + !share.path.endsWith(FileUtils.PATH_SEPARATOR) ) { - share.path = share.path!! + FileUtils.PATH_SEPARATOR + share.path = share.path + FileUtils.PATH_SEPARATOR } } @@ -376,40 +375,41 @@ class ShareXMLParser { private val ns: String? = null // NODES for XML Parser - private val NODE_OCS = "ocs" + private const val NODE_OCS = "ocs" - private val NODE_META = "meta" - private val NODE_STATUS = "status" - private val NODE_STATUS_CODE = "statuscode" - private val NODE_MESSAGE = "message" + private const val NODE_META = "meta" + private const val NODE_STATUS = "status" + private const val NODE_STATUS_CODE = "statuscode" + private const val NODE_MESSAGE = "message" - private val NODE_DATA = "data" - private val NODE_ELEMENT = "element" - private val NODE_ID = "id" - private val NODE_ITEM_TYPE = "item_type" - private val NODE_ITEM_SOURCE = "item_source" - private val NODE_PARENT = "parent" - private val NODE_SHARE_TYPE = "share_type" - private val NODE_SHARE_WITH = "share_with" - private val NODE_FILE_SOURCE = "file_source" - private val NODE_PATH = "path" - private val NODE_PERMISSIONS = "permissions" - private val NODE_STIME = "stime" - private val NODE_EXPIRATION = "expiration" - private val NODE_TOKEN = "token" - private val NODE_STORAGE = "storage" - private val NODE_MAIL_SEND = "mail_send" - private val NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname" - private val NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info" - private val NODE_NAME = "name" + private const val NODE_DATA = "data" + private const val NODE_ELEMENT = "element" + private const val NODE_ID = "id" + private const val NODE_ITEM_TYPE = "item_type" + private const val NODE_ITEM_SOURCE = "item_source" + private const val NODE_PARENT = "parent" + private const val NODE_SHARE_TYPE = "share_type" + private const val NODE_SHARE_WITH = "share_with" + private const val NODE_FILE_SOURCE = "file_source" + private const val NODE_PATH = "path" + private const val NODE_PERMISSIONS = "permissions" + private const val NODE_STIME = "stime" + private const val NODE_EXPIRATION = "expiration" + private const val NODE_TOKEN = "token" + private const val NODE_STORAGE = "storage" + private const val NODE_MAIL_SEND = "mail_send" + private const val NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname" + private const val NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info" + private const val NODE_NAME = "name" - private val NODE_URL = "url" + private const val NODE_URL = "url" - private val TYPE_FOLDER = "folder" + private const val TYPE_FOLDER = "folder" - private val SUCCESS = 200 - private val ERROR_WRONG_PARAMETER = 400 - private val ERROR_FORBIDDEN = 403 - private val ERROR_NOT_FOUND = 404 + private const val SUCCESS = 200 + private const val ERROR_WRONG_PARAMETER = 400 + private const val ERROR_FORBIDDEN = 403 + private const val ERROR_NOT_FOUND = 404 + private const val INIT = -1 } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 64217546..2b6422ab 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -57,35 +57,35 @@ class UpdateRemoteShareOperation /** * Identifier of the share to update */ - private val mRemoteId: Long + private val remoteId: Long ) : RemoteOperation() { /** * Password to set for the public link */ - private var mPassword: String? = null + private var password: String? = null /** * Expiration date to set for the public link */ - private var mExpirationDateInMillis: Long = 0 + private var expirationDateInMillis: Long = 0 /** * Access permissions for the file bound to the share */ - private var mPermissions: Int = 0 + private var permissions: Int = 0 /** * Upload permissions for the public link (only folders) */ - private var mPublicUpload: Boolean? = null - private var mName: String? = null + private var publicUpload: Boolean? = null + private var name: String? = null init { - mPassword = null // no update - mExpirationDateInMillis = 0 // no update - mPublicUpload = null - mPermissions = RemoteShare.DEFAULT_PERMISSION + password = null // no update + expirationDateInMillis = 0 // no update + publicUpload = null + permissions = RemoteShare.DEFAULT_PERMISSION } /** @@ -96,7 +96,7 @@ class UpdateRemoteShareOperation * Null results in no update applied to the name. */ fun setName(name: String) { - this.mName = name + this.name = name } /** @@ -107,7 +107,7 @@ class UpdateRemoteShareOperation * Null results in no update applied to the password. */ fun setPassword(password: String) { - mPassword = password + this.password = password } /** @@ -119,7 +119,7 @@ class UpdateRemoteShareOperation * the expiration date. */ fun setExpirationDate(expirationDateInMillis: Long) { - mExpirationDateInMillis = expirationDateInMillis + this.expirationDateInMillis = expirationDateInMillis } /** @@ -129,7 +129,7 @@ class UpdateRemoteShareOperation * Values <= 0 result in no update applied to the permissions. */ fun setPermissions(permissions: Int) { - mPermissions = permissions + this.permissions = permissions } /** @@ -139,7 +139,7 @@ class UpdateRemoteShareOperation * Null results in no update applied to the upload permission. */ fun setPublicUpload(publicUpload: Boolean?) { - mPublicUpload = publicUpload + this.publicUpload = publicUpload } override fun run(client: OwnCloudClient): RemoteOperationResult { @@ -149,38 +149,38 @@ class UpdateRemoteShareOperation val formBodyBuilder = FormBody.Builder() // Parameters to update - if (mName != null) { - formBodyBuilder.add(PARAM_NAME, mName!!) + if (name != null) { + formBodyBuilder.add(PARAM_NAME, name!!) } - if (mExpirationDateInMillis < 0) { + if (expirationDateInMillis < 0) { // clear expiration date formBodyBuilder.add(PARAM_EXPIRATION_DATE, "") - } else if (mExpirationDateInMillis > 0) { + } else if (expirationDateInMillis > 0) { // set expiration date - val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.GERMAN) + val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) val expirationDate = Calendar.getInstance() - expirationDate.timeInMillis = mExpirationDateInMillis + expirationDate.timeInMillis = expirationDateInMillis val formattedExpirationDate = dateFormat.format(expirationDate.time) formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate) } // else, ignore - no update - if (mPublicUpload != null) { - formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, java.lang.Boolean.toString(mPublicUpload!!)) + if (publicUpload != null) { + formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, publicUpload.toString()) } // IMPORTANT: permissions parameter needs to be updated after mPublicUpload parameter, // otherwise they would be set always as 1 (READ) in the server when mPublicUpload was updated - if (mPermissions > 0) { + if (permissions > 0) { // set permissions - formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(mPermissions)) + formBodyBuilder.add(PARAM_PERMISSIONS, permissions.toString()) } val requestUri = client.baseUri val uriBuilder = requestUri.buildUpon() uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) - uriBuilder.appendEncodedPath(java.lang.Long.toString(mRemoteId)) + uriBuilder.appendEncodedPath(remoteId.toString()) val putMethod = PutMethod(URL(uriBuilder.build().toString())) @@ -196,8 +196,8 @@ class UpdateRemoteShareOperation val parser = ShareToRemoteOperationResultParser( ShareXMLParser() ) - parser.setOwnCloudVersion(client.ownCloudVersion) - parser.setServerBaseUri(client.baseUri) + parser.ownCloudVersion = client.ownCloudVersion + parser.serverBaseUri = client.baseUri result = parser.parse(putMethod.responseBodyAsString) } else { From c2d8e68ecc61b625eaad1c8b66d75db500cdd614 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 5 Mar 2019 18:28:40 +0100 Subject: [PATCH 11/37] 2nd code review changes Apply pending change --- .../shares/CreateRemoteShareOperation.kt | 34 +++-- .../GetRemoteSharesForFileOperation.java | 124 ------------------ .../shares/GetRemoteSharesForFileOperation.kt | 115 ++++++++++++++++ .../lib/resources/shares/RemoteShare.kt | 52 ++++---- .../shares/RemoveRemoteShareOperation.kt | 7 +- .../shares/SharePermissionsBuilder.kt | 10 +- .../ShareToRemoteOperationResultParser.kt | 36 ++--- .../lib/resources/shares/ShareXMLParser.kt | 4 +- .../shares/UpdateRemoteShareOperation.kt | 110 ++++++---------- 9 files changed, 219 insertions(+), 273 deletions(-) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index a8c2d68b..fba6b72f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -33,6 +33,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod 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 com.owncloud.android.lib.resources.shares.RemoteShare.Companion.INIT_EXPIRATION_DATE_IN_MILLIS import okhttp3.FormBody import java.net.URL import java.text.SimpleDateFormat @@ -75,7 +76,7 @@ class CreateRemoteShareOperation var password: String?, // Password to set for the public link var permissions: Int // Access permissions for the file bound to the share ) : RemoteOperation() { - var getShareDetails: Boolean = false + var getShareDetails: Boolean = false // To retrieve more info about the just created share /** * Name to set for the public link @@ -85,7 +86,7 @@ class CreateRemoteShareOperation /** * Expiration date to set for the public link */ - var expirationDateInMillis: Long = INITIAL_EXPIRATION_DATE_IN_MILLIS + var expirationDateInMillis: Long = INIT_EXPIRATION_DATE_IN_MILLIS init { getShareDetails = false // defaults to false for backwards compatibility @@ -104,7 +105,7 @@ class CreateRemoteShareOperation formBodyBuilder.add(PARAM_NAME, name) } - if (expirationDateInMillis > INITIAL_EXPIRATION_DATE_IN_MILLIS) { + if (expirationDateInMillis > INIT_EXPIRATION_DATE_IN_MILLIS) { val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) val expirationDate = Calendar.getInstance() expirationDate.timeInMillis = expirationDateInMillis @@ -116,7 +117,7 @@ class CreateRemoteShareOperation formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, publicUpload.toString()) } if (!password.isNullOrEmpty()) { - formBodyBuilder.add(PARAM_PASSWORD, password!!) + formBodyBuilder.add(PARAM_PASSWORD, password) } if (RemoteShare.DEFAULT_PERMISSION != permissions) { formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(permissions)) @@ -168,24 +169,19 @@ class CreateRemoteShareOperation return result } - private fun isSuccess(status: Int): Boolean { - return status == HttpConstants.HTTP_OK - } + private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK companion object { - private val TAG = CreateRemoteShareOperation::class.java.simpleName - private val PARAM_NAME = "name" - private val PARAM_PASSWORD = "password" - private val PARAM_EXPIRATION_DATE = "expireDate" - private val PARAM_PUBLIC_UPLOAD = "publicUpload" - private val PARAM_PATH = "path" - private val PARAM_SHARE_TYPE = "shareType" - private val PARAM_SHARE_WITH = "shareWith" - private val PARAM_PERMISSIONS = "permissions" - private val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" - - const val INITIAL_EXPIRATION_DATE_IN_MILLIS : Long = 0 + private const val PARAM_NAME = "name" + private const val PARAM_PASSWORD = "password" + private const val PARAM_EXPIRATION_DATE = "expireDate" + private const val PARAM_PUBLIC_UPLOAD = "publicUpload" + private const val PARAM_PATH = "path" + private const val PARAM_SHARE_TYPE = "shareType" + private const val PARAM_SHARE_WITH = "shareWith" + private const val PARAM_PERMISSIONS = "permissions" + private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" } } \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java deleted file mode 100644 index e788cb25..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java +++ /dev/null @@ -1,124 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod; -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.net.URL; - -/** - * Provide a list shares for a specific file. - * The input is the full path of the desired file. - * The output is a list of everyone who has the file shared with them. - * - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - */ -public class GetRemoteSharesForFileOperation extends RemoteOperation { - - private static final String TAG = GetRemoteSharesForFileOperation.class.getSimpleName(); - - private static final String PARAM_PATH = "path"; - private static final String PARAM_RESHARES = "reshares"; - private static final String PARAM_SUBFILES = "subfiles"; - - private String mRemoteFilePath; - private boolean mReshares; - private boolean mSubfiles; - - /** - * Constructor - * - * @param remoteFilePath Path to file or folder - * @param reshares If set to false (default), only shares owned by the current user are - * returned. - * If set to true, shares owned by any user from the given file are returned. - * @param subfiles If set to false (default), lists only the folder being shared - * If set to true, all shared files within the folder are returned. - */ - public GetRemoteSharesForFileOperation(String remoteFilePath, boolean reshares, - boolean subfiles) { - mRemoteFilePath = remoteFilePath; - mReshares = reshares; - mSubfiles = subfiles; - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; - - try { - - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon(); - uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH); - uriBuilder.appendQueryParameter(PARAM_PATH, mRemoteFilePath); - uriBuilder.appendQueryParameter(PARAM_RESHARES, String.valueOf(mReshares)); - uriBuilder.appendQueryParameter(PARAM_SUBFILES, String.valueOf(mSubfiles)); - - GetMethod getMethod = new GetMethod(new URL(uriBuilder.build().toString())); - - getMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.executeHttpMethod(getMethod); - - if (isSuccess(status)) { - // Parse xml response and obtain the list of shares - ShareToRemoteOperationResultParser parser = new ShareToRemoteOperationResultParser( - new ShareXMLParser() - ); - parser.setOwnCloudVersion(client.getOwnCloudVersion()); - parser.setServerBaseUri(client.getBaseUri()); - result = parser.parse(getMethod.getResponseBodyAsString()); - - if (result.isSuccess()) { - Log_OC.d(TAG, "Got " + result.getData().getShares().size() + " shares"); - } - } else { - result = new RemoteOperationResult<>(getMethod); - } - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Exception while getting shares", e); - } - - return result; - } - - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.kt new file mode 100644 index 00000000..321f170b --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.kt @@ -0,0 +1,115 @@ +/* ownCloud Android Library is available under MIT license + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod +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.net.URL + +/** + * Provide a list shares for a specific file. + * The input is the full path of the desired file. + * The output is a list of everyone who has the file shared with them. + * + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + */ + +/** + * Constructor + * + * @param remoteFilePath Path to file or folder + * @param reshares If set to false (default), only shares owned by the current user are + * returned. + * If set to true, shares owned by any user from the given file are returned. + * @param subfiles If set to false (default), lists only the folder being shared + * If set to true, all shared files within the folder are returned. + */ +class GetRemoteSharesForFileOperation( + private val remoteFilePath: String, + private val reshares: Boolean, + private val subfiles: Boolean +) : RemoteOperation() { + + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + try { + + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) + uriBuilder.appendQueryParameter(PARAM_PATH, remoteFilePath) + uriBuilder.appendQueryParameter(PARAM_RESHARES, reshares.toString()) + uriBuilder.appendQueryParameter(PARAM_SUBFILES, subfiles.toString()) + + val getMethod = GetMethod(URL(uriBuilder.build().toString())) + + getMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + + val status = client.executeHttpMethod(getMethod) + + if (isSuccess(status)) { + // Parse xml response and obtain the list of shares + val parser = ShareToRemoteOperationResultParser( + ShareXMLParser() + ) + parser.ownCloudVersion = client.ownCloudVersion + parser.serverBaseUri = client.baseUri + result = parser.parse(getMethod.responseBodyAsString) + + if (result.isSuccess) { + Log_OC.d(TAG, "Got " + result.data.shares.size + " shares") + } + } else { + result = RemoteOperationResult(getMethod) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while getting shares", e) + } + + return result + } + + private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK + + companion object { + + private val TAG = GetRemoteSharesForFileOperation::class.java.simpleName + + private const val PARAM_PATH = "path" + private const val PARAM_RESHARES = "reshares" + private const val PARAM_SUBFILES = "subfiles" + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index f2bfcb0b..58d27806 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -48,13 +48,12 @@ class RemoteShare : Parcelable, Serializable { var fileSource: Long = 0 var itemSource: Long = 0 var shareType: ShareType? = null - var permissions: Int = 0 - var sharedDate: Long = 0 - var expirationDate: Long = 0 + var permissions: Int = INIT_PERMISSION + var sharedDate: Long = INIT_SHARED_DATE + var expirationDate: Long = INIT_EXPIRATION_DATE_IN_MILLIS var isFolder: Boolean = false var userId: Long = 0 var remoteId: Long = 0 - private set val isPasswordProtected: Boolean get() = ShareType.PUBLIC_LINK == shareType && shareWith.isNotEmpty() @@ -65,7 +64,7 @@ class RemoteShare : Parcelable, Serializable { constructor(path: String?) { resetData() - if (path == null || path.isEmpty() || !path.startsWith(FileUtils.PATH_SEPARATOR)) { + if (path.isNullOrEmpty() || !path.startsWith(FileUtils.PATH_SEPARATOR)) { Log_OC.e(TAG, "Trying to create a RemoteShare with a non valid path") throw IllegalArgumentException("Trying to create a RemoteShare with a non valid path: " + path!!) } @@ -87,18 +86,14 @@ class RemoteShare : Parcelable, Serializable { itemSource = 0 shareType = ShareType.NO_SHARED permissions = DEFAULT_PERMISSION - sharedDate = 0 - expirationDate = 0 + sharedDate = INIT_SHARED_DATE + expirationDate = INIT_EXPIRATION_DATE_IN_MILLIS sharedWithAdditionalInfo = "" isFolder = false userId = -1 remoteId = -1 } - fun setIdRemoteShared(remoteId: Long) { - this.remoteId = remoteId - } - /** * Reconstruct from parcel * @@ -131,9 +126,7 @@ class RemoteShare : Parcelable, Serializable { remoteId = source.readLong() } - override fun describeContents(): Int { - return this.hashCode() - } + override fun describeContents(): Int = this.hashCode() override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(shareWith) @@ -145,7 +138,7 @@ class RemoteShare : Parcelable, Serializable { dest.writeString(shareLink) dest.writeLong(fileSource) dest.writeLong(itemSource) - dest.writeString(if (shareType == null) "" else shareType!!.name) + dest.writeString(shareType?.name ?: "") dest.writeInt(permissions) dest.writeLong(sharedDate) dest.writeLong(expirationDate) @@ -163,29 +156,34 @@ class RemoteShare : Parcelable, Serializable { private val TAG = RemoteShare::class.java.simpleName - val DEFAULT_PERMISSION = -1 - val READ_PERMISSION_FLAG = 1 - val UPDATE_PERMISSION_FLAG = 2 - val CREATE_PERMISSION_FLAG = 4 - val DELETE_PERMISSION_FLAG = 8 - val SHARE_PERMISSION_FLAG = 16 - val MAXIMUM_PERMISSIONS_FOR_FILE = READ_PERMISSION_FLAG + + const val INIT_PERMISSION = 0 + const val DEFAULT_PERMISSION = -1 + const val READ_PERMISSION_FLAG = 1 + const val UPDATE_PERMISSION_FLAG = 2 + const val CREATE_PERMISSION_FLAG = 4 + const val DELETE_PERMISSION_FLAG = 8 + const val SHARE_PERMISSION_FLAG = 16 + const val MAXIMUM_PERMISSIONS_FOR_FILE = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG + SHARE_PERMISSION_FLAG - val MAXIMUM_PERMISSIONS_FOR_FOLDER = MAXIMUM_PERMISSIONS_FOR_FILE + + const val MAXIMUM_PERMISSIONS_FOR_FOLDER = MAXIMUM_PERMISSIONS_FOR_FILE + CREATE_PERMISSION_FLAG + DELETE_PERMISSION_FLAG - val FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9 = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG - val FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9 = READ_PERMISSION_FLAG + + const val FEDERATED_PERMISSIONS_FOR_FILE_UP_TO_OC9 = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG + const val FEDERATED_PERMISSIONS_FOR_FILE_AFTER_OC9 = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG + SHARE_PERMISSION_FLAG - val FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 = READ_PERMISSION_FLAG + + const val FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 = READ_PERMISSION_FLAG + UPDATE_PERMISSION_FLAG + CREATE_PERMISSION_FLAG + DELETE_PERMISSION_FLAG - val FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = + const val FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + SHARE_PERMISSION_FLAG + + const val INIT_EXPIRATION_DATE_IN_MILLIS : Long = 0 + const val INIT_SHARED_DATE : Long = 0 + /** * Parcelable Methods */ diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt index bf37ae80..33ef20cb 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt @@ -43,13 +43,12 @@ import java.net.URL * @author David González Verdugo */ -class RemoveRemoteShareOperation /** * Constructor * * @param remoteShareId Share ID */ - (private val mRemoteShareId: Long) : RemoteOperation() { +class RemoveRemoteShareOperation(private val remoteShareId: Long) : RemoteOperation() { override fun run(client: OwnCloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -58,7 +57,7 @@ class RemoveRemoteShareOperation val requestUri = client.baseUri val uriBuilder = requestUri.buildUpon() uriBuilder.appendEncodedPath(ShareUtils.SHARING_API_PATH) - uriBuilder.appendEncodedPath(mRemoteShareId.toString()) + uriBuilder.appendEncodedPath(remoteShareId.toString()) val deleteMethod = DeleteMethod( URL(uriBuilder.build().toString()) @@ -76,7 +75,7 @@ class RemoveRemoteShareOperation ) result = parser.parse(deleteMethod.responseBodyAsString) - Log_OC.d(TAG, "Unshare " + mRemoteShareId + ": " + result.logMessage) + Log_OC.d(TAG, "Unshare " + remoteShareId + ": " + result.logMessage) } else { result = RemoteOperationResult(deleteMethod) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt index 18be72d7..2f503ac1 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/SharePermissionsBuilder.kt @@ -32,7 +32,7 @@ package com.owncloud.android.lib.resources.shares class SharePermissionsBuilder { /** Set of permissions */ - private var mPermissions = RemoteShare.READ_PERMISSION_FLAG // READ is minimum permission + private var permissions = RemoteShare.READ_PERMISSION_FLAG // READ is minimum permission /** * Sets or clears permission to reshare a file or folder. @@ -87,10 +87,10 @@ class SharePermissionsBuilder { private fun updatePermission(permissionsFlag: Int, enable: Boolean) { if (enable) { // add permission - mPermissions = mPermissions or permissionsFlag + permissions = permissions or permissionsFlag } else { // delete permission - mPermissions = mPermissions and permissionsFlag.inv() + permissions = permissions and permissionsFlag.inv() } } @@ -99,7 +99,5 @@ class SharePermissionsBuilder { * * @return An int value representing the accumulated set of permissions. */ - fun build(): Int { - return mPermissions - } + fun build(): Int = permissions } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt index abb416a2..06e8d506 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -47,7 +47,7 @@ class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLPar } var result: RemoteOperationResult - val resultData = ArrayList() + var resultData: List? try { // Parse xml response and obtain the list of shares @@ -61,25 +61,25 @@ class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLPar if (shareXmlParser?.isSuccess!!) { if (!shares.isNullOrEmpty() || !oneOrMoreSharesRequired) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) - if (shares != null) { - for (share in shares) { - resultData.add(share) - // build the share link if not in the response - // (needed for OC servers < 9.0.0, see ShareXMLParser.java#line256) - if (share.shareType == ShareType.PUBLIC_LINK - && share.shareLink.isEmpty() - && share.token.isNotEmpty() - ) { - if (serverBaseUri != null) { - val sharingLinkPath = ShareUtils.getSharingLinkPath(ownCloudVersion) - share.shareLink = serverBaseUri.toString() + sharingLinkPath + share.token - } else { - Log_OC.e(TAG, "Couldn't build link for public share :(") - } - } + + resultData = shares?.map { share -> + if (share.shareType != ShareType.PUBLIC_LINK || + share.shareLink.isNotEmpty() || + share.token.isEmpty()) { + return@map share } + + if (serverBaseUri != null) { + val sharingLinkPath = ShareUtils.getSharingLinkPath(ownCloudVersion) + share.shareLink = serverBaseUri.toString() + sharingLinkPath + share.token + } else { + Log_OC.e(TAG, "Couldn't build link for public share :(") + } + + share } - result.setData(ShareParserResult(resultData, "")) + + result.setData(ShareParserResult(ArrayList(resultData), "")) } else { result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index 2dc31144..b9f7cc76 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -179,7 +179,7 @@ class ShareXMLParser { } else if (name.equals(NODE_ID, ignoreCase = true)) {// Parse Create XML Response share = RemoteShare() val value = readNode(parser, NODE_ID) - share.setIdRemoteShared(Integer.parseInt(value).toLong()) + share.remoteId = Integer.parseInt(value).toLong() } else if (name.equals(NODE_URL, ignoreCase = true)) { // NOTE: this field is received in all the public shares from OC 9.0.0 @@ -235,7 +235,7 @@ class ShareXMLParser { readElement(parser, shares) } else if (name.equals(NODE_ID, ignoreCase = true)) { - share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID)).toLong()) + share.remoteId = Integer.parseInt(readNode(parser, NODE_ID)).toLong() } else if (name.equals(NODE_ITEM_TYPE, ignoreCase = true)) { share.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 2b6422ab..24f283c2 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -31,6 +31,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.PutMethod 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 com.owncloud.android.lib.resources.shares.RemoteShare.Companion.INIT_PERMISSION import okhttp3.FormBody import java.net.URL import java.text.SimpleDateFormat @@ -53,84 +54,34 @@ class UpdateRemoteShareOperation * * @param remoteId Identifier of the share to update. */ - ( - /** - * Identifier of the share to update - */ - private val remoteId: Long -) : RemoteOperation() { + (private val remoteId: Long) : RemoteOperation() { /** - * Password to set for the public link - */ - private var password: String? = null - - /** - * Expiration date to set for the public link - */ - private var expirationDateInMillis: Long = 0 - - /** - * Access permissions for the file bound to the share - */ - private var permissions: Int = 0 - - /** - * Upload permissions for the public link (only folders) - */ - private var publicUpload: Boolean? = null - private var name: String? = null - - init { - password = null // no update - expirationDateInMillis = 0 // no update - publicUpload = null - permissions = RemoteShare.DEFAULT_PERMISSION - } - - /** - * 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. - */ - fun setName(name: String) { - this.name = name - } - - /** - * Set password to update in Share resource. + * Password to update in Share resource. * * @param password Password to set to the target share. * Empty string clears the current password. * Null results in no update applied to the password. */ - fun setPassword(password: String) { - this.password = password - } + var password: String? = null /** - * Set expiration date to update in Share resource. + * Expiration date to update in Share resource. * * @param expirationDateInMillis Expiration date to set to the target share. * A negative value clears the current expiration date. * Zero value (start-of-epoch) results in no update done on * the expiration date. */ - fun setExpirationDate(expirationDateInMillis: Long) { - this.expirationDateInMillis = expirationDateInMillis - } + var expirationDateInMillis: Long = INITIAL_EXPIRATION_DATE_IN_MILLIS /** - * Set permissions to update in Share resource. + * Permissions to update in Share resource. * * @param permissions Permissions to set to the target share. * Values <= 0 result in no update applied to the permissions. */ - fun setPermissions(permissions: Int) { - this.permissions = permissions - } + var permissions: Int = INIT_PERMISSION /** * Enable upload permissions to update in Share resource. @@ -138,8 +89,21 @@ class UpdateRemoteShareOperation * @param publicUpload Upload permission to set to the target share. * Null results in no update applied to the upload permission. */ - fun setPublicUpload(publicUpload: Boolean?) { - this.publicUpload = publicUpload + var publicUpload: Boolean? = null + /** + * 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. + */ + var name: String? = null + + init { + password = null // no update + expirationDateInMillis = INITIAL_EXPIRATION_DATE_IN_MILLIS // no update + publicUpload = null + permissions = RemoteShare.DEFAULT_PERMISSION } override fun run(client: OwnCloudClient): RemoteOperationResult { @@ -153,11 +117,11 @@ class UpdateRemoteShareOperation formBodyBuilder.add(PARAM_NAME, name!!) } - if (expirationDateInMillis < 0) { + if (expirationDateInMillis < INITIAL_EXPIRATION_DATE_IN_MILLIS) { // clear expiration date formBodyBuilder.add(PARAM_EXPIRATION_DATE, "") - } else if (expirationDateInMillis > 0) { + } else if (expirationDateInMillis > INITIAL_EXPIRATION_DATE_IN_MILLIS) { // set expiration date val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) val expirationDate = Calendar.getInstance() @@ -172,7 +136,7 @@ class UpdateRemoteShareOperation // IMPORTANT: permissions parameter needs to be updated after mPublicUpload parameter, // otherwise they would be set always as 1 (READ) in the server when mPublicUpload was updated - if (permissions > 0) { + if (permissions > INIT_PERMISSION) { // set permissions formBodyBuilder.add(PARAM_PERMISSIONS, permissions.toString()) } @@ -212,21 +176,21 @@ class UpdateRemoteShareOperation return result } - private fun isSuccess(status: Int): Boolean { - return status == HttpConstants.HTTP_OK - } + private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK companion object { private val TAG = GetRemoteShareOperation::class.java.simpleName - private val PARAM_NAME = "name" - private val PARAM_PASSWORD = "password" - private val PARAM_EXPIRATION_DATE = "expireDate" - private val PARAM_PERMISSIONS = "permissions" - private val PARAM_PUBLIC_UPLOAD = "publicUpload" - private val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" - private val ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded" - private val ENTITY_CHARSET = "UTF-8" + private const val PARAM_NAME = "name" + private const val PARAM_PASSWORD = "password" + private const val PARAM_EXPIRATION_DATE = "expireDate" + private const val PARAM_PERMISSIONS = "permissions" + private const val PARAM_PUBLIC_UPLOAD = "publicUpload" + private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + private const val ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded" + private const val ENTITY_CHARSET = "UTF-8" + + private const val INITIAL_EXPIRATION_DATE_IN_MILLIS : Long = 0 } } \ No newline at end of file From cbb15c36268c4db8fff6bdaef86f8aab8d24bc4b Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 28 Feb 2019 15:28:00 +0100 Subject: [PATCH 12/37] Order CreateRemoteShareOperation and make it possible to get sharing errors with new arch --- .../android/lib/common/operations/RemoteOperationResult.java | 4 ++++ .../android/lib/resources/shares/ShareParserResult.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 18d417fc..e87ed5ec 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -526,6 +526,10 @@ public class RemoteOperationResult mData = data; } + public void setHttpPhrase(String httpPhrase) { + mHttpPhrase = httpPhrase; + } + public enum ResultCode { OK, OK_SSL, diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt index e4c0e9ed..24e6a000 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt @@ -27,4 +27,4 @@ package com.owncloud.android.lib.resources.shares import java.util.ArrayList -class ShareParserResult(val shares: ArrayList, val parserMessage: String) \ No newline at end of file +class ShareParserResult(val shares: ArrayList, val parserMessage: String) From 1114c38ff753b427628e4b722388a85a8eec825c Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 6 Mar 2019 13:19:37 +0100 Subject: [PATCH 13/37] Reorder CreateRemoteShareOperation params --- .../shares/CreateRemoteShareOperation.kt | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index fba6b72f..e5f7247c 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -47,7 +47,7 @@ import java.util.Locale * @author David A. Velasco * @author David González Verdugo */ -class CreateRemoteShareOperation + /** * Constructor * @@ -55,9 +55,6 @@ class CreateRemoteShareOperation * @param shareType 0 = user, 1 = group, 3 = Public link. Mandatory argument * @param shareWith User/group ID with who the file should be shared. This is mandatory for shareType * of 0 or 1 - * @param publicUpload If false (default) public cannot upload to a public shared folder. - * If true public can upload to a shared folder. Only available for public link shares - * @param password Password to protect a public link share. Only available for public link shares * @param permissions 1 - Read only Default for public shares * 2 - Update * 4 - Create @@ -68,25 +65,22 @@ class CreateRemoteShareOperation * To obtain combinations, add the desired values together. * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ +class CreateRemoteShareOperation ( private val remoteFilePath: String, private val shareType: ShareType, private val shareWith: String, - var publicUpload: Boolean?, // Upload permissions for the public link (only folders) - var password: String?, // Password to set for the public link - var permissions: Int // Access permissions for the file bound to the share + private val permissions: Int ) : RemoteOperation() { var getShareDetails: Boolean = false // To retrieve more info about the just created share - /** - * Name to set for the public link - */ - var name = "" + var name = "" // Name to set for the public link - /** - * Expiration date to set for the public link - */ - var expirationDateInMillis: Long = INIT_EXPIRATION_DATE_IN_MILLIS + var password: String = "" // Password to set for the public link + + var expirationDateInMillis: Long = INIT_EXPIRATION_DATE_IN_MILLIS // Expiration date to set for the public link + + var publicUpload: Boolean = false // Upload permissions for the public link (only folders) init { getShareDetails = false // defaults to false for backwards compatibility From 0614e7a9854ec4bb0228f581e3497dff810b163b Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 6 Mar 2019 13:29:51 +0100 Subject: [PATCH 14/37] Solve conflicts with get public shares branch --- .../android/lib/resources/shares/ShareParserResult.kt | 2 +- .../shares/ShareToRemoteOperationResultParser.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt index 24e6a000..96de17b6 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt @@ -27,4 +27,4 @@ package com.owncloud.android.lib.resources.shares import java.util.ArrayList -class ShareParserResult(val shares: ArrayList, val parserMessage: String) +class ShareParserResult(val shares: ArrayList) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt index 06e8d506..5406fb36 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -79,7 +79,7 @@ class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLPar share } - result.setData(ShareParserResult(ArrayList(resultData), "")) + result.setData(ShareParserResult(ArrayList(resultData))) } else { result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) @@ -88,13 +88,13 @@ class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLPar } else if (shareXmlParser?.isWrongParameter!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER) - result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) + result.httpPhrase = shareXmlParser?.message } else if (shareXmlParser?.isNotFound!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) - result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) + result.httpPhrase = shareXmlParser?.message } else if (shareXmlParser?.isForbidden!!) { result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN) - result.data = ShareParserResult(arrayListOf(), shareXmlParser?.message!!) + result.httpPhrase = shareXmlParser?.message } else { result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) } From a28f58f0fe0b9b9793b4fc568cc695b1e5b4fdbe Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 21 Mar 2019 12:38:39 +0100 Subject: [PATCH 15/37] Apply changes requested --- build.gradle | 2 +- .../android/lib/resources/shares/CreateRemoteShareOperation.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d730ec48..cca488ca 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { // Libraries - kotlinVersion = '1.3.11' + kotlinVersion = '1.3.21' } repositories { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index e5f7247c..0bb662e5 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -72,7 +72,7 @@ class CreateRemoteShareOperation private val shareWith: String, private val permissions: Int ) : RemoteOperation() { - var getShareDetails: Boolean = false // To retrieve more info about the just created share + var getShareDetails = false // To retrieve more info about the just created share var name = "" // Name to set for the public link From 64f5f08deda62d19733762a2a03eeba12b2027be Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 26 Mar 2019 18:31:42 +0100 Subject: [PATCH 16/37] Apply CR changes --- .../shares/CreateRemoteShareOperation.kt | 6 +- .../lib/resources/shares/ShareParserResult.kt | 4 +- .../ShareToRemoteOperationResultParser.kt | 73 ++++++++++--------- .../lib/resources/status/OwnCloudVersion.kt | 38 ++++++---- 4 files changed, 67 insertions(+), 54 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 0bb662e5..f9e0fa27 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -72,7 +72,7 @@ class CreateRemoteShareOperation private val shareWith: String, private val permissions: Int ) : RemoteOperation() { - var getShareDetails = false // To retrieve more info about the just created share + var retrieveShareDetails = false // To retrieve more info about the just created share var name = "" // Name to set for the public link @@ -83,7 +83,7 @@ class CreateRemoteShareOperation var publicUpload: Boolean = false // Upload permissions for the public link (only folders) init { - getShareDetails = false // defaults to false for backwards compatibility + retrieveShareDetails = false // defaults to false for backwards compatibility } override fun run(client: OwnCloudClient): RemoteOperationResult { @@ -140,7 +140,7 @@ class CreateRemoteShareOperation parser.serverBaseUri = client.baseUri result = parser.parse(postMethod.responseBodyAsString) - if (result.isSuccess && getShareDetails) { + if (result.isSuccess && retrieveShareDetails) { // TODO Use executeHttpMethod // retrieve more info - POST only returns the index of the new share diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt index 96de17b6..bd0920a6 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareParserResult.kt @@ -25,6 +25,4 @@ package com.owncloud.android.lib.resources.shares -import java.util.ArrayList - -class ShareParserResult(val shares: ArrayList) +class ShareParserResult(val shares: List) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt index 5406fb36..c3e23f3f 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareToRemoteOperationResultParser.kt @@ -58,47 +58,52 @@ class ShareToRemoteOperationResultParser(private var shareXmlParser: ShareXMLPar } val shares = shareXmlParser?.parseXMLResponse(byteArrayServerResponse) - if (shareXmlParser?.isSuccess!!) { - if (!shares.isNullOrEmpty() || !oneOrMoreSharesRequired) { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) + when { + shareXmlParser?.isSuccess!! -> { + if (!shares.isNullOrEmpty() || !oneOrMoreSharesRequired) { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.OK) - resultData = shares?.map { share -> - if (share.shareType != ShareType.PUBLIC_LINK || - share.shareLink.isNotEmpty() || - share.token.isEmpty()) { - return@map share + resultData = shares?.map { share -> + if (share.shareType != ShareType.PUBLIC_LINK || + share.shareLink.isNotEmpty() || + share.token.isEmpty() + ) { + return@map share + } + + if (serverBaseUri != null) { + val sharingLinkPath = ShareUtils.getSharingLinkPath(ownCloudVersion) + share.shareLink = serverBaseUri.toString() + sharingLinkPath + share.token + } else { + Log_OC.e(TAG, "Couldn't build link for public share :(") + } + + share } - if (serverBaseUri != null) { - val sharingLinkPath = ShareUtils.getSharingLinkPath(ownCloudVersion) - share.shareLink = serverBaseUri.toString() + sharingLinkPath + share.token - } else { - Log_OC.e(TAG, "Couldn't build link for public share :(") - } + result.setData(ShareParserResult(ArrayList(resultData))) - share + } else { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + Log_OC.e(TAG, "Successful status with no share in the response") } - - result.setData(ShareParserResult(ArrayList(resultData))) - - } else { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) - Log_OC.e(TAG, "Successful status with no share in the response") } - - } else if (shareXmlParser?.isWrongParameter!!) { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER) - result.httpPhrase = shareXmlParser?.message - } else if (shareXmlParser?.isNotFound!!) { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) - result.httpPhrase = shareXmlParser?.message - } else if (shareXmlParser?.isForbidden!!) { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN) - result.httpPhrase = shareXmlParser?.message - } else { - result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + shareXmlParser?.isWrongParameter!! -> { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER) + result.httpPhrase = shareXmlParser?.message + } + shareXmlParser?.isNotFound!! -> { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) + result.httpPhrase = shareXmlParser?.message + } + shareXmlParser?.isForbidden!! -> { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_FORBIDDEN) + result.httpPhrase = shareXmlParser?.message + } + else -> { + result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) + } } - } catch (e: XmlPullParserException) { Log_OC.e(TAG, "Error parsing response from server ", e) result = RemoteOperationResult(RemoteOperationResult.ResultCode.WRONG_SERVER_RESPONSE) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt index 8b09859e..ef9b6357 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.kt @@ -87,6 +87,11 @@ class OwnCloudVersion(version: String) : Comparable, Parcelable val isPublicSharingWriteOnlySupported: Boolean get() = mVersion >= MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING + val isPublicUploadPermissionNeeded: Boolean + get() = mVersion >= MINIMUN_MAJOR_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION && + (mVersion > MINIMUN_MINOR_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION || + mVersion > MINIMUN_MICRO_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION) + init { var version = version mVersion = 0 @@ -171,34 +176,39 @@ class OwnCloudVersion(version: String) : Comparable, Parcelable } companion object { + private const val MINIMUN_MINOR_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION = 0x01000000 // 1.0.0 - val MINIMUN_VERSION_FOR_CHUNKED_UPLOADS = 0x04050000 // 4.5 + private const val MINIMUN_MICRO_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION = 0x03000000 // 3.0.0 - val MINIMUM_VERSION_FOR_SHARING_API = 0x05001B00 // 5.0.27 + const val MINIMUN_VERSION_FOR_CHUNKED_UPLOADS = 0x04050000 // 4.5 - val MINIMUM_VERSION_WITH_FORBIDDEN_CHARS = 0x08010000 // 8.1 + const val MINIMUM_VERSION_FOR_SHARING_API = 0x05001B00 // 5.0.27 - val MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS = 0x07080000 // 7.8.0 + const val MINIMUM_VERSION_WITH_FORBIDDEN_CHARS = 0x08010000 // 8.1 - val MINIMUM_VERSION_FOR_SEARCHING_USERS = 0x08020000 //8.2 + const val MINIMUM_SERVER_VERSION_FOR_REMOTE_THUMBNAILS = 0x07080000 // 7.8.0 - val VERSION_8 = 0x08000000 // 8.0 + const val MINIMUM_VERSION_FOR_SEARCHING_USERS = 0x08020000 //8.2 - val MINIMUM_VERSION_CAPABILITIES_API = 0x08010000 // 8.1 + const val VERSION_8 = 0x08000000 // 8.0 - private val MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED = 0x09010000 // 9.1 + const val MINIMUM_VERSION_CAPABILITIES_API = 0x08010000 // 8.1 - private val MINIMUM_VERSION_WITH_SESSION_MONITORING = 0x09010000 // 9.1 + private const val MINIMUM_VERSION_WITH_NOT_RESHAREABLE_FEDERATED = 0x09010000 // 9.1 - private val MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE = 0x09010301 + private const val MINIMUM_VERSION_WITH_SESSION_MONITORING = 0x09010000 // 9.1 + + private const val 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 val MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA000000 // 10.0.0 + private const val MINIMUM_VERSION_WITH_MULTIPLE_PUBLIC_SHARING = 0xA000000 // 10.0.0 - private val MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING = 0xA000100 // 10.0.1 + private const val MINIMUN_MAJOR_VERSION_WITHOUT_PUBLIC_UPLOAD_PERMISSION = 0xA000000 // 10.0.0 - private val INVALID_ZERO_VERSION = "0.0.0" + private const val MINIMUM_VERSION_WITH_WRITE_ONLY_PUBLIC_SHARING = 0xA000100 // 10.0.1 - private val MAX_DOTS = 3 + private const val INVALID_ZERO_VERSION = "0.0.0" + + private const val MAX_DOTS = 3 } } From 6bd64197b479125406ec6f118bfbab077e6debb8 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 2 Apr 2019 12:57:01 +0200 Subject: [PATCH 17/37] Convert capabilities related classes to Kotlin --- .../lib/resources/shares/RemoteShare.kt | 5 +- .../shares/{ShareType.java => ShareType.kt} | 46 +-- ...leanType.java => CapabilityBooleanType.kt} | 67 ++-- .../GetRemoteCapabilitiesOperation.java | 316 ---------------- .../status/GetRemoteCapabilitiesOperation.kt | 323 +++++++++++++++++ .../lib/resources/status/OCCapability.java | 339 ------------------ .../lib/resources/status/RemoteCapability.kt | 105 ++++++ 7 files changed, 472 insertions(+), 729 deletions(-) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/{ShareType.java => ShareType.kt} (67%) rename owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/{CapabilityBooleanType.java => CapabilityBooleanType.kt} (57%) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index 58d27806..ade6f2ec 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -180,9 +180,8 @@ class RemoteShare : Parcelable, Serializable { const val FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + SHARE_PERMISSION_FLAG - - const val INIT_EXPIRATION_DATE_IN_MILLIS : Long = 0 - const val INIT_SHARED_DATE : Long = 0 + const val INIT_EXPIRATION_DATE_IN_MILLIS: Long = 0 + const val INIT_SHARED_DATE: Long = 0 /** * Parcelable Methods diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt similarity index 67% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt index e272abbd..826111df 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. + * Copyright (C) 2019 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 @@ -22,7 +22,7 @@ * */ -package com.owncloud.android.lib.resources.shares; +package com.owncloud.android.lib.resources.shares /** * Enum for Share Type, with values: @@ -36,7 +36,7 @@ package com.owncloud.android.lib.resources.shares; * @author masensio */ -public enum ShareType { +enum class ShareType private constructor(val value: Int) { NO_SHARED(-1), USER(0), GROUP(1), @@ -45,33 +45,19 @@ public enum ShareType { CONTACT(5), FEDERATED(6); - private int value; + companion object { - private ShareType(int value) { - this.value = value; - } - - public static ShareType fromValue(int value) { - switch (value) { - case -1: - return NO_SHARED; - case 0: - return USER; - case 1: - return GROUP; - case 3: - return PUBLIC_LINK; - case 4: - return EMAIL; - case 5: - return CONTACT; - case 6: - return FEDERATED; + fun fromValue(value: Int): ShareType? { + when (value) { + -1 -> return NO_SHARED + 0 -> return USER + 1 -> return GROUP + 3 -> return PUBLIC_LINK + 4 -> return EMAIL + 5 -> return CONTACT + 6 -> return FEDERATED + } + return null } - return null; } - - public int getValue() { - return value; - } -}; \ No newline at end of file +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt similarity index 57% rename from owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt index 706ab357..bc467e59 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * @author masensio * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -22,59 +22,44 @@ * THE SOFTWARE. * */ -package com.owncloud.android.lib.resources.status; +package com.owncloud.android.lib.resources.status /** - * Enum for Boolean Type in OCCapability parameters, with values: + * Enum for Boolean Type in RemoteCapability parameters, with values: * -1 - Unknown * 0 - False * 1 - True */ -public enum CapabilityBooleanType { +enum class CapabilityBooleanType private constructor(val value: Int) { UNKNOWN(-1), FALSE(0), TRUE(1); - private int value; + val isUnknown: Boolean + get() = value == -1 - CapabilityBooleanType(int value) { - this.value = value; - } + val isFalse: Boolean + get() = value == 0 - public static CapabilityBooleanType fromValue(int value) { - switch (value) { - case -1: - return UNKNOWN; - case 0: - return FALSE; - case 1: - return TRUE; + val isTrue: Boolean + get() = value == 1 + + companion object { + fun fromValue(value: Int): CapabilityBooleanType? { + when (value) { + -1 -> return UNKNOWN + 0 -> return FALSE + 1 -> return TRUE + } + return null } - return null; - } - public static CapabilityBooleanType fromBooleanValue(boolean boolValue) { - if (boolValue) { - return TRUE; - } else { - return FALSE; + fun fromBooleanValue(boolValue: Boolean): CapabilityBooleanType { + return if (boolValue) { + TRUE + } else { + FALSE + } } } - - public int getValue() { - return value; - } - - public boolean isUnknown() { - return getValue() == -1; - } - - public boolean isFalse() { - return getValue() == 0; - } - - public boolean isTrue() { - return getValue() == 1; - } - -}; \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java deleted file mode 100644 index ec319df4..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.java +++ /dev/null @@ -1,316 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * @author masensio - * @author Semih Serhat Karakaya - * @author David González Verdugo - * Copyright (C) 2019 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 - * 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.lib.resources.status; - -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod; -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 org.json.JSONObject; - -import java.net.URL; - -import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Get the Capabilities from the server - * Save in Result.getData in a OCCapability object - * - * @author masensio - * @author David González Verdugo - */ -public class GetRemoteCapabilitiesOperation extends RemoteOperation { - - private static final String TAG = GetRemoteCapabilitiesOperation.class.getSimpleName(); - - // OCS Routes - private static final String OCS_ROUTE = "ocs/v2.php/cloud/capabilities"; - - // Arguments - names - private static final String PARAM_FORMAT = "format"; - - // Arguments - constant values - private static final String VALUE_FORMAT = "json"; - - // JSON Node names - private static final String NODE_OCS = "ocs"; - - private static final String NODE_META = "meta"; - - private static final String NODE_DATA = "data"; - private static final String NODE_VERSION = "version"; - - private static final String NODE_CAPABILITIES = "capabilities"; - private static final String NODE_CORE = "core"; - - private static final String NODE_FILES_SHARING = "files_sharing"; - private static final String NODE_PUBLIC = "public"; - private static final String NODE_PASSWORD = "password"; - private static final String NODE_ENFORCED_FOR = "enforced_for"; - private static final String NODE_EXPIRE_DATE = "expire_date"; - private static final String NODE_USER = "user"; - private static final String NODE_FEDERATION = "federation"; - private static final String NODE_FILES = "files"; - - private static final String PROPERTY_STATUS = "status"; - private static final String PROPERTY_STATUSCODE = "statuscode"; - private static final String PROPERTY_MESSAGE = "message"; - - private static final String PROPERTY_POLLINTERVAL = "pollinterval"; - - private static final String PROPERTY_MAJOR = "major"; - private static final String PROPERTY_MINOR = "minor"; - private static final String PROPERTY_MICRO = "micro"; - private static final String PROPERTY_STRING = "string"; - private static final String PROPERTY_EDITION = "edition"; - - private static final String PROPERTY_API_ENABLED = "api_enabled"; - private static final String PROPERTY_ENABLED = "enabled"; - private static final String PROPERTY_ENFORCED = "enforced"; - private static final String PROPERTY_ENFORCED_READ_ONLY = "read_only"; - private static final String PROPERTY_ENFORCED_READ_WRITE = "read_write"; - private static final String PROPERTY_ENFORCED_UPLOAD_ONLY = "upload_only"; - 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_UPLOAD_ONLY = "supports_upload_only"; - 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"; - - private static final String PROPERTY_BIGFILECHUNKING = "bigfilechunking"; - private static final String PROPERTY_UNDELETE = "undelete"; - private static final String PROPERTY_VERSIONING = "versioning"; - - /** - * Constructor - */ - public GetRemoteCapabilitiesOperation() { - - } - - @Override - protected RemoteOperationResult run(OwnCloudClient client) { - RemoteOperationResult result; - - try { - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon(); - uriBuilder.appendEncodedPath(OCS_ROUTE); // avoid starting "/" in this method - uriBuilder.appendQueryParameter(PARAM_FORMAT, VALUE_FORMAT); - - GetMethod getMethod = new GetMethod(new URL(uriBuilder.build().toString())); - - getMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.executeHttpMethod(getMethod); - - String response = getMethod.getResponseBodyAsString(); - if (isSuccess(status)) { - Log_OC.d(TAG, "Successful response: " + response); - - // Parse the response - JSONObject respJSON = new JSONObject(response); - JSONObject respOCS = respJSON.getJSONObject(NODE_OCS); - JSONObject respMeta = respOCS.getJSONObject(NODE_META); - JSONObject respData = respOCS.getJSONObject(NODE_DATA); - - // Read meta - boolean statusProp = respMeta.getString(PROPERTY_STATUS).equalsIgnoreCase("ok"); - int statuscode = respMeta.getInt(PROPERTY_STATUSCODE); - String message = respMeta.getString(PROPERTY_MESSAGE); - - if (statusProp) { - OCCapability capability = new OCCapability(); - // Add Version - if (respData.has(NODE_VERSION)) { - JSONObject respVersion = respData.getJSONObject(NODE_VERSION); - capability.setVersionMayor(respVersion.getInt(PROPERTY_MAJOR)); - capability.setVersionMinor(respVersion.getInt(PROPERTY_MINOR)); - capability.setVersionMicro(respVersion.getInt(PROPERTY_MICRO)); - capability.setVersionString(respVersion.getString(PROPERTY_STRING)); - capability.setVersionEdition(respVersion.getString(PROPERTY_EDITION)); - Log_OC.d(TAG, "*** Added " + NODE_VERSION); - } - - // Capabilities Object - if (respData.has(NODE_CAPABILITIES)) { - JSONObject respCapabilities = respData.getJSONObject(NODE_CAPABILITIES); - - // Add Core: pollinterval - if (respCapabilities.has(NODE_CORE)) { - JSONObject respCore = respCapabilities.getJSONObject(NODE_CORE); - capability.setCorePollinterval(respCore.getInt(PROPERTY_POLLINTERVAL)); - Log_OC.d(TAG, "*** Added " + NODE_CORE); - } - - // Add files_sharing: public, user, resharing - if (respCapabilities.has(NODE_FILES_SHARING)) { - JSONObject respFilesSharing = respCapabilities.getJSONObject(NODE_FILES_SHARING); - if (respFilesSharing.has(PROPERTY_API_ENABLED)) { - capability.setFilesSharingApiEnabled(CapabilityBooleanType.fromBooleanValue( - respFilesSharing.getBoolean(PROPERTY_API_ENABLED))); - } - - if (respFilesSharing.has(NODE_PUBLIC)) { - JSONObject respPublic = respFilesSharing.getJSONObject(NODE_PUBLIC); - capability.setFilesSharingPublicEnabled(CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_ENABLED))); - - if (respPublic.has(NODE_PASSWORD)) { - JSONObject respPassword = respPublic.getJSONObject(NODE_PASSWORD); - capability.setFilesSharingPublicPasswordEnforced( - CapabilityBooleanType.fromBooleanValue( - respPublic.getJSONObject(NODE_PASSWORD). - getBoolean(PROPERTY_ENFORCED) - ) - ); - - if(respPassword.has(NODE_ENFORCED_FOR)) { - capability.setFilesSharingPublicPasswordEnforcedReadOnly( - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR). - getBoolean(PROPERTY_ENFORCED_READ_ONLY) - ) - ); - - capability.setFilesSharingPublicPasswordEnforcedReadWrite( - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR). - getBoolean(PROPERTY_ENFORCED_READ_WRITE) - ) - ); - - capability.setFilesSharingPublicPasswordEnforcedUploadOnly( - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR). - getBoolean(PROPERTY_ENFORCED_UPLOAD_ONLY) - ) - ); - } - } - if (respPublic.has(NODE_EXPIRE_DATE)) { - JSONObject respExpireDate = respPublic.getJSONObject(NODE_EXPIRE_DATE); - capability.setFilesSharingPublicExpireDateEnabled( - CapabilityBooleanType.fromBooleanValue( - respExpireDate.getBoolean(PROPERTY_ENABLED))); - if (respExpireDate.has(PROPERTY_DAYS)) { - capability.setFilesSharingPublicExpireDateDays( - respExpireDate.getInt(PROPERTY_DAYS)); - } - if (respExpireDate.has(PROPERTY_ENFORCED)) { - capability.setFilesSharingPublicExpireDateEnforced( - CapabilityBooleanType.fromBooleanValue( - respExpireDate.getBoolean(PROPERTY_ENFORCED))); - } - } - if (respPublic.has(PROPERTY_UPLOAD)) { - capability.setFilesSharingPublicUpload(CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_UPLOAD))); - } - if (respPublic.has(PROPERTY_UPLOAD_ONLY)) { - capability.setFilesSharingPublicSupportsUploadOnly(CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_UPLOAD_ONLY))); - } - if (respPublic.has(PROPERTY_MULTIPLE)) { - capability.setFilesSharingPublicMultiple(CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_MULTIPLE))); - } - } - - if (respFilesSharing.has(NODE_USER)) { - JSONObject respUser = respFilesSharing.getJSONObject(NODE_USER); - capability.setFilesSharingUserSendMail(CapabilityBooleanType.fromBooleanValue( - respUser.getBoolean(PROPERTY_SEND_MAIL))); - } - - capability.setFilesSharingResharing(CapabilityBooleanType.fromBooleanValue( - respFilesSharing.getBoolean(PROPERTY_RESHARING))); - if (respFilesSharing.has(NODE_FEDERATION)) { - JSONObject respFederation = respFilesSharing.getJSONObject(NODE_FEDERATION); - capability.setFilesSharingFederationOutgoing( - CapabilityBooleanType.fromBooleanValue(respFederation.getBoolean(PROPERTY_OUTGOING))); - capability.setFilesSharingFederationIncoming(CapabilityBooleanType.fromBooleanValue( - respFederation.getBoolean(PROPERTY_INCOMING))); - } - Log_OC.d(TAG, "*** Added " + NODE_FILES_SHARING); - } - - if (respCapabilities.has(NODE_FILES)) { - JSONObject respFiles = respCapabilities.getJSONObject(NODE_FILES); - // Add files - capability.setFilesBigFileChuncking(CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_BIGFILECHUNKING))); - if (respFiles.has(PROPERTY_UNDELETE)) { - capability.setFilesUndelete(CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_UNDELETE))); - } - if (respFiles.has(PROPERTY_VERSIONING)) { - capability.setFilesVersioning(CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_VERSIONING))); - } - Log_OC.d(TAG, "*** Added " + NODE_FILES); - } - } - // Result - result = new RemoteOperationResult<>(OK); - result.setData(capability); - - Log_OC.d(TAG, "*** Get Capabilities completed "); - } else { - result = new RemoteOperationResult<>(statuscode, message, null); - Log_OC.e(TAG, "Failed response while getting capabilities from the server "); - Log_OC.e(TAG, "*** status: " + statusProp + "; message: " + message); - } - - } else { - result = new RemoteOperationResult<>(getMethod); - Log_OC.e(TAG, "Failed response while getting capabilities from the server "); - if (response != null) { - Log_OC.e(TAG, "*** status code: " + status + "; response message: " + response); - } else { - Log_OC.e(TAG, "*** status code: " + status); - } - } - - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Exception while getting capabilities", e); - } - return result; - } - - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt new file mode 100644 index 00000000..314e3bce --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt @@ -0,0 +1,323 @@ +/* ownCloud Android Library is available under MIT license + * @author masensio + * @author Semih Serhat Karakaya + * @author David González Verdugo + * Copyright (C) 2019 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 + * 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.lib.resources.status + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK +import com.owncloud.android.lib.common.utils.Log_OC +import org.json.JSONObject +import java.net.URL + +/** + * Get the Capabilities from the server + * Save in Result.getData in a RemoteCapability object + * + * @author masensio + * @author David González Verdugo + */ +/** + * Constructor + */ +class GetRemoteCapabilitiesOperation : RemoteOperation() { + + override fun run(client: OwnCloudClient): RemoteOperationResult { + var result: RemoteOperationResult + + try { + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + uriBuilder.appendEncodedPath(OCS_ROUTE) // avoid starting "/" in this method + uriBuilder.appendQueryParameter(PARAM_FORMAT, VALUE_FORMAT) + + val getMethod = GetMethod(URL(uriBuilder.build().toString())) + + getMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + + val status = client.executeHttpMethod(getMethod) + + val response = getMethod.responseBodyAsString + if (isSuccess(status)) { + Log_OC.d(TAG, "Successful response: " + response!!) + + // Parse the response + val respJSON = JSONObject(response) + val respOCS = respJSON.getJSONObject(NODE_OCS) + val respMeta = respOCS.getJSONObject(NODE_META) + val respData = respOCS.getJSONObject(NODE_DATA) + + // Read meta + val statusProp = respMeta.getString(PROPERTY_STATUS).equals("ok", ignoreCase = true) + val statuscode = respMeta.getInt(PROPERTY_STATUSCODE) + val message = respMeta.getString(PROPERTY_MESSAGE) + + if (statusProp) { + val capability = RemoteCapability() + // Add Version + if (respData.has(NODE_VERSION)) { + val respVersion = respData.getJSONObject(NODE_VERSION) + capability.versionMayor = respVersion.getInt(PROPERTY_MAJOR) + capability.versionMinor = respVersion.getInt(PROPERTY_MINOR) + capability.versionMicro = respVersion.getInt(PROPERTY_MICRO) + capability.versionString = respVersion.getString(PROPERTY_STRING) + capability.versionEdition = respVersion.getString(PROPERTY_EDITION) + Log_OC.d(TAG, "*** Added $NODE_VERSION") + } + + // Capabilities Object + if (respData.has(NODE_CAPABILITIES)) { + val respCapabilities = respData.getJSONObject(NODE_CAPABILITIES) + + // Add Core: pollinterval + if (respCapabilities.has(NODE_CORE)) { + val respCore = respCapabilities.getJSONObject(NODE_CORE) + capability.corePollinterval = respCore.getInt(PROPERTY_POLLINTERVAL) + Log_OC.d(TAG, "*** Added $NODE_CORE") + } + + // Add files_sharing: public, user, resharing + if (respCapabilities.has(NODE_FILES_SHARING)) { + val respFilesSharing = respCapabilities.getJSONObject(NODE_FILES_SHARING) + if (respFilesSharing.has(PROPERTY_API_ENABLED)) { + capability.filesSharingApiEnabled = CapabilityBooleanType.fromBooleanValue( + respFilesSharing.getBoolean(PROPERTY_API_ENABLED) + ) + } + + if (respFilesSharing.has(NODE_PUBLIC)) { + val respPublic = respFilesSharing.getJSONObject(NODE_PUBLIC) + capability.filesSharingPublicEnabled = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_ENABLED) + ) + + if (respPublic.has(NODE_PASSWORD)) { + val respPassword = respPublic.getJSONObject(NODE_PASSWORD) + capability.filesSharingPublicPasswordEnforced = + CapabilityBooleanType.fromBooleanValue( + respPublic.getJSONObject(NODE_PASSWORD).getBoolean(PROPERTY_ENFORCED) + ) + + if (respPassword.has(NODE_ENFORCED_FOR)) { + capability.filesSharingPublicPasswordEnforcedReadOnly = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_READ_ONLY + ) + ) + + capability.filesSharingPublicPasswordEnforcedReadWrite = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_READ_WRITE + ) + ) + + capability.filesSharingPublicPasswordEnforcedUploadOnly = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_UPLOAD_ONLY + ) + ) + } + } + if (respPublic.has(NODE_EXPIRE_DATE)) { + val respExpireDate = respPublic.getJSONObject(NODE_EXPIRE_DATE) + capability.filesSharingPublicExpireDateEnabled = + CapabilityBooleanType.fromBooleanValue( + respExpireDate.getBoolean(PROPERTY_ENABLED) + ) + if (respExpireDate.has(PROPERTY_DAYS)) { + capability.filesSharingPublicExpireDateDays = + respExpireDate.getInt(PROPERTY_DAYS) + } + if (respExpireDate.has(PROPERTY_ENFORCED)) { + capability.filesSharingPublicExpireDateEnforced = + CapabilityBooleanType.fromBooleanValue( + respExpireDate.getBoolean(PROPERTY_ENFORCED) + ) + } + } + if (respPublic.has(PROPERTY_UPLOAD)) { + capability.filesSharingPublicUpload = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_UPLOAD) + ) + } + if (respPublic.has(PROPERTY_UPLOAD_ONLY)) { + capability.filesSharingPublicSupportsUploadOnly = + CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_UPLOAD_ONLY) + ) + } + if (respPublic.has(PROPERTY_MULTIPLE)) { + capability.filesSharingPublicMultiple = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_MULTIPLE) + ) + } + } + + if (respFilesSharing.has(NODE_USER)) { + val respUser = respFilesSharing.getJSONObject(NODE_USER) + capability.filesSharingUserSendMail = CapabilityBooleanType.fromBooleanValue( + respUser.getBoolean(PROPERTY_SEND_MAIL) + ) + } + + capability.filesSharingResharing = CapabilityBooleanType.fromBooleanValue( + respFilesSharing.getBoolean(PROPERTY_RESHARING) + ) + if (respFilesSharing.has(NODE_FEDERATION)) { + val respFederation = respFilesSharing.getJSONObject(NODE_FEDERATION) + capability.filesSharingFederationOutgoing = + CapabilityBooleanType.fromBooleanValue(respFederation.getBoolean(PROPERTY_OUTGOING)) + capability.filesSharingFederationIncoming = CapabilityBooleanType.fromBooleanValue( + respFederation.getBoolean(PROPERTY_INCOMING) + ) + } + Log_OC.d(TAG, "*** Added $NODE_FILES_SHARING") + } + + if (respCapabilities.has(NODE_FILES)) { + val respFiles = respCapabilities.getJSONObject(NODE_FILES) + // Add files + capability.filesBigFileChuncking = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_BIGFILECHUNKING) + ) + if (respFiles.has(PROPERTY_UNDELETE)) { + capability.filesUndelete = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_UNDELETE) + ) + } + if (respFiles.has(PROPERTY_VERSIONING)) { + capability.filesVersioning = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_VERSIONING) + ) + } + Log_OC.d(TAG, "*** Added $NODE_FILES") + } + } + // Result + result = RemoteOperationResult(OK) + result.data = capability + + Log_OC.d(TAG, "*** Get Capabilities completed ") + } else { + result = RemoteOperationResult(statuscode, message, null) + Log_OC.e(TAG, "Failed response while getting capabilities from the server ") + Log_OC.e(TAG, "*** status: $statusProp; message: $message") + } + + } else { + result = RemoteOperationResult(getMethod) + Log_OC.e(TAG, "Failed response while getting capabilities from the server ") + if (response != null) { + Log_OC.e(TAG, "*** status code: $status; response message: $response") + } else { + Log_OC.e(TAG, "*** status code: $status") + } + } + + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while getting capabilities", e) + } + + return result + } + + private fun isSuccess(status: Int): Boolean { + return status == HttpConstants.HTTP_OK + } + + companion object { + + private val TAG = GetRemoteCapabilitiesOperation::class.java.simpleName + + // OCS Routes + private val OCS_ROUTE = "ocs/v2.php/cloud/capabilities" + + // Arguments - names + private val PARAM_FORMAT = "format" + + // Arguments - constant values + private val VALUE_FORMAT = "json" + + // JSON Node names + private val NODE_OCS = "ocs" + + private val NODE_META = "meta" + + private val NODE_DATA = "data" + private val NODE_VERSION = "version" + + private val NODE_CAPABILITIES = "capabilities" + private val NODE_CORE = "core" + + private val NODE_FILES_SHARING = "files_sharing" + private val NODE_PUBLIC = "public" + private val NODE_PASSWORD = "password" + private val NODE_ENFORCED_FOR = "enforced_for" + private val NODE_EXPIRE_DATE = "expire_date" + private val NODE_USER = "user" + private val NODE_FEDERATION = "federation" + private val NODE_FILES = "files" + + private val PROPERTY_STATUS = "status" + private val PROPERTY_STATUSCODE = "statuscode" + private val PROPERTY_MESSAGE = "message" + + private val PROPERTY_POLLINTERVAL = "pollinterval" + + private val PROPERTY_MAJOR = "major" + private val PROPERTY_MINOR = "minor" + private val PROPERTY_MICRO = "micro" + private val PROPERTY_STRING = "string" + private val PROPERTY_EDITION = "edition" + + private val PROPERTY_API_ENABLED = "api_enabled" + private val PROPERTY_ENABLED = "enabled" + private val PROPERTY_ENFORCED = "enforced" + private val PROPERTY_ENFORCED_READ_ONLY = "read_only" + private val PROPERTY_ENFORCED_READ_WRITE = "read_write" + private val PROPERTY_ENFORCED_UPLOAD_ONLY = "upload_only" + private val PROPERTY_DAYS = "days" + private val PROPERTY_SEND_MAIL = "send_mail" + private val PROPERTY_UPLOAD = "upload" + private val PROPERTY_UPLOAD_ONLY = "supports_upload_only" + private val PROPERTY_MULTIPLE = "multiple" + private val PROPERTY_RESHARING = "resharing" + private val PROPERTY_OUTGOING = "outgoing" + private val PROPERTY_INCOMING = "incoming" + + private val PROPERTY_BIGFILECHUNKING = "bigfilechunking" + private val PROPERTY_UNDELETE = "undelete" + private val PROPERTY_VERSIONING = "versioning" + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java deleted file mode 100644 index 99479b54..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java +++ /dev/null @@ -1,339 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * @author masensio - * @author David González Verdugo - * Copyright (C) 2019 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 - * 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.lib.resources.status; - -/** - * Contains data of the Capabilities for an account, from the Capabilities API - */ -public class OCCapability { - - private static final String TAG = OCCapability.class.getSimpleName(); - - private long mId; - private String mAccountName; - - // Server version - private int mVersionMayor; - private int mVersionMinor; - private int mVersionMicro; - private String mVersionString; - private String mVersionEdition; - - // Core PollInterval - private int mCorePollinterval; - - // Files Sharing - private CapabilityBooleanType mFilesSharingApiEnabled; - - private CapabilityBooleanType mFilesSharingPublicEnabled; - private CapabilityBooleanType mFilesSharingPublicPasswordEnforced; - private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedReadOnly; - private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedReadWrite; - private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedUploadOnly; - private CapabilityBooleanType mFilesSharingPublicExpireDateEnabled; - private int mFilesSharingPublicExpireDateDays; - private CapabilityBooleanType mFilesSharingPublicExpireDateEnforced; - private CapabilityBooleanType mFilesSharingPublicSendMail; - private CapabilityBooleanType mFilesSharingPublicUpload; - private CapabilityBooleanType mFilesSharingPublicMultiple; - private CapabilityBooleanType mFilesSharingPublicSupportsUploadOnly; - - private CapabilityBooleanType mFilesSharingUserSendMail; - - private CapabilityBooleanType mFilesSharingResharing; - - private CapabilityBooleanType mFilesSharingFederationOutgoing; - private CapabilityBooleanType mFilesSharingFederationIncoming; - - // Files - private CapabilityBooleanType mFilesBigFileChuncking; - private CapabilityBooleanType mFilesUndelete; - private CapabilityBooleanType mFilesVersioning; - - public OCCapability() { - mId = 0; - mAccountName = ""; - - mVersionMayor = 0; - mVersionMinor = 0; - mVersionMicro = 0; - mVersionString = ""; - mVersionString = ""; - - mCorePollinterval = 0; - - mFilesSharingApiEnabled = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicEnabled = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicPasswordEnforced = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicPasswordEnforcedReadOnly = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicPasswordEnforcedReadWrite = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicPasswordEnforcedUploadOnly = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicExpireDateEnabled = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicExpireDateDays = 0; - mFilesSharingPublicExpireDateEnforced = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicSendMail = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicUpload = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicMultiple = CapabilityBooleanType.UNKNOWN; - mFilesSharingPublicSupportsUploadOnly = CapabilityBooleanType.UNKNOWN; - mFilesSharingUserSendMail = CapabilityBooleanType.UNKNOWN; - mFilesSharingResharing = CapabilityBooleanType.UNKNOWN; - mFilesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN; - mFilesSharingFederationIncoming = CapabilityBooleanType.UNKNOWN; - - mFilesBigFileChuncking = CapabilityBooleanType.UNKNOWN; - mFilesUndelete = CapabilityBooleanType.UNKNOWN; - mFilesVersioning = CapabilityBooleanType.UNKNOWN; - } - - // Getters and Setters - public String getAccountName() { - return mAccountName; - } - - public void setAccountName(String accountName) { - this.mAccountName = accountName; - } - - public long getId() { - return mId; - } - - public void setId(long id) { - this.mId = id; - } - - public int getVersionMayor() { - return mVersionMayor; - } - - public void setVersionMayor(int versionMayor) { - this.mVersionMayor = versionMayor; - } - - public int getVersionMinor() { - return mVersionMinor; - } - - public void setVersionMinor(int versionMinor) { - this.mVersionMinor = versionMinor; - } - - public int getVersionMicro() { - return mVersionMicro; - } - - public void setVersionMicro(int versionMicro) { - this.mVersionMicro = versionMicro; - } - - public String getVersionString() { - return mVersionString; - } - - public void setVersionString(String versionString) { - this.mVersionString = versionString; - } - - public String getVersionEdition() { - return mVersionEdition; - } - - public void setVersionEdition(String versionEdition) { - this.mVersionEdition = versionEdition; - } - - public int getCorePollinterval() { - return mCorePollinterval; - } - - public void setCorePollinterval(int corePollinterval) { - this.mCorePollinterval = corePollinterval; - } - - public CapabilityBooleanType getFilesSharingApiEnabled() { - return mFilesSharingApiEnabled; - } - - public void setFilesSharingApiEnabled(CapabilityBooleanType filesSharingApiEnabled) { - this.mFilesSharingApiEnabled = filesSharingApiEnabled; - } - - public CapabilityBooleanType getFilesSharingPublicEnabled() { - return mFilesSharingPublicEnabled; - } - - public void setFilesSharingPublicEnabled(CapabilityBooleanType filesSharingPublicEnabled) { - this.mFilesSharingPublicEnabled = filesSharingPublicEnabled; - } - - public CapabilityBooleanType getFilesSharingPublicPasswordEnforced() { - return mFilesSharingPublicPasswordEnforced; - } - - public void setFilesSharingPublicPasswordEnforced(CapabilityBooleanType filesSharingPublicPasswordEnforced) { - this.mFilesSharingPublicPasswordEnforced = filesSharingPublicPasswordEnforced; - } - - public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedReadOnly() { - return mFilesSharingPublicPasswordEnforcedReadOnly; - } - - public void setFilesSharingPublicPasswordEnforcedReadOnly( - CapabilityBooleanType filesSharingPublicPasswordEnforcedReadOnly) { - this.mFilesSharingPublicPasswordEnforcedReadOnly = filesSharingPublicPasswordEnforcedReadOnly; - } - - public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedReadWrite() { - return mFilesSharingPublicPasswordEnforcedReadWrite; - } - - public void setFilesSharingPublicPasswordEnforcedReadWrite( - CapabilityBooleanType filesSharingPublicPasswordEnforcedReadWrite) { - this.mFilesSharingPublicPasswordEnforcedReadWrite = filesSharingPublicPasswordEnforcedReadWrite; - } - - public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedUploadOnly() { - return mFilesSharingPublicPasswordEnforcedUploadOnly; - } - - public void setFilesSharingPublicPasswordEnforcedUploadOnly( - CapabilityBooleanType filesSharingPublicPasswordEnforcedUploadOnly) { - this.mFilesSharingPublicPasswordEnforcedUploadOnly = filesSharingPublicPasswordEnforcedUploadOnly; - } - - public CapabilityBooleanType getFilesSharingPublicExpireDateEnabled() { - return mFilesSharingPublicExpireDateEnabled; - } - - public void setFilesSharingPublicExpireDateEnabled(CapabilityBooleanType filesSharingPublicExpireDateEnabled) { - this.mFilesSharingPublicExpireDateEnabled = filesSharingPublicExpireDateEnabled; - } - - public int getFilesSharingPublicExpireDateDays() { - return mFilesSharingPublicExpireDateDays; - } - - public void setFilesSharingPublicExpireDateDays(int filesSharingPublicExpireDateDays) { - this.mFilesSharingPublicExpireDateDays = filesSharingPublicExpireDateDays; - } - - public CapabilityBooleanType getFilesSharingPublicExpireDateEnforced() { - return mFilesSharingPublicExpireDateEnforced; - } - - public void setFilesSharingPublicExpireDateEnforced(CapabilityBooleanType filesSharingPublicExpireDateEnforced) { - this.mFilesSharingPublicExpireDateEnforced = filesSharingPublicExpireDateEnforced; - } - - public CapabilityBooleanType getFilesSharingPublicSendMail() { - return mFilesSharingPublicSendMail; - } - - public void setFilesSharingPublicSendMail(CapabilityBooleanType filesSharingPublicSendMail) { - this.mFilesSharingPublicSendMail = filesSharingPublicSendMail; - } - - public CapabilityBooleanType getFilesSharingPublicUpload() { - return mFilesSharingPublicUpload; - } - - public void setFilesSharingPublicUpload(CapabilityBooleanType filesSharingPublicUpload) { - this.mFilesSharingPublicUpload = filesSharingPublicUpload; - } - - public CapabilityBooleanType getFilesSharingPublicMultiple() { - return mFilesSharingPublicMultiple; - } - - public void setFilesSharingPublicMultiple(CapabilityBooleanType filesSharingPublicMultiple) { - this.mFilesSharingPublicMultiple = filesSharingPublicMultiple; - } - - public CapabilityBooleanType getFilesSharingPublicSupportsUploadOnly() { - return mFilesSharingPublicSupportsUploadOnly; - } - - public void setFilesSharingPublicSupportsUploadOnly(CapabilityBooleanType - filesSharingPublicMultiple) { - this.mFilesSharingPublicSupportsUploadOnly = filesSharingPublicMultiple; - } - - public CapabilityBooleanType getFilesSharingUserSendMail() { - return mFilesSharingUserSendMail; - } - - public void setFilesSharingUserSendMail(CapabilityBooleanType filesSharingUserSendMail) { - this.mFilesSharingUserSendMail = filesSharingUserSendMail; - } - - public CapabilityBooleanType getFilesSharingResharing() { - return mFilesSharingResharing; - } - - public void setFilesSharingResharing(CapabilityBooleanType filesSharingResharing) { - this.mFilesSharingResharing = filesSharingResharing; - } - - public CapabilityBooleanType getFilesSharingFederationOutgoing() { - return mFilesSharingFederationOutgoing; - } - - public void setFilesSharingFederationOutgoing(CapabilityBooleanType filesSharingFederationOutgoing) { - this.mFilesSharingFederationOutgoing = filesSharingFederationOutgoing; - } - - public CapabilityBooleanType getFilesSharingFederationIncoming() { - return mFilesSharingFederationIncoming; - } - - public void setFilesSharingFederationIncoming(CapabilityBooleanType filesSharingFederationIncoming) { - this.mFilesSharingFederationIncoming = filesSharingFederationIncoming; - } - - public CapabilityBooleanType getFilesBigFileChuncking() { - return mFilesBigFileChuncking; - } - - public void setFilesBigFileChuncking(CapabilityBooleanType filesBigFileChuncking) { - this.mFilesBigFileChuncking = filesBigFileChuncking; - } - - public CapabilityBooleanType getFilesUndelete() { - return mFilesUndelete; - } - - public void setFilesUndelete(CapabilityBooleanType filesUndelete) { - this.mFilesUndelete = filesUndelete; - } - - public CapabilityBooleanType getFilesVersioning() { - return mFilesVersioning; - } - - public void setFilesVersioning(CapabilityBooleanType filesVersioning) { - this.mFilesVersioning = filesVersioning; - } -} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt new file mode 100644 index 00000000..40307a9a --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt @@ -0,0 +1,105 @@ +/* ownCloud Android Library is available under MIT license + * @author masensio + * @author David González Verdugo + * Copyright (C) 2019 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 + * 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.lib.resources.status + +/** + * Contains data of the Capabilities for an account, from the Capabilities API + */ +class RemoteCapability { + var accountName: String? = null + + // Server version + var versionMayor: Int = 0 + var versionMinor: Int = 0 + var versionMicro: Int = 0 + var versionString: String? = null + var versionEdition: String? = null + + // Core PollInterval + var corePollinterval: Int = 0 + + // Files Sharing + var filesSharingApiEnabled: CapabilityBooleanType? = null + + var filesSharingPublicEnabled: CapabilityBooleanType? = null + var filesSharingPublicPasswordEnforced: CapabilityBooleanType? = null + var filesSharingPublicPasswordEnforcedReadOnly: CapabilityBooleanType? = null + var filesSharingPublicPasswordEnforcedReadWrite: CapabilityBooleanType? = null + var filesSharingPublicPasswordEnforcedUploadOnly: CapabilityBooleanType? = null + var filesSharingPublicExpireDateEnabled: CapabilityBooleanType? = null + var filesSharingPublicExpireDateDays: Int = 0 + var filesSharingPublicExpireDateEnforced: CapabilityBooleanType? = null + var filesSharingPublicSendMail: CapabilityBooleanType? = null + var filesSharingPublicUpload: CapabilityBooleanType? = null + var filesSharingPublicMultiple: CapabilityBooleanType? = null + var filesSharingPublicSupportsUploadOnly: CapabilityBooleanType? = null + + var filesSharingUserSendMail: CapabilityBooleanType? = null + + var filesSharingResharing: CapabilityBooleanType? = null + + var filesSharingFederationOutgoing: CapabilityBooleanType? = null + var filesSharingFederationIncoming: CapabilityBooleanType? = null + + // Files + var filesBigFileChuncking: CapabilityBooleanType? = null + var filesUndelete: CapabilityBooleanType? = null + var filesVersioning: CapabilityBooleanType? = null + + init { + accountName = "" + + versionMayor = 0 + versionMinor = 0 + versionMicro = 0 + versionString = "" + versionString = "" + + corePollinterval = 0 + + filesSharingApiEnabled = CapabilityBooleanType.UNKNOWN + filesSharingPublicEnabled = CapabilityBooleanType.UNKNOWN + filesSharingPublicPasswordEnforced = CapabilityBooleanType.UNKNOWN + filesSharingPublicPasswordEnforcedReadOnly = CapabilityBooleanType.UNKNOWN + filesSharingPublicPasswordEnforcedReadWrite = CapabilityBooleanType.UNKNOWN + filesSharingPublicPasswordEnforcedUploadOnly = CapabilityBooleanType.UNKNOWN + filesSharingPublicExpireDateEnabled = CapabilityBooleanType.UNKNOWN + filesSharingPublicExpireDateDays = 0 + filesSharingPublicExpireDateEnforced = CapabilityBooleanType.UNKNOWN + filesSharingPublicSendMail = CapabilityBooleanType.UNKNOWN + filesSharingPublicUpload = CapabilityBooleanType.UNKNOWN + filesSharingPublicMultiple = CapabilityBooleanType.UNKNOWN + filesSharingPublicSupportsUploadOnly = CapabilityBooleanType.UNKNOWN + filesSharingUserSendMail = CapabilityBooleanType.UNKNOWN + filesSharingResharing = CapabilityBooleanType.UNKNOWN + filesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN + filesSharingFederationIncoming = CapabilityBooleanType.UNKNOWN + + filesBigFileChuncking = CapabilityBooleanType.UNKNOWN + filesUndelete = CapabilityBooleanType.UNKNOWN + filesVersioning = CapabilityBooleanType.UNKNOWN + } +} From 4f57487f700efe3a5524c0e6f6b5ddbfdc4c510e Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 16 Apr 2019 17:25:13 +0200 Subject: [PATCH 18/37] Apply changes requested in PR --- .../android/lib/resources/shares/ShareType.kt | 23 +- .../resources/status/CapabilityBooleanType.kt | 10 +- .../status/GetRemoteCapabilitiesOperation.kt | 343 +++++++++--------- .../lib/resources/status/RemoteCapability.kt | 60 ++- 4 files changed, 218 insertions(+), 218 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt index 826111df..234b4276 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.kt @@ -32,11 +32,12 @@ package com.owncloud.android.lib.resources.shares * 3 - Shared by public link * 4 - Shared by e-mail * 5 - Shared by contact + * 6 - Federated * * @author masensio */ -enum class ShareType private constructor(val value: Int) { +enum class ShareType constructor(val value: Int) { NO_SHARED(-1), USER(0), GROUP(1), @@ -48,16 +49,16 @@ enum class ShareType private constructor(val value: Int) { companion object { fun fromValue(value: Int): ShareType? { - when (value) { - -1 -> return NO_SHARED - 0 -> return USER - 1 -> return GROUP - 3 -> return PUBLIC_LINK - 4 -> return EMAIL - 5 -> return CONTACT - 6 -> return FEDERATED + return when (value) { + -1 -> NO_SHARED + 0 -> USER + 1 -> GROUP + 3 -> PUBLIC_LINK + 4 -> EMAIL + 5 -> CONTACT + 6 -> FEDERATED + else -> null } - return null } } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt index bc467e59..7d3d51e7 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/CapabilityBooleanType.kt @@ -46,12 +46,12 @@ enum class CapabilityBooleanType private constructor(val value: Int) { companion object { fun fromValue(value: Int): CapabilityBooleanType? { - when (value) { - -1 -> return UNKNOWN - 0 -> return FALSE - 1 -> return TRUE + return when (value) { + -1 -> UNKNOWN + 0 -> FALSE + 1 -> TRUE + else -> null } - return null } fun fromBooleanValue(boolValue: Boolean): CapabilityBooleanType { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt index 314e3bce..0a0690a7 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt @@ -65,176 +65,8 @@ class GetRemoteCapabilitiesOperation : RemoteOperation() { val status = client.executeHttpMethod(getMethod) val response = getMethod.responseBodyAsString - if (isSuccess(status)) { - Log_OC.d(TAG, "Successful response: " + response!!) - // Parse the response - val respJSON = JSONObject(response) - val respOCS = respJSON.getJSONObject(NODE_OCS) - val respMeta = respOCS.getJSONObject(NODE_META) - val respData = respOCS.getJSONObject(NODE_DATA) - - // Read meta - val statusProp = respMeta.getString(PROPERTY_STATUS).equals("ok", ignoreCase = true) - val statuscode = respMeta.getInt(PROPERTY_STATUSCODE) - val message = respMeta.getString(PROPERTY_MESSAGE) - - if (statusProp) { - val capability = RemoteCapability() - // Add Version - if (respData.has(NODE_VERSION)) { - val respVersion = respData.getJSONObject(NODE_VERSION) - capability.versionMayor = respVersion.getInt(PROPERTY_MAJOR) - capability.versionMinor = respVersion.getInt(PROPERTY_MINOR) - capability.versionMicro = respVersion.getInt(PROPERTY_MICRO) - capability.versionString = respVersion.getString(PROPERTY_STRING) - capability.versionEdition = respVersion.getString(PROPERTY_EDITION) - Log_OC.d(TAG, "*** Added $NODE_VERSION") - } - - // Capabilities Object - if (respData.has(NODE_CAPABILITIES)) { - val respCapabilities = respData.getJSONObject(NODE_CAPABILITIES) - - // Add Core: pollinterval - if (respCapabilities.has(NODE_CORE)) { - val respCore = respCapabilities.getJSONObject(NODE_CORE) - capability.corePollinterval = respCore.getInt(PROPERTY_POLLINTERVAL) - Log_OC.d(TAG, "*** Added $NODE_CORE") - } - - // Add files_sharing: public, user, resharing - if (respCapabilities.has(NODE_FILES_SHARING)) { - val respFilesSharing = respCapabilities.getJSONObject(NODE_FILES_SHARING) - if (respFilesSharing.has(PROPERTY_API_ENABLED)) { - capability.filesSharingApiEnabled = CapabilityBooleanType.fromBooleanValue( - respFilesSharing.getBoolean(PROPERTY_API_ENABLED) - ) - } - - if (respFilesSharing.has(NODE_PUBLIC)) { - val respPublic = respFilesSharing.getJSONObject(NODE_PUBLIC) - capability.filesSharingPublicEnabled = CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_ENABLED) - ) - - if (respPublic.has(NODE_PASSWORD)) { - val respPassword = respPublic.getJSONObject(NODE_PASSWORD) - capability.filesSharingPublicPasswordEnforced = - CapabilityBooleanType.fromBooleanValue( - respPublic.getJSONObject(NODE_PASSWORD).getBoolean(PROPERTY_ENFORCED) - ) - - if (respPassword.has(NODE_ENFORCED_FOR)) { - capability.filesSharingPublicPasswordEnforcedReadOnly = - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( - PROPERTY_ENFORCED_READ_ONLY - ) - ) - - capability.filesSharingPublicPasswordEnforcedReadWrite = - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( - PROPERTY_ENFORCED_READ_WRITE - ) - ) - - capability.filesSharingPublicPasswordEnforcedUploadOnly = - CapabilityBooleanType.fromBooleanValue( - respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( - PROPERTY_ENFORCED_UPLOAD_ONLY - ) - ) - } - } - if (respPublic.has(NODE_EXPIRE_DATE)) { - val respExpireDate = respPublic.getJSONObject(NODE_EXPIRE_DATE) - capability.filesSharingPublicExpireDateEnabled = - CapabilityBooleanType.fromBooleanValue( - respExpireDate.getBoolean(PROPERTY_ENABLED) - ) - if (respExpireDate.has(PROPERTY_DAYS)) { - capability.filesSharingPublicExpireDateDays = - respExpireDate.getInt(PROPERTY_DAYS) - } - if (respExpireDate.has(PROPERTY_ENFORCED)) { - capability.filesSharingPublicExpireDateEnforced = - CapabilityBooleanType.fromBooleanValue( - respExpireDate.getBoolean(PROPERTY_ENFORCED) - ) - } - } - if (respPublic.has(PROPERTY_UPLOAD)) { - capability.filesSharingPublicUpload = CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_UPLOAD) - ) - } - if (respPublic.has(PROPERTY_UPLOAD_ONLY)) { - capability.filesSharingPublicSupportsUploadOnly = - CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_UPLOAD_ONLY) - ) - } - if (respPublic.has(PROPERTY_MULTIPLE)) { - capability.filesSharingPublicMultiple = CapabilityBooleanType.fromBooleanValue( - respPublic.getBoolean(PROPERTY_MULTIPLE) - ) - } - } - - if (respFilesSharing.has(NODE_USER)) { - val respUser = respFilesSharing.getJSONObject(NODE_USER) - capability.filesSharingUserSendMail = CapabilityBooleanType.fromBooleanValue( - respUser.getBoolean(PROPERTY_SEND_MAIL) - ) - } - - capability.filesSharingResharing = CapabilityBooleanType.fromBooleanValue( - respFilesSharing.getBoolean(PROPERTY_RESHARING) - ) - if (respFilesSharing.has(NODE_FEDERATION)) { - val respFederation = respFilesSharing.getJSONObject(NODE_FEDERATION) - capability.filesSharingFederationOutgoing = - CapabilityBooleanType.fromBooleanValue(respFederation.getBoolean(PROPERTY_OUTGOING)) - capability.filesSharingFederationIncoming = CapabilityBooleanType.fromBooleanValue( - respFederation.getBoolean(PROPERTY_INCOMING) - ) - } - Log_OC.d(TAG, "*** Added $NODE_FILES_SHARING") - } - - if (respCapabilities.has(NODE_FILES)) { - val respFiles = respCapabilities.getJSONObject(NODE_FILES) - // Add files - capability.filesBigFileChuncking = CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_BIGFILECHUNKING) - ) - if (respFiles.has(PROPERTY_UNDELETE)) { - capability.filesUndelete = CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_UNDELETE) - ) - } - if (respFiles.has(PROPERTY_VERSIONING)) { - capability.filesVersioning = CapabilityBooleanType.fromBooleanValue( - respFiles.getBoolean(PROPERTY_VERSIONING) - ) - } - Log_OC.d(TAG, "*** Added $NODE_FILES") - } - } - // Result - result = RemoteOperationResult(OK) - result.data = capability - - Log_OC.d(TAG, "*** Get Capabilities completed ") - } else { - result = RemoteOperationResult(statuscode, message, null) - Log_OC.e(TAG, "Failed response while getting capabilities from the server ") - Log_OC.e(TAG, "*** status: $statusProp; message: $message") - } - - } else { + if (!isSuccess(status)) { result = RemoteOperationResult(getMethod) Log_OC.e(TAG, "Failed response while getting capabilities from the server ") if (response != null) { @@ -242,6 +74,176 @@ class GetRemoteCapabilitiesOperation : RemoteOperation() { } else { Log_OC.e(TAG, "*** status code: $status") } + + return result + } + + Log_OC.d(TAG, "Successful response: " + response!!) + + // Parse the response + val respJSON = JSONObject(response) + val respOCS = respJSON.getJSONObject(NODE_OCS) + val respMeta = respOCS.getJSONObject(NODE_META) + val respData = respOCS.getJSONObject(NODE_DATA) + + // Read meta + val statusProp = respMeta.getString(PROPERTY_STATUS).equals(PROPERTY_STATUS_OK, ignoreCase = true) + val statuscode = respMeta.getInt(PROPERTY_STATUSCODE) + val message = respMeta.getString(PROPERTY_MESSAGE) + + if (statusProp) { + val capability = RemoteCapability() + // Add Version + if (respData.has(NODE_VERSION)) { + val respVersion = respData.getJSONObject(NODE_VERSION) + capability.versionMayor = respVersion.getInt(PROPERTY_MAJOR) + capability.versionMinor = respVersion.getInt(PROPERTY_MINOR) + capability.versionMicro = respVersion.getInt(PROPERTY_MICRO) + capability.versionString = respVersion.getString(PROPERTY_STRING) + capability.versionEdition = respVersion.getString(PROPERTY_EDITION) + Log_OC.d(TAG, "*** Added $NODE_VERSION") + } + + // Capabilities Object + if (respData.has(NODE_CAPABILITIES)) { + val respCapabilities = respData.getJSONObject(NODE_CAPABILITIES) + + // Add Core: pollinterval + if (respCapabilities.has(NODE_CORE)) { + val respCore = respCapabilities.getJSONObject(NODE_CORE) + capability.corePollinterval = respCore.getInt(PROPERTY_POLLINTERVAL) + Log_OC.d(TAG, "*** Added $NODE_CORE") + } + + // Add files_sharing: public, user, resharing + if (respCapabilities.has(NODE_FILES_SHARING)) { + val respFilesSharing = respCapabilities.getJSONObject(NODE_FILES_SHARING) + if (respFilesSharing.has(PROPERTY_API_ENABLED)) { + capability.filesSharingApiEnabled = CapabilityBooleanType.fromBooleanValue( + respFilesSharing.getBoolean(PROPERTY_API_ENABLED) + ) + } + + if (respFilesSharing.has(NODE_PUBLIC)) { + val respPublic = respFilesSharing.getJSONObject(NODE_PUBLIC) + capability.filesSharingPublicEnabled = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_ENABLED) + ) + + if (respPublic.has(NODE_PASSWORD)) { + val respPassword = respPublic.getJSONObject(NODE_PASSWORD) + capability.filesSharingPublicPasswordEnforced = + CapabilityBooleanType.fromBooleanValue( + respPublic.getJSONObject(NODE_PASSWORD).getBoolean(PROPERTY_ENFORCED) + ) + + if (respPassword.has(NODE_ENFORCED_FOR)) { + capability.filesSharingPublicPasswordEnforcedReadOnly = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_READ_ONLY + ) + ) + + capability.filesSharingPublicPasswordEnforcedReadWrite = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_READ_WRITE + ) + ) + + capability.filesSharingPublicPasswordEnforcedUploadOnly = + CapabilityBooleanType.fromBooleanValue( + respPassword.getJSONObject(NODE_ENFORCED_FOR).getBoolean( + PROPERTY_ENFORCED_UPLOAD_ONLY + ) + ) + } + } + if (respPublic.has(NODE_EXPIRE_DATE)) { + val respExpireDate = respPublic.getJSONObject(NODE_EXPIRE_DATE) + capability.filesSharingPublicExpireDateEnabled = + CapabilityBooleanType.fromBooleanValue( + respExpireDate.getBoolean(PROPERTY_ENABLED) + ) + if (respExpireDate.has(PROPERTY_DAYS)) { + capability.filesSharingPublicExpireDateDays = + respExpireDate.getInt(PROPERTY_DAYS) + } + if (respExpireDate.has(PROPERTY_ENFORCED)) { + capability.filesSharingPublicExpireDateEnforced = + CapabilityBooleanType.fromBooleanValue( + respExpireDate.getBoolean(PROPERTY_ENFORCED) + ) + } + } + if (respPublic.has(PROPERTY_UPLOAD)) { + capability.filesSharingPublicUpload = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_UPLOAD) + ) + } + if (respPublic.has(PROPERTY_UPLOAD_ONLY)) { + capability.filesSharingPublicSupportsUploadOnly = + CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_UPLOAD_ONLY) + ) + } + if (respPublic.has(PROPERTY_MULTIPLE)) { + capability.filesSharingPublicMultiple = CapabilityBooleanType.fromBooleanValue( + respPublic.getBoolean(PROPERTY_MULTIPLE) + ) + } + } + + if (respFilesSharing.has(NODE_USER)) { + val respUser = respFilesSharing.getJSONObject(NODE_USER) + capability.filesSharingUserSendMail = CapabilityBooleanType.fromBooleanValue( + respUser.getBoolean(PROPERTY_SEND_MAIL) + ) + } + + capability.filesSharingResharing = CapabilityBooleanType.fromBooleanValue( + respFilesSharing.getBoolean(PROPERTY_RESHARING) + ) + if (respFilesSharing.has(NODE_FEDERATION)) { + val respFederation = respFilesSharing.getJSONObject(NODE_FEDERATION) + capability.filesSharingFederationOutgoing = + CapabilityBooleanType.fromBooleanValue(respFederation.getBoolean(PROPERTY_OUTGOING)) + capability.filesSharingFederationIncoming = CapabilityBooleanType.fromBooleanValue( + respFederation.getBoolean(PROPERTY_INCOMING) + ) + } + Log_OC.d(TAG, "*** Added $NODE_FILES_SHARING") + } + + if (respCapabilities.has(NODE_FILES)) { + val respFiles = respCapabilities.getJSONObject(NODE_FILES) + // Add files + capability.filesBigFileChuncking = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_BIGFILECHUNKING) + ) + if (respFiles.has(PROPERTY_UNDELETE)) { + capability.filesUndelete = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_UNDELETE) + ) + } + if (respFiles.has(PROPERTY_VERSIONING)) { + capability.filesVersioning = CapabilityBooleanType.fromBooleanValue( + respFiles.getBoolean(PROPERTY_VERSIONING) + ) + } + Log_OC.d(TAG, "*** Added $NODE_FILES") + } + } + // Result + result = RemoteOperationResult(OK) + result.data = capability + + Log_OC.d(TAG, "*** Get Capabilities completed ") + } else { + result = RemoteOperationResult(statuscode, message, null) + Log_OC.e(TAG, "Failed response while getting capabilities from the server ") + Log_OC.e(TAG, "*** status: $statusProp; message: $message") } } catch (e: Exception) { @@ -290,6 +292,7 @@ class GetRemoteCapabilitiesOperation : RemoteOperation() { private val NODE_FILES = "files" private val PROPERTY_STATUS = "status" + private val PROPERTY_STATUS_OK = "ok" private val PROPERTY_STATUSCODE = "statuscode" private val PROPERTY_MESSAGE = "message" @@ -320,4 +323,4 @@ class GetRemoteCapabilitiesOperation : RemoteOperation() { private val PROPERTY_UNDELETE = "undelete" private val PROPERTY_VERSIONING = "versioning" } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt index 40307a9a..d697d7aa 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt @@ -29,45 +29,41 @@ package com.owncloud.android.lib.resources.status * Contains data of the Capabilities for an account, from the Capabilities API */ class RemoteCapability { - var accountName: String? = null + var accountName: String // Server version - var versionMayor: Int = 0 - var versionMinor: Int = 0 - var versionMicro: Int = 0 - var versionString: String? = null - var versionEdition: String? = null + var versionMayor: Int + var versionMinor: Int + var versionMicro: Int + var versionString: String + var versionEdition: String // Core PollInterval - var corePollinterval: Int = 0 + var corePollinterval: Int // Files Sharing - var filesSharingApiEnabled: CapabilityBooleanType? = null - - var filesSharingPublicEnabled: CapabilityBooleanType? = null - var filesSharingPublicPasswordEnforced: CapabilityBooleanType? = null - var filesSharingPublicPasswordEnforcedReadOnly: CapabilityBooleanType? = null - var filesSharingPublicPasswordEnforcedReadWrite: CapabilityBooleanType? = null - var filesSharingPublicPasswordEnforcedUploadOnly: CapabilityBooleanType? = null - var filesSharingPublicExpireDateEnabled: CapabilityBooleanType? = null - var filesSharingPublicExpireDateDays: Int = 0 - var filesSharingPublicExpireDateEnforced: CapabilityBooleanType? = null - var filesSharingPublicSendMail: CapabilityBooleanType? = null - var filesSharingPublicUpload: CapabilityBooleanType? = null - var filesSharingPublicMultiple: CapabilityBooleanType? = null - var filesSharingPublicSupportsUploadOnly: CapabilityBooleanType? = null - - var filesSharingUserSendMail: CapabilityBooleanType? = null - - var filesSharingResharing: CapabilityBooleanType? = null - - var filesSharingFederationOutgoing: CapabilityBooleanType? = null - var filesSharingFederationIncoming: CapabilityBooleanType? = null + var filesSharingApiEnabled: CapabilityBooleanType + var filesSharingPublicEnabled: CapabilityBooleanType + var filesSharingPublicPasswordEnforced: CapabilityBooleanType + var filesSharingPublicPasswordEnforcedReadOnly: CapabilityBooleanType + var filesSharingPublicPasswordEnforcedReadWrite: CapabilityBooleanType + var filesSharingPublicPasswordEnforcedUploadOnly: CapabilityBooleanType + var filesSharingPublicExpireDateEnabled: CapabilityBooleanType + var filesSharingPublicExpireDateDays: Int + var filesSharingPublicExpireDateEnforced: CapabilityBooleanType + var filesSharingPublicSendMail: CapabilityBooleanType + var filesSharingPublicUpload: CapabilityBooleanType + var filesSharingPublicMultiple: CapabilityBooleanType + var filesSharingPublicSupportsUploadOnly: CapabilityBooleanType + var filesSharingUserSendMail: CapabilityBooleanType + var filesSharingResharing: CapabilityBooleanType + var filesSharingFederationOutgoing: CapabilityBooleanType + var filesSharingFederationIncoming: CapabilityBooleanType // Files - var filesBigFileChuncking: CapabilityBooleanType? = null - var filesUndelete: CapabilityBooleanType? = null - var filesVersioning: CapabilityBooleanType? = null + var filesBigFileChuncking: CapabilityBooleanType + var filesUndelete: CapabilityBooleanType + var filesVersioning: CapabilityBooleanType init { accountName = "" @@ -76,7 +72,7 @@ class RemoteCapability { versionMinor = 0 versionMicro = 0 versionString = "" - versionString = "" + versionEdition = "" corePollinterval = 0 From 8fa7439492d4011c844363a9a82edc3b099448b1 Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 26 Apr 2019 10:02:43 +0200 Subject: [PATCH 19/37] Fix typo on chunking --- .../lib/resources/status/GetRemoteCapabilitiesOperation.kt | 2 +- .../owncloud/android/lib/resources/status/RemoteCapability.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt index 0a0690a7..8bce27ef 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/GetRemoteCapabilitiesOperation.kt @@ -219,7 +219,7 @@ class GetRemoteCapabilitiesOperation : RemoteOperation() { if (respCapabilities.has(NODE_FILES)) { val respFiles = respCapabilities.getJSONObject(NODE_FILES) // Add files - capability.filesBigFileChuncking = CapabilityBooleanType.fromBooleanValue( + capability.filesBigFileChunking = CapabilityBooleanType.fromBooleanValue( respFiles.getBoolean(PROPERTY_BIGFILECHUNKING) ) if (respFiles.has(PROPERTY_UNDELETE)) { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt index d697d7aa..a38a9343 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/RemoteCapability.kt @@ -61,7 +61,7 @@ class RemoteCapability { var filesSharingFederationIncoming: CapabilityBooleanType // Files - var filesBigFileChuncking: CapabilityBooleanType + var filesBigFileChunking: CapabilityBooleanType var filesUndelete: CapabilityBooleanType var filesVersioning: CapabilityBooleanType @@ -94,7 +94,7 @@ class RemoteCapability { filesSharingFederationOutgoing = CapabilityBooleanType.UNKNOWN filesSharingFederationIncoming = CapabilityBooleanType.UNKNOWN - filesBigFileChuncking = CapabilityBooleanType.UNKNOWN + filesBigFileChunking = CapabilityBooleanType.UNKNOWN filesUndelete = CapabilityBooleanType.UNKNOWN filesVersioning = CapabilityBooleanType.UNKNOWN } From 688a978b1e628b59e45e28b1681a7744e64d08c4 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 16 Apr 2019 16:42:50 +0200 Subject: [PATCH 20/37] Rename remoteId parameter to id within RemoteShare --- .../shares/CreateRemoteShareOperation.kt | 2 +- .../lib/resources/shares/RemoteShare.kt | 8 ++-- .../lib/resources/shares/ShareXMLParser.kt | 42 +++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index f9e0fa27..3f7fd18e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -146,7 +146,7 @@ class CreateRemoteShareOperation // retrieve more info - POST only returns the index of the new share val emptyShare = result.data.shares[0] val getInfo = GetRemoteShareOperation( - emptyShare.remoteId + emptyShare.id ) result = getInfo.execute(client) } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index ade6f2ec..a4347b63 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -38,6 +38,7 @@ import java.io.Serializable * @author David González Verdugo */ class RemoteShare : Parcelable, Serializable { + var id: Long = 0 var shareWith: String = "" var path: String = "" var token: String = "" @@ -53,7 +54,6 @@ class RemoteShare : Parcelable, Serializable { var expirationDate: Long = INIT_EXPIRATION_DATE_IN_MILLIS var isFolder: Boolean = false var userId: Long = 0 - var remoteId: Long = 0 val isPasswordProtected: Boolean get() = ShareType.PUBLIC_LINK == shareType && shareWith.isNotEmpty() @@ -75,6 +75,7 @@ class RemoteShare : Parcelable, Serializable { * Used internally. Reset all file properties */ private fun resetData() { + id = -1 shareWith = "" path = "" token = "" @@ -91,7 +92,6 @@ class RemoteShare : Parcelable, Serializable { sharedWithAdditionalInfo = "" isFolder = false userId = -1 - remoteId = -1 } /** @@ -104,6 +104,7 @@ class RemoteShare : Parcelable, Serializable { } fun readFromParcel(source: Parcel) { + id = source.readLong() shareWith = source.readString() path = source.readString() token = source.readString() @@ -123,12 +124,12 @@ class RemoteShare : Parcelable, Serializable { expirationDate = source.readLong() isFolder = source.readInt() == 0 userId = source.readLong() - remoteId = source.readLong() } override fun describeContents(): Int = this.hashCode() override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeLong(id) dest.writeString(shareWith) dest.writeString(path) dest.writeString(token) @@ -144,7 +145,6 @@ class RemoteShare : Parcelable, Serializable { dest.writeLong(expirationDate) dest.writeInt(if (isFolder) 1 else 0) dest.writeLong(userId) - dest.writeLong(remoteId) } companion object { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index b9f7cc76..e405d969 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -179,7 +179,7 @@ class ShareXMLParser { } else if (name.equals(NODE_ID, ignoreCase = true)) {// Parse Create XML Response share = RemoteShare() val value = readNode(parser, NODE_ID) - share.remoteId = Integer.parseInt(value).toLong() + share.id = Integer.parseInt(value).toLong() } else if (name.equals(NODE_URL, ignoreCase = true)) { // NOTE: this field is received in all the public shares from OC 9.0.0 @@ -218,7 +218,7 @@ class ShareXMLParser { private fun readElement(parser: XmlPullParser, shares: ArrayList) { parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT) - val share = RemoteShare() + val remoteShare = RemoteShare() //Log_OC.d(TAG, "---- NODE ELEMENT ---"); while (parser.next() != XmlPullParser.END_TAG) { @@ -235,46 +235,46 @@ class ShareXMLParser { readElement(parser, shares) } else if (name.equals(NODE_ID, ignoreCase = true)) { - share.remoteId = Integer.parseInt(readNode(parser, NODE_ID)).toLong() + remoteShare.id = Integer.parseInt(readNode(parser, NODE_ID)).toLong() } else if (name.equals(NODE_ITEM_TYPE, ignoreCase = true)) { - share.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) - fixPathForFolder(share) + remoteShare.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) + fixPathForFolder(remoteShare) } else if (name.equals(NODE_ITEM_SOURCE, ignoreCase = true)) { - share.itemSource = java.lang.Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)) + remoteShare.itemSource = java.lang.Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)) } else if (name.equals(NODE_PARENT, ignoreCase = true)) { readNode(parser, NODE_PARENT) } else if (name.equals(NODE_SHARE_TYPE, ignoreCase = true)) { val value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)) - share.shareType = ShareType.fromValue(value) + remoteShare.shareType = ShareType.fromValue(value) } else if (name.equals(NODE_SHARE_WITH, ignoreCase = true)) { - share.shareWith = readNode(parser, NODE_SHARE_WITH) + remoteShare.shareWith = readNode(parser, NODE_SHARE_WITH) } else if (name.equals(NODE_FILE_SOURCE, ignoreCase = true)) { - share.fileSource = java.lang.Long.parseLong(readNode(parser, NODE_FILE_SOURCE)) + remoteShare.fileSource = java.lang.Long.parseLong(readNode(parser, NODE_FILE_SOURCE)) } else if (name.equals(NODE_PATH, ignoreCase = true)) { - share.path = readNode(parser, NODE_PATH) - fixPathForFolder(share) + remoteShare.path = readNode(parser, NODE_PATH) + fixPathForFolder(remoteShare) } else if (name.equals(NODE_PERMISSIONS, ignoreCase = true)) { - share.permissions = Integer.parseInt(readNode(parser, NODE_PERMISSIONS)) + remoteShare.permissions = Integer.parseInt(readNode(parser, NODE_PERMISSIONS)) } else if (name.equals(NODE_STIME, ignoreCase = true)) { - share.sharedDate = java.lang.Long.parseLong(readNode(parser, NODE_STIME)) + remoteShare.sharedDate = java.lang.Long.parseLong(readNode(parser, NODE_STIME)) } else if (name.equals(NODE_EXPIRATION, ignoreCase = true)) { val value = readNode(parser, NODE_EXPIRATION) if (value.length != 0) { - share.expirationDate = WebdavUtils.parseResponseDate(value)!!.time + remoteShare.expirationDate = WebdavUtils.parseResponseDate(value)!!.time } } else if (name.equals(NODE_TOKEN, ignoreCase = true)) { - share.token = readNode(parser, NODE_TOKEN) + remoteShare.token = readNode(parser, NODE_TOKEN) } else if (name.equals(NODE_STORAGE, ignoreCase = true)) { readNode(parser, NODE_STORAGE) @@ -282,27 +282,27 @@ class ShareXMLParser { readNode(parser, NODE_MAIL_SEND) } else if (name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true)) { - share.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) + remoteShare.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) } else if (name.equals(NODE_URL, ignoreCase = true)) { val value = readNode(parser, NODE_URL) - share.shareLink = value + remoteShare.shareLink = value } else if (name.equals(NODE_NAME, ignoreCase = true)) { - share.name = readNode(parser, NODE_NAME) + remoteShare.name = readNode(parser, NODE_NAME) } else { skip(parser) } } - if (isValidShare(share)) { - shares.add(share) + if (isValidShare(remoteShare)) { + shares.add(remoteShare) } } private fun isValidShare(share: RemoteShare): Boolean { - return share.remoteId > -1 + return share.id > -1 } private fun fixPathForFolder(share: RemoteShare) { From 4849be5daa060a17f4efaf8f80b93ff3205f9386 Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 17 Apr 2019 10:24:50 +0200 Subject: [PATCH 21/37] Modify remote operations to create or update shares --- .../shares/CreateRemoteShareOperation.kt | 12 ++++---- .../lib/resources/shares/RemoteShare.kt | 3 +- .../shares/UpdateRemoteShareOperation.kt | 30 ++++++++----------- 3 files changed, 19 insertions(+), 26 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 3f7fd18e..1decdf89 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -65,8 +65,7 @@ import java.util.Locale * To obtain combinations, add the desired values together. * For instance, for Re-Share, delete, read, update, add 16+8+2+1 = 27. */ -class CreateRemoteShareOperation - ( +class CreateRemoteShareOperation( private val remoteFilePath: String, private val shareType: ShareType, private val shareWith: String, @@ -107,10 +106,10 @@ class CreateRemoteShareOperation formBodyBuilder.add(PARAM_EXPIRATION_DATE, formattedExpirationDate) } - if (publicUpload == true) { + if (publicUpload) { formBodyBuilder.add(PARAM_PUBLIC_UPLOAD, publicUpload.toString()) } - if (!password.isNullOrEmpty()) { + if (password.isNotEmpty()) { formBodyBuilder.add(PARAM_PASSWORD, password) } if (RemoteShare.DEFAULT_PERMISSION != permissions) { @@ -126,7 +125,7 @@ class CreateRemoteShareOperation postMethod.setRequestBody(formBodyBuilder.build()) postMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8) - postMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE) val status = client.executeHttpMethod(postMethod) @@ -141,7 +140,6 @@ class CreateRemoteShareOperation result = parser.parse(postMethod.responseBodyAsString) if (result.isSuccess && retrieveShareDetails) { - // TODO Use executeHttpMethod // retrieve more info - POST only returns the index of the new share val emptyShare = result.data.shares[0] @@ -178,4 +176,4 @@ class CreateRemoteShareOperation private const val PARAM_PERMISSIONS = "permissions" private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" } -} \ No newline at end of file +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index a4347b63..13eac361 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -49,7 +49,7 @@ class RemoteShare : Parcelable, Serializable { var fileSource: Long = 0 var itemSource: Long = 0 var shareType: ShareType? = null - var permissions: Int = INIT_PERMISSION + var permissions: Int = DEFAULT_PERMISSION var sharedDate: Long = INIT_SHARED_DATE var expirationDate: Long = INIT_EXPIRATION_DATE_IN_MILLIS var isFolder: Boolean = false @@ -156,7 +156,6 @@ class RemoteShare : Parcelable, Serializable { private val TAG = RemoteShare::class.java.simpleName - const val INIT_PERMISSION = 0 const val DEFAULT_PERMISSION = -1 const val READ_PERMISSION_FLAG = 1 const val UPDATE_PERMISSION_FLAG = 2 diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 24f283c2..f1d30d70 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -31,7 +31,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.PutMethod 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 com.owncloud.android.lib.resources.shares.RemoteShare.Companion.INIT_PERMISSION +import com.owncloud.android.lib.resources.shares.RemoteShare.Companion.DEFAULT_PERMISSION import okhttp3.FormBody import java.net.URL import java.text.SimpleDateFormat @@ -51,11 +51,14 @@ import java.util.Locale class UpdateRemoteShareOperation /** * Constructor. No update is initialized by default, need to be applied with setters below. - * - * @param remoteId Identifier of the share to update. */ - (private val remoteId: Long) : RemoteOperation() { + ( + /** + * @param remoteId Identifier of the share to update. + */ + private val remoteId: Long +) : RemoteOperation() { /** * Password to update in Share resource. * @@ -81,7 +84,7 @@ class UpdateRemoteShareOperation * @param permissions Permissions to set to the target share. * Values <= 0 result in no update applied to the permissions. */ - var permissions: Int = INIT_PERMISSION + var permissions: Int = DEFAULT_PERMISSION /** * Enable upload permissions to update in Share resource. @@ -90,6 +93,7 @@ class UpdateRemoteShareOperation * Null results in no update applied to the upload permission. */ var publicUpload: Boolean? = null + /** * Name to update in Share resource. Ignored by servers previous to version 10.0.0 * @@ -99,13 +103,6 @@ class UpdateRemoteShareOperation */ var name: String? = null - init { - password = null // no update - expirationDateInMillis = INITIAL_EXPIRATION_DATE_IN_MILLIS // no update - publicUpload = null - permissions = RemoteShare.DEFAULT_PERMISSION - } - override fun run(client: OwnCloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -114,7 +111,7 @@ class UpdateRemoteShareOperation // Parameters to update if (name != null) { - formBodyBuilder.add(PARAM_NAME, name!!) + formBodyBuilder.add(PARAM_NAME, name) } if (expirationDateInMillis < INITIAL_EXPIRATION_DATE_IN_MILLIS) { @@ -136,7 +133,7 @@ class UpdateRemoteShareOperation // IMPORTANT: permissions parameter needs to be updated after mPublicUpload parameter, // otherwise they would be set always as 1 (READ) in the server when mPublicUpload was updated - if (permissions > INIT_PERMISSION) { + if (permissions > DEFAULT_PERMISSION) { // set permissions formBodyBuilder.add(PARAM_PERMISSIONS, permissions.toString()) } @@ -179,7 +176,6 @@ class UpdateRemoteShareOperation private fun isSuccess(status: Int): Boolean = status == HttpConstants.HTTP_OK companion object { - private val TAG = GetRemoteShareOperation::class.java.simpleName private const val PARAM_NAME = "name" @@ -191,6 +187,6 @@ class UpdateRemoteShareOperation private const val ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded" private const val ENTITY_CHARSET = "UTF-8" - private const val INITIAL_EXPIRATION_DATE_IN_MILLIS : Long = 0 + private const val INITIAL_EXPIRATION_DATE_IN_MILLIS: Long = 0 } -} \ No newline at end of file +} From 59048e8e7a4f06e0ee174dde094e2d16469471f2 Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 17 Apr 2019 17:58:04 +0200 Subject: [PATCH 22/37] Use new flag to retrieve more information about just updated shares --- .../shares/CreateRemoteShareOperation.kt | 5 -- .../shares/UpdateRemoteShareOperation.kt | 50 +++++++++++-------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 1decdf89..fecd1388 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -81,10 +81,6 @@ class CreateRemoteShareOperation( var publicUpload: Boolean = false // Upload permissions for the public link (only folders) - init { - retrieveShareDetails = false // defaults to false for backwards compatibility - } - override fun run(client: OwnCloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -140,7 +136,6 @@ class CreateRemoteShareOperation( result = parser.parse(postMethod.responseBodyAsString) if (result.isSuccess && retrieveShareDetails) { - // TODO Use executeHttpMethod // retrieve more info - POST only returns the index of the new share val emptyShare = result.data.shares[0] val getInfo = GetRemoteShareOperation( diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index f1d30d70..9ead50cd 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -59,6 +59,15 @@ class UpdateRemoteShareOperation private val remoteId: Long ) : RemoteOperation() { + /** + * 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. + */ + var name: String? = null + /** * Password to update in Share resource. * @@ -94,14 +103,7 @@ class UpdateRemoteShareOperation */ var publicUpload: Boolean? = null - /** - * 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. - */ - var name: String? = null + var retrieveShareDetails = false // To retrieve more info about the just updated share override fun run(client: OwnCloudClient): RemoteOperationResult { var result: RemoteOperationResult @@ -111,7 +113,7 @@ class UpdateRemoteShareOperation // Parameters to update if (name != null) { - formBodyBuilder.add(PARAM_NAME, name) + formBodyBuilder.add(PARAM_NAME, name!!) } if (expirationDateInMillis < INITIAL_EXPIRATION_DATE_IN_MILLIS) { @@ -148,21 +150,29 @@ class UpdateRemoteShareOperation putMethod.setRequestBody(formBodyBuilder.build()) putMethod.setRequestHeader(HttpConstants.CONTENT_TYPE_HEADER, HttpConstants.CONTENT_TYPE_URLENCODED_UTF8) - putMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + putMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE) val status = client.executeHttpMethod(putMethod) - if (isSuccess(status)) { - // Parse xml response - val parser = ShareToRemoteOperationResultParser( - ShareXMLParser() - ) - parser.ownCloudVersion = client.ownCloudVersion - parser.serverBaseUri = client.baseUri - result = parser.parse(putMethod.responseBodyAsString) + if(!isSuccess(status)){ + return RemoteOperationResult(putMethod) + } - } else { - result = RemoteOperationResult(putMethod) + // Parse xml response + val parser = ShareToRemoteOperationResultParser( + ShareXMLParser() + ) + parser.ownCloudVersion = client.ownCloudVersion + parser.serverBaseUri = client.baseUri + result = parser.parse(putMethod.responseBodyAsString) + + if (result.isSuccess && retrieveShareDetails) { + // retrieve more info - PUT only returns the index of the new share + val emptyShare = result.data.shares[0] + val getInfo = GetRemoteShareOperation( + emptyShare.id + ) + result = getInfo.execute(client) } } catch (e: Exception) { From 1632b237fff9ef3e2e69e41df546559b25041404 Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 25 Apr 2019 09:24:01 +0200 Subject: [PATCH 23/37] Update gradle version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index cca488ca..33fd36b3 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion" } From daf49d289b9390b249e3b5347eed74a4949a3ff7 Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 25 Apr 2019 13:50:15 +0200 Subject: [PATCH 24/37] Fix password not updated when sharing via public link --- .../lib/resources/shares/UpdateRemoteShareOperation.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 9ead50cd..3c2f2a5d 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -116,6 +116,10 @@ class UpdateRemoteShareOperation formBodyBuilder.add(PARAM_NAME, name!!) } + if (password != null) { + formBodyBuilder.add(PARAM_PASSWORD, password!!) + } + if (expirationDateInMillis < INITIAL_EXPIRATION_DATE_IN_MILLIS) { // clear expiration date formBodyBuilder.add(PARAM_EXPIRATION_DATE, "") From 1087f0fd46b4b78b7905475dd1ff9db248e64276 Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 9 May 2019 12:53:55 +0200 Subject: [PATCH 25/37] Apply requested changes --- .../android/lib/resources/shares/RemoteShare.kt | 3 +-- .../android/lib/resources/shares/ShareXMLParser.kt | 11 ++--------- .../resources/shares/UpdateRemoteShareOperation.kt | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index 13eac361..3bdf2056 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -55,8 +55,7 @@ class RemoteShare : Parcelable, Serializable { var isFolder: Boolean = false var userId: Long = 0 - val isPasswordProtected: Boolean - get() = ShareType.PUBLIC_LINK == shareType && shareWith.isNotEmpty() + val isValid: Boolean = id > -1 constructor() : super() { resetData() diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index e405d969..02eefcc2 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -117,7 +117,6 @@ class ShareXMLParser { } else { skip(parser) } - } return shares } @@ -150,7 +149,6 @@ class ShareXMLParser { } else { skip(parser) } - } } @@ -194,7 +192,6 @@ class ShareXMLParser { } else { skip(parser) - } } @@ -269,7 +266,7 @@ class ShareXMLParser { } else if (name.equals(NODE_EXPIRATION, ignoreCase = true)) { val value = readNode(parser, NODE_EXPIRATION) - if (value.length != 0) { + if (value.isNotEmpty()) { remoteShare.expirationDate = WebdavUtils.parseResponseDate(value)!!.time } @@ -296,15 +293,11 @@ class ShareXMLParser { } } - if (isValidShare(remoteShare)) { + if (remoteShare.isValid) { shares.add(remoteShare) } } - private fun isValidShare(share: RemoteShare): Boolean { - return share.id > -1 - } - private fun fixPathForFolder(share: RemoteShare) { if (share.isFolder && share.path.isNotEmpty() && !share.path.endsWith(FileUtils.PATH_SEPARATOR) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 3c2f2a5d..6a9c31da 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -172,7 +172,7 @@ class UpdateRemoteShareOperation if (result.isSuccess && retrieveShareDetails) { // retrieve more info - PUT only returns the index of the new share - val emptyShare = result.data.shares[0] + val emptyShare = result.data.shares.first() val getInfo = GetRemoteShareOperation( emptyShare.id ) From 95dde86edab2cc2b16132ecaa79c2aba2e0b1f91 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 14 May 2019 09:59:17 +0200 Subject: [PATCH 26/37] Apply CR changes --- .../com/owncloud/android/lib/resources/shares/RemoteShare.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt index 3bdf2056..de669db6 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoteShare.kt @@ -52,7 +52,7 @@ class RemoteShare : Parcelable, Serializable { var permissions: Int = DEFAULT_PERMISSION var sharedDate: Long = INIT_SHARED_DATE var expirationDate: Long = INIT_EXPIRATION_DATE_IN_MILLIS - var isFolder: Boolean = false + var isFolder: Boolean = path.endsWith(FileUtils.PATH_SEPARATOR) var userId: Long = 0 val isValid: Boolean = id > -1 From ca7a0c8ea8e937484ca4683191e56622046acf7d Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 9 May 2019 12:31:46 +0200 Subject: [PATCH 27/37] Remove redundant qualifiers in RemoveRemoteShareOperation --- .../android/lib/resources/shares/RemoveRemoteShareOperation.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt index 33ef20cb..d4deda06 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/RemoveRemoteShareOperation.kt @@ -63,7 +63,7 @@ class RemoveRemoteShareOperation(private val remoteShareId: Long) : RemoteOperat URL(uriBuilder.build().toString()) ) - deleteMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + deleteMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE) val status = client.executeHttpMethod(deleteMethod) From 4391f201bd837625ce4c496b894a93921bbb327a Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 19 Jun 2019 17:20:34 +0200 Subject: [PATCH 28/37] Update gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 33fd36b3..6af7cb1f 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion" } From 667958c82f78eb5be4264ce976ff9cc08bba0fec Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 25 Jun 2019 19:01:21 +0200 Subject: [PATCH 29/37] Convert GetRemoteShareesOperation java file into Kotlin --- .../shares/GetRemoteShareesOperation.java | 199 ------------------ .../shares/GetRemoteShareesOperation.kt | 195 +++++++++++++++++ 2 files changed, 195 insertions(+), 199 deletions(-) delete mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java deleted file mode 100644 index 2a90128e..00000000 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java +++ /dev/null @@ -1,199 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - * Copyright (C) 2019 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 - * 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.lib.resources.shares; - -import android.net.Uri; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.http.HttpConstants; -import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod; -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 org.json.JSONArray; -import org.json.JSONObject; - -import java.net.URL; -import java.util.ArrayList; - -import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Created by masensio on 08/10/2015. - *

- * Retrieves a list of sharees (possible targets of a share) from the ownCloud server. - *

- * Currently only handles users and groups. Users in other OC servers (federation) should be added later. - *

- * Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626} - *

- * Syntax: - * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees - * HTTP method: GET - * url argument: itemType - string, required - * url argument: format - string, optional - * url argument: search - string, optional - * url arguments: perPage - int, optional - * url arguments: page - int, optional - *

- * Status codes: - * 100 - successful - * - * @author masensio - * @author David A. Velasco - * @author David González Verdugo - */ -public class GetRemoteShareesOperation extends RemoteOperation> { - - private static final String TAG = GetRemoteShareesOperation.class.getSimpleName(); - - // OCS Routes - private static final String OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees"; // from OC 8.2 - - // Arguments - names - private static final String PARAM_FORMAT = "format"; - private static final String PARAM_ITEM_TYPE = "itemType"; - private static final String PARAM_SEARCH = "search"; - private static final String PARAM_PAGE = "page"; // default = 1 - private static final String PARAM_PER_PAGE = "perPage"; // default = 200 - - // Arguments - constant values - private static final String VALUE_FORMAT = "json"; - private static final String VALUE_ITEM_TYPE = "file"; // to get the server search for users / groups - - // JSON Node names - private static final String NODE_OCS = "ocs"; - private static final String NODE_DATA = "data"; - private static final String NODE_EXACT = "exact"; - private static final String NODE_USERS = "users"; - private static final String NODE_GROUPS = "groups"; - private static final String NODE_REMOTES = "remotes"; - public static final String NODE_VALUE = "value"; - public static final String PROPERTY_LABEL = "label"; - public static final String PROPERTY_SHARE_TYPE = "shareType"; - public static final String PROPERTY_SHARE_WITH = "shareWith"; - public static final String PROPERTY_SHARE_WITH_ADDITIONAL_INFO = "shareWithAdditionalInfo"; - - private String mSearchString; - private int mPage; - private int mPerPage; - - /** - * Constructor - * - * @param searchString string for searching users, optional - * @param page page index in the list of results; beginning in 1 - * @param perPage maximum number of results in a single page - */ - public GetRemoteShareesOperation(String searchString, int page, int perPage) { - mSearchString = searchString; - mPage = page; - mPerPage = perPage; - } - - @Override - protected RemoteOperationResult> run(OwnCloudClient client) { - RemoteOperationResult> result; - - try { - Uri requestUri = client.getBaseUri(); - Uri.Builder uriBuilder = requestUri.buildUpon() - .appendEncodedPath(OCS_ROUTE) - .appendQueryParameter(PARAM_FORMAT, VALUE_FORMAT) - .appendQueryParameter(PARAM_ITEM_TYPE, VALUE_ITEM_TYPE) - .appendQueryParameter(PARAM_SEARCH, mSearchString) - .appendQueryParameter(PARAM_PAGE, String.valueOf(mPage)) - .appendQueryParameter(PARAM_PER_PAGE, String.valueOf(mPerPage)); - - GetMethod getMethod = new GetMethod(new URL(uriBuilder.build().toString())); - - getMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - - int status = client.executeHttpMethod(getMethod); - String response = getMethod.getResponseBodyAsString(); - - if (isSuccess(status)) { - Log_OC.d(TAG, "Successful response: " + response); - - // Parse the response - JSONObject respJSON = new JSONObject(response); - JSONObject respOCS = respJSON.getJSONObject(NODE_OCS); - JSONObject respData = respOCS.getJSONObject(NODE_DATA); - JSONObject respExact = respData.getJSONObject(NODE_EXACT); - JSONArray respExactUsers = respExact.getJSONArray(NODE_USERS); - JSONArray respExactGroups = respExact.getJSONArray(NODE_GROUPS); - JSONArray respExactRemotes = respExact.getJSONArray(NODE_REMOTES); - JSONArray respPartialUsers = respData.getJSONArray(NODE_USERS); - JSONArray respPartialGroups = respData.getJSONArray(NODE_GROUPS); - JSONArray respPartialRemotes = respData.getJSONArray(NODE_REMOTES); - JSONArray[] jsonResults = { - respExactUsers, - respExactGroups, - respExactRemotes, - respPartialUsers, - respPartialGroups, - respPartialRemotes - }; - - ArrayList data = new ArrayList<>(); // For result data - for (int i = 0; i < 6; i++) { - for (int j = 0; j < jsonResults[i].length(); j++) { - JSONObject jsonResult = jsonResults[i].getJSONObject(j); - data.add(jsonResult); - Log_OC.d(TAG, "*** Added item: " + jsonResult.getString(PROPERTY_LABEL)); - } - } - - result = new RemoteOperationResult<>(OK); - result.setData(data); - - Log_OC.d(TAG, "*** Get Users or groups completed "); - - } else { - result = new RemoteOperationResult<>(getMethod); - Log_OC.e(TAG, "Failed response while getting users/groups from the server "); - if (response != null) { - Log_OC.e(TAG, "*** status code: " + status + "; response message: " + response); - } else { - Log_OC.e(TAG, "*** status code: " + status); - } - } - } catch (Exception e) { - result = new RemoteOperationResult<>(e); - Log_OC.e(TAG, "Exception while getting users/groups", e); - } - - return result; - } - - private boolean isSuccess(int status) { - return (status == HttpConstants.HTTP_OK); - } -} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt new file mode 100644 index 00000000..0f2eba47 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt @@ -0,0 +1,195 @@ +/* ownCloud Android Library is available under MIT license + * + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + * Copyright (C) 2019 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 + * 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.lib.resources.shares + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.http.HttpConstants +import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod +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 org.json.JSONObject + +import java.net.URL +import java.util.ArrayList + +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK + +/** + * Created by masensio on 08/10/2015. + * + * + * Retrieves a list of sharees (possible targets of a share) from the ownCloud server. + * + * + * Currently only handles users and groups. Users in other OC servers (federation) should be added later. + * + * + * Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626} + * + * + * Syntax: + * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees + * HTTP method: GET + * url argument: itemType - string, required + * url argument: format - string, optional + * url argument: search - string, optional + * url arguments: perPage - int, optional + * url arguments: page - int, optional + * + * + * Status codes: + * 100 - successful + * + * @author masensio + * @author David A. Velasco + * @author David González Verdugo + */ +class GetRemoteShareesOperation +/** + * Constructor + * + * @param searchString string for searching users, optional + * @param page page index in the list of results; beginning in 1 + * @param perPage maximum number of results in a single page + */ + (private val searchString: String, private val page: Int, private val perPage: Int) : + RemoteOperation>() { + + override fun run(client: OwnCloudClient): RemoteOperationResult> { + var result: RemoteOperationResult> + + try { + val requestUri = client.baseUri + val uriBuilder = requestUri.buildUpon() + .appendEncodedPath(OCS_ROUTE) + .appendQueryParameter(PARAM_FORMAT, VALUE_FORMAT) + .appendQueryParameter(PARAM_ITEM_TYPE, VALUE_ITEM_TYPE) + .appendQueryParameter(PARAM_SEARCH, searchString) + .appendQueryParameter(PARAM_PAGE, page.toString()) + .appendQueryParameter(PARAM_PER_PAGE, perPage.toString()) + + val getMethod = GetMethod(URL(uriBuilder.build().toString())) + + getMethod.addRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE) + + val status = client.executeHttpMethod(getMethod) + val response = getMethod.responseBodyAsString + + if (isSuccess(status)) { + Log_OC.d(TAG, "Successful response: " + response!!) + + // Parse the response + val respJSON = JSONObject(response) + val respOCS = respJSON.getJSONObject(NODE_OCS) + val respData = respOCS.getJSONObject(NODE_DATA) + val respExact = respData.getJSONObject(NODE_EXACT) + val respExactUsers = respExact.getJSONArray(NODE_USERS) + val respExactGroups = respExact.getJSONArray(NODE_GROUPS) + val respExactRemotes = respExact.getJSONArray(NODE_REMOTES) + val respPartialUsers = respData.getJSONArray(NODE_USERS) + val respPartialGroups = respData.getJSONArray(NODE_GROUPS) + val respPartialRemotes = respData.getJSONArray(NODE_REMOTES) + val jsonResults = arrayOf( + respExactUsers, + respExactGroups, + respExactRemotes, + respPartialUsers, + respPartialGroups, + respPartialRemotes + ) + + val data = ArrayList() // For result data + for (i in 0..5) { + for (j in 0 until jsonResults[i].length()) { + val jsonResult = jsonResults[i].getJSONObject(j) + data.add(jsonResult) + Log_OC.d(TAG, "*** Added item: " + jsonResult.getString(PROPERTY_LABEL)) + } + } + + result = RemoteOperationResult(OK) + result.data = data + + Log_OC.d(TAG, "*** Get Users or groups completed ") + + } else { + result = RemoteOperationResult(getMethod) + Log_OC.e(TAG, "Failed response while getting users/groups from the server ") + if (response != null) { + Log_OC.e(TAG, "*** status code: $status; response message: $response") + } else { + Log_OC.e(TAG, "*** status code: $status") + } + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e(TAG, "Exception while getting users/groups", e) + } + + return result + } + + private fun isSuccess(status: Int): Boolean { + return status == HttpConstants.HTTP_OK + } + + companion object { + + private val TAG = GetRemoteShareesOperation::class.java.simpleName + + // OCS Routes + private val OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees" // from OC 8.2 + + // Arguments - names + private val PARAM_FORMAT = "format" + private val PARAM_ITEM_TYPE = "itemType" + private val PARAM_SEARCH = "search" + private val PARAM_PAGE = "page" // default = 1 + private val PARAM_PER_PAGE = "perPage" // default = 200 + + // Arguments - constant values + private val VALUE_FORMAT = "json" + private val VALUE_ITEM_TYPE = "file" // to get the server search for users / groups + + // JSON Node names + private val NODE_OCS = "ocs" + private val NODE_DATA = "data" + private val NODE_EXACT = "exact" + private val NODE_USERS = "users" + private val NODE_GROUPS = "groups" + private val NODE_REMOTES = "remotes" + val NODE_VALUE = "value" + val PROPERTY_LABEL = "label" + val PROPERTY_SHARE_TYPE = "shareType" + val PROPERTY_SHARE_WITH = "shareWith" + val PROPERTY_SHARE_WITH_ADDITIONAL_INFO = "shareWithAdditionalInfo" + } +} From 80be123cec80aca439560b8d31ce5ac9b7c5b9ff Mon Sep 17 00:00:00 2001 From: davigonz Date: Wed, 26 Jun 2019 18:11:02 +0200 Subject: [PATCH 30/37] Make GetRemoteShareesOperation opened for testing --- .../android/lib/resources/shares/GetRemoteShareesOperation.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt index 0f2eba47..d439ff26 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.kt @@ -41,6 +41,7 @@ import java.net.URL import java.util.ArrayList import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK +import com.owncloud.android.lib.testing.OpenForTesting /** * Created by masensio on 08/10/2015. @@ -72,6 +73,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCo * @author David A. Velasco * @author David González Verdugo */ +@OpenForTesting class GetRemoteShareesOperation /** * Constructor From 06bc2ddf6fe19b78703464cb487b4cd7e6c60fce Mon Sep 17 00:00:00 2001 From: davigonz Date: Fri, 28 Jun 2019 14:55:36 +0200 Subject: [PATCH 31/37] Some lint minor changes --- .../lib/resources/shares/CreateRemoteShareOperation.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index fecd1388..b7080c4d 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -71,8 +71,6 @@ class CreateRemoteShareOperation( private val shareWith: String, private val permissions: Int ) : RemoteOperation() { - var retrieveShareDetails = false // To retrieve more info about the just created share - var name = "" // Name to set for the public link var password: String = "" // Password to set for the public link @@ -81,13 +79,15 @@ class CreateRemoteShareOperation( var publicUpload: Boolean = false // Upload permissions for the public link (only folders) + var retrieveShareDetails = false // To retrieve more info about the just created share + override fun run(client: OwnCloudClient): RemoteOperationResult { var result: RemoteOperationResult try { val formBodyBuilder = FormBody.Builder() .add(PARAM_PATH, remoteFilePath) - .add(PARAM_SHARE_TYPE, Integer.toString(shareType.value)) + .add(PARAM_SHARE_TYPE, shareType.value.toString()) .add(PARAM_SHARE_WITH, shareWith) if (name.isNotEmpty()) { @@ -109,7 +109,7 @@ class CreateRemoteShareOperation( formBodyBuilder.add(PARAM_PASSWORD, password) } if (RemoteShare.DEFAULT_PERMISSION != permissions) { - formBodyBuilder.add(PARAM_PERMISSIONS, Integer.toString(permissions)) + formBodyBuilder.add(PARAM_PERMISSIONS, permissions.toString()) } val requestUri = client.baseUri From 253e69f41555a828e5dc31d91fc3843eecabc900 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 2 Jul 2019 09:33:37 +0200 Subject: [PATCH 32/37] Fix showAdditionalInfo not taken into account --- .../owncloud/android/lib/resources/shares/ShareXMLParser.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index 02eefcc2..ab80ec26 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -281,6 +281,9 @@ class ShareXMLParser { } else if (name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true)) { remoteShare.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) + } else if (name.equals(NODE_SHARE_WITH_ADDITIONAL_INFO)) { + remoteShare.sharedWithAdditionalInfo = readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO) + } else if (name.equals(NODE_URL, ignoreCase = true)) { val value = readNode(parser, NODE_URL) remoteShare.shareLink = value From c8d93400e044575be860cabdc6576760dda53c6b Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 4 Jul 2019 09:47:05 +0200 Subject: [PATCH 33/37] Include ignoreCase for NODE_SHARE_WITH_ADDITIONAL_INFO --- .../com/owncloud/android/lib/resources/shares/ShareXMLParser.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index ab80ec26..9cab44b2 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -281,7 +281,7 @@ class ShareXMLParser { } else if (name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true)) { remoteShare.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) - } else if (name.equals(NODE_SHARE_WITH_ADDITIONAL_INFO)) { + } else if (name.equals(NODE_SHARE_WITH_ADDITIONAL_INFO, ignoreCase = true)) { remoteShare.sharedWithAdditionalInfo = readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO) } else if (name.equals(NODE_URL, ignoreCase = true)) { From b2b32c048bf5a9aaa33bd66213883c7dada9916e Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 4 Jul 2019 10:07:20 +0200 Subject: [PATCH 34/37] Apply CR changes --- .../lib/resources/shares/ShareXMLParser.kt | 142 ++++++++++-------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt index 9cab44b2..df634321 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.kt @@ -225,74 +225,96 @@ class ShareXMLParser { val name = parser.name - if (name.equals(NODE_ELEMENT, ignoreCase = true)) { - // 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.equals(NODE_ID, ignoreCase = true)) { - remoteShare.id = Integer.parseInt(readNode(parser, NODE_ID)).toLong() - - } else if (name.equals(NODE_ITEM_TYPE, ignoreCase = true)) { - remoteShare.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) - fixPathForFolder(remoteShare) - - } else if (name.equals(NODE_ITEM_SOURCE, ignoreCase = true)) { - remoteShare.itemSource = java.lang.Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)) - - } else if (name.equals(NODE_PARENT, ignoreCase = true)) { - readNode(parser, NODE_PARENT) - - } else if (name.equals(NODE_SHARE_TYPE, ignoreCase = true)) { - val value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)) - remoteShare.shareType = ShareType.fromValue(value) - - } else if (name.equals(NODE_SHARE_WITH, ignoreCase = true)) { - remoteShare.shareWith = readNode(parser, NODE_SHARE_WITH) - - } else if (name.equals(NODE_FILE_SOURCE, ignoreCase = true)) { - remoteShare.fileSource = java.lang.Long.parseLong(readNode(parser, NODE_FILE_SOURCE)) - - } else if (name.equals(NODE_PATH, ignoreCase = true)) { - remoteShare.path = readNode(parser, NODE_PATH) - fixPathForFolder(remoteShare) - - } else if (name.equals(NODE_PERMISSIONS, ignoreCase = true)) { - remoteShare.permissions = Integer.parseInt(readNode(parser, NODE_PERMISSIONS)) - - } else if (name.equals(NODE_STIME, ignoreCase = true)) { - remoteShare.sharedDate = java.lang.Long.parseLong(readNode(parser, NODE_STIME)) - - } else if (name.equals(NODE_EXPIRATION, ignoreCase = true)) { - val value = readNode(parser, NODE_EXPIRATION) - if (value.isNotEmpty()) { - remoteShare.expirationDate = WebdavUtils.parseResponseDate(value)!!.time + when { + name.equals(NODE_ELEMENT, ignoreCase = true) -> { + // 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.equals(NODE_TOKEN, ignoreCase = true)) { - remoteShare.token = readNode(parser, NODE_TOKEN) + name.equals(NODE_ID, ignoreCase = true) -> { + remoteShare.id = Integer.parseInt(readNode(parser, NODE_ID)).toLong() + } - } else if (name.equals(NODE_STORAGE, ignoreCase = true)) { - readNode(parser, NODE_STORAGE) - } else if (name.equals(NODE_MAIL_SEND, ignoreCase = true)) { - readNode(parser, NODE_MAIL_SEND) + name.equals(NODE_ITEM_TYPE, ignoreCase = true) -> { + remoteShare.isFolder = readNode(parser, NODE_ITEM_TYPE).equals(TYPE_FOLDER, ignoreCase = true) + fixPathForFolder(remoteShare) + } - } else if (name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true)) { - remoteShare.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) + name.equals(NODE_ITEM_SOURCE, ignoreCase = true) -> { + remoteShare.itemSource = java.lang.Long.parseLong(readNode(parser, NODE_ITEM_SOURCE)) + } - } else if (name.equals(NODE_SHARE_WITH_ADDITIONAL_INFO, ignoreCase = true)) { - remoteShare.sharedWithAdditionalInfo = readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO) + name.equals(NODE_PARENT, ignoreCase = true) -> { + readNode(parser, NODE_PARENT) + } - } else if (name.equals(NODE_URL, ignoreCase = true)) { - val value = readNode(parser, NODE_URL) - remoteShare.shareLink = value + name.equals(NODE_SHARE_TYPE, ignoreCase = true) -> { + val value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)) + remoteShare.shareType = ShareType.fromValue(value) + } - } else if (name.equals(NODE_NAME, ignoreCase = true)) { - remoteShare.name = readNode(parser, NODE_NAME) + name.equals(NODE_SHARE_WITH, ignoreCase = true) -> { + remoteShare.shareWith = readNode(parser, NODE_SHARE_WITH) + } - } else { - skip(parser) + name.equals(NODE_FILE_SOURCE, ignoreCase = true) -> { + remoteShare.fileSource = java.lang.Long.parseLong(readNode(parser, NODE_FILE_SOURCE)) + } + + name.equals(NODE_PATH, ignoreCase = true) -> { + remoteShare.path = readNode(parser, NODE_PATH) + fixPathForFolder(remoteShare) + } + + name.equals(NODE_PERMISSIONS, ignoreCase = true) -> { + remoteShare.permissions = Integer.parseInt(readNode(parser, NODE_PERMISSIONS)) + } + + name.equals(NODE_STIME, ignoreCase = true) -> { + remoteShare.sharedDate = java.lang.Long.parseLong(readNode(parser, NODE_STIME)) + } + + name.equals(NODE_EXPIRATION, ignoreCase = true) -> { + val value = readNode(parser, NODE_EXPIRATION) + if (value.isNotEmpty()) { + remoteShare.expirationDate = WebdavUtils.parseResponseDate(value)!!.time + } + } + + name.equals(NODE_TOKEN, ignoreCase = true) -> { + remoteShare.token = readNode(parser, NODE_TOKEN) + } + + name.equals(NODE_STORAGE, ignoreCase = true) -> { + readNode(parser, NODE_STORAGE) + } + + name.equals(NODE_MAIL_SEND, ignoreCase = true) -> { + readNode(parser, NODE_MAIL_SEND) + } + + name.equals(NODE_SHARE_WITH_DISPLAY_NAME, ignoreCase = true) -> { + remoteShare.sharedWithDisplayName = readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME) + } + + name.equals(NODE_SHARE_WITH_ADDITIONAL_INFO, ignoreCase = true) -> { + remoteShare.sharedWithAdditionalInfo = readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO) + } + + name.equals(NODE_URL, ignoreCase = true) -> { + val value = readNode(parser, NODE_URL) + remoteShare.shareLink = value + } + + name.equals(NODE_NAME, ignoreCase = true) -> { + remoteShare.name = readNode(parser, NODE_NAME) + } + + else -> { + skip(parser) + } } } From 91c6183090aa64dba808255dd934c256f8be239b Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 6 Aug 2019 13:43:37 +0200 Subject: [PATCH 35/37] Fix Permissions not granted in reshares do not show correct error --- .../lib/resources/shares/UpdateRemoteShareOperation.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 6a9c31da..49f38e65 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -158,14 +158,15 @@ class UpdateRemoteShareOperation val status = client.executeHttpMethod(putMethod) - if(!isSuccess(status)){ - return RemoteOperationResult(putMethod) - } - // Parse xml response val parser = ShareToRemoteOperationResultParser( ShareXMLParser() ) + + if (!isSuccess(status)) { + return parser.parse(putMethod.responseBodyAsString) + } + parser.ownCloudVersion = client.ownCloudVersion parser.serverBaseUri = client.baseUri result = parser.parse(putMethod.responseBodyAsString) From 176de93abca265c138b9a39892c837e4a189ff0d Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 6 Aug 2019 16:44:13 +0200 Subject: [PATCH 36/37] Fix concurrent exception that appears from time to time --- .../android/lib/common/http/interceptors/HttpInterceptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java index 3c9b61e7..b9720924 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java @@ -30,7 +30,7 @@ import okhttp3.Response; import java.io.IOException; import java.util.ArrayList; -import java.util.Iterator; +import java.util.ListIterator; /** * Http interceptor to use multiple interceptors in the same {@link okhttp3.OkHttpClient} instance @@ -86,7 +86,7 @@ public class HttpInterceptor implements Interceptor { } public void deleteRequestHeaderInterceptor(String headerName) { - Iterator requestInterceptorIterator = mRequestInterceptors.iterator(); + ListIterator requestInterceptorIterator = mRequestInterceptors.listIterator(); while (requestInterceptorIterator.hasNext()) { RequestInterceptor currentRequestInterceptor = requestInterceptorIterator.next(); if (currentRequestInterceptor instanceof RequestHeaderInterceptor && From c7d0f83683afbdf2eb4cb657e8e5c694ffccbd08 Mon Sep 17 00:00:00 2001 From: davigonz Date: Tue, 6 Aug 2019 17:41:57 +0200 Subject: [PATCH 37/37] Update gradle version to fix build --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 53f7eaf3..f350b755 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip \ No newline at end of file