diff options
author | R Hirner <hirner@bitfire.at> | 2014-12-28 00:41:23 +0300 |
---|---|---|
committer | R Hirner <hirner@bitfire.at> | 2014-12-28 00:42:57 +0300 |
commit | 6f5748c464320cd0b4502722d83f0c797dc01b7c (patch) | |
tree | e47d81ff730dd708a546f383ecfe811759858255 | |
parent | 0423e00ffdfa2998c965b732f3bf9b9d93a68bf9 (diff) |
Handle resources with "%" and other special characters in file name more accurately (fixes #401)v0.6.9.2
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | app/build.gradle | 1 | ||||
-rw-r--r-- | app/src/androidTest/java/at/bitfire/davdroid/webdav/WebDavResourceTest.java | 10 | ||||
-rw-r--r-- | app/src/androidTest/robohydra/plugins/dav/index.js | 8 | ||||
-rw-r--r-- | app/src/main/AndroidManifest.xml | 4 | ||||
-rw-r--r-- | app/src/main/java/at/bitfire/davdroid/Constants.java | 2 | ||||
-rw-r--r-- | app/src/main/java/at/bitfire/davdroid/webdav/WebDavResource.java | 5 |
7 files changed, 22 insertions, 10 deletions
@@ -13,7 +13,7 @@ Twitter: [@davdroidapp](https://twitter.com/davdroidapp) USED THIRD-PARTY LIBRARIES ========================== -* [Apache HttpClient](http://hc.apache.org) ([httpclientandroidlib](https://code.google.com/p/httpclientandroidlib/) flavour) – [Apache License](http://www.apache.org/licenses/) +* [Apache HttpClient](http://hc.apache.org) (Android port) – [Apache License](http://www.apache.org/licenses/) * [iCal4j](http://ical4j.sourceforge.net/) – [New BSD License](http://sourceforge.net/p/ical4j/ical4j/ci/default/tree/LICENSE) * [ez-vcard](https://code.google.com/p/ez-vcard/) – [New BSD License](http://opensource.org/licenses/BSD-3-Clause) * [Simple XML Serialization](http://simple.sourceforge.net/) – [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) diff --git a/app/build.gradle b/app/build.gradle index 20a40f2c..6a6caa8e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,7 @@ android { buildTypes { debug { + minifyEnabled false } release { minifyEnabled true diff --git a/app/src/androidTest/java/at/bitfire/davdroid/webdav/WebDavResourceTest.java b/app/src/androidTest/java/at/bitfire/davdroid/webdav/WebDavResourceTest.java index 0dc9321c..e2137ada 100644 --- a/app/src/androidTest/java/at/bitfire/davdroid/webdav/WebDavResourceTest.java +++ b/app/src/androidTest/java/at/bitfire/davdroid/webdav/WebDavResourceTest.java @@ -170,10 +170,16 @@ public class WebDavResourceTest extends InstrumentationTestCase { } public void testMultiGet() throws Exception { - WebDavResource davAddressBook = new WebDavResource(davCollection, "addressbooks/default.vcf"); - davAddressBook.multiGet(DavMultiget.Type.ADDRESS_BOOK, new String[] { "1.vcf", "2.vcf" }); + WebDavResource davAddressBook = new WebDavResource(davCollection, "addressbooks/default.vcf/"); + davAddressBook.multiGet(DavMultiget.Type.ADDRESS_BOOK, new String[] { "1.vcf", "2:3@my%40pc.vcf" }); + // queried address book has a name assertEquals("My Book", davAddressBook.getDisplayName()); + // there are two contacts assertEquals(2, davAddressBook.getMembers().size()); + // contact file names should be unescaped (yes, it's really named ...%40pc... to check double-encoding) + assertEquals("1.vcf", davAddressBook.getMembers().get(0).getName()); + assertEquals("2:3@my%40pc.vcf", davAddressBook.getMembers().get(1).getName()); + // both contacts have content for (WebDavResource member : davAddressBook.getMembers()) assertNotNull(member.getContent()); } diff --git a/app/src/androidTest/robohydra/plugins/dav/index.js b/app/src/androidTest/robohydra/plugins/dav/index.js index 68f84f38..3cc518e8 100644 --- a/app/src/androidTest/robohydra/plugins/dav/index.js +++ b/app/src/androidTest/robohydra/plugins/dav/index.js @@ -224,14 +224,16 @@ exports.getBodyParts = function(conf) { new RoboHydraHeadDAV({ path: "/dav/addressbooks/default.vcf/", handler: function(req,res,next) { - if (req.method == "REPORT" && req.rawBody.toString().match(/addressbook-multiget[\s\S]+<prop>[\s\S]+<href>/m)) { + if (req.method == "REPORT" && req.rawBody.toString().match(/addressbook-multiget[\s\S]+<prop>[\s\S]+<href>/m && + req.rawBody.toString().match(/<href>\/dav\/addressbooks\/default\.vcf\/2:3@my%2540pc\.vcf<\/href>/m))) { res.statusCode = 207; res.write('\<?xml version="1.0" encoding="utf-8" ?>\ <multistatus xmlns="DAV:" xmlns:CARD="urn:ietf:params:xml:ns:carddav">\ <response>\ - <href>/dav/addressbooks/d%65fault.vcf</href>\ + <href>/dav/addressbooks/default.vcf</href>\ <propstat>\ <prop>\ + <resourcetype><collection/></resourcetype>\ <displayname>My Book</displayname>\ </prop>\ <status>HTTP/1.1 200 OK</status>\ @@ -253,7 +255,7 @@ exports.getBodyParts = function(conf) { </propstat>\ </response>\ <response>\ - <href>/dav/addressbooks/default.vcf/2.vcf</href>\ + <href>/dav/addressbooks/default.vcf/2:3%40my%2540pc.vcf</href>\ <propstat>\ <prop>\ <getetag/>\ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a3df1155..1bdc0499 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="at.bitfire.davdroid" - android:versionCode="49" - android:versionName="0.6.9.1" android:installLocation="internalOnly"> + android:versionCode="50" + android:versionName="0.6.9.2" android:installLocation="internalOnly"> <uses-sdk android:minSdkVersion="14" diff --git a/app/src/main/java/at/bitfire/davdroid/Constants.java b/app/src/main/java/at/bitfire/davdroid/Constants.java index bfbce049..2fff4fcb 100644 --- a/app/src/main/java/at/bitfire/davdroid/Constants.java +++ b/app/src/main/java/at/bitfire/davdroid/Constants.java @@ -9,7 +9,7 @@ package at.bitfire.davdroid; public class Constants { public static final String - APP_VERSION = "0.6.9.1", + APP_VERSION = "0.6.9.2", ACCOUNT_TYPE = "bitfire.at.davdroid", WEB_URL_HELP = "https://davdroid.bitfire.at/configuration?pk_campaign=davdroid-app"; } diff --git a/app/src/main/java/at/bitfire/davdroid/webdav/WebDavResource.java b/app/src/main/java/at/bitfire/davdroid/webdav/WebDavResource.java index 0c1fddc0..f2c31457 100644 --- a/app/src/main/java/at/bitfire/davdroid/webdav/WebDavResource.java +++ b/app/src/main/java/at/bitfire/davdroid/webdav/WebDavResource.java @@ -296,7 +296,10 @@ public class WebDavResource { // build multi-get XML request List<String> hrefs = new LinkedList<String>(); for (String name : names) - hrefs.add(location.resolve(name).getPath()); + // name may contain "%" which have to be encoded → use non-quoting URI constructor and getRawPath() + // name may also contain ":", so prepend "./" because even the non-quoting URI constructor parses after constructing + // DAVdroid ensures that collections always have a trailing slash, so "./" won't go down in directory hierarchy + hrefs.add(location.resolve(new URI(null, null, "./" + name, null)).getRawPath()); DavMultiget multiget = DavMultiget.newRequest(type, hrefs.toArray(new String[0])); StringWriter writer = new StringWriter(); |