1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-07 16:06:08 +00:00

Added minimal validation of parsed shares coming from server to avoid crashes due to bad formed or unexpected responses

This commit is contained in:
David A. Velasco 2014-02-20 12:56:29 +01:00
parent c3f4382200
commit 9a3ad5a4ec

View File

@ -221,7 +221,8 @@ public class ShareXMLParser {
} }
String name = parser.getName(); String name = parser.getName();
if (name.equalsIgnoreCase(NODE_ELEMENT)) { if (name.equalsIgnoreCase(NODE_ELEMENT)) {
shares.add(readElement(parser)); readElement(parser, shares);
} else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response
share = new OCShare(); share = new OCShare();
String value = readNode(parser, NODE_ID); String value = readNode(parser, NODE_ID);
@ -244,7 +245,6 @@ public class ShareXMLParser {
if (share != null) { if (share != null) {
shares.add(share); shares.add(share);
} }
return shares; return shares;
@ -258,7 +258,7 @@ public class ShareXMLParser {
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException
*/ */
private OCShare readElement(XmlPullParser parser) throws XmlPullParserException, IOException { private void readElement(XmlPullParser parser, ArrayList<OCShare> shares) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT);
OCShare share = new OCShare(); OCShare share = new OCShare();
@ -272,7 +272,9 @@ public class ShareXMLParser {
String name = parser.getName(); String name = parser.getName();
if (name.equalsIgnoreCase(NODE_ELEMENT)) { if (name.equalsIgnoreCase(NODE_ELEMENT)) {
share = readElement(parser); // patch to work around servers responding with extra <element> 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)) { } else if (name.equalsIgnoreCase(NODE_ID)) {
share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID)));
@ -329,7 +331,13 @@ public class ShareXMLParser {
} }
} }
return share; if (isValidShare(share)) {
shares.add(share);
}
}
private boolean isValidShare(OCShare share) {
return (share.getIdRemoteShared() > -1);
} }
private void fixPathForFolder(OCShare share) { private void fixPathForFolder(OCShare share) {