diff --git a/app/build.gradle b/app/build.gradle index 84f7a36c..14f9a61b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,17 +17,17 @@ android { minSdkVersion 14 targetSdkVersion 23 - versionCode 108 + versionCode 109 buildConfigField "long", "buildTime", System.currentTimeMillis() + "L" } productFlavors { standard { - versionName "1.1.1.2" + versionName "1.2" } gplay { - versionName "1.1.1.2-gplay" + versionName "1.2-gplay" } } diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java index 4c4b215a..6c3d6698 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/CalendarSyncManager.java @@ -148,7 +148,11 @@ public class CalendarSyncManager extends SyncManager { DavResource remote = bunch[0]; ResponseBody body = remote.get("text/calendar"); - String eTag = ((GetETag)remote.properties.get(GetETag.NAME)).eTag; + + // CalDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc4791#section-5.3.4] + GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME); + if (eTag == null || StringUtils.isEmpty(eTag.eTag)) + throw new DavException("Received CalDAV GET response without ETag for " + remote.location); Charset charset = Charsets.UTF_8; MediaType contentType = body.contentType(); @@ -156,7 +160,7 @@ public class CalendarSyncManager extends SyncManager { charset = contentType.charset(Charsets.UTF_8); @Cleanup InputStream stream = body.byteStream(); - processVEvent(remote.fileName(), eTag, stream, charset); + processVEvent(remote.fileName(), eTag.eTag, stream, charset); } else { // multiple contacts, use multi-get diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java index 037652d4..bdeffd5d 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/ContactsSyncManager.java @@ -315,7 +315,11 @@ public class ContactsSyncManager extends SyncManager { DavResource remote = bunch[0]; ResponseBody body = remote.get("text/vcard;version=4.0, text/vcard;charset=utf-8;q=0.8, text/vcard;q=0.5"); - String eTag = ((GetETag) remote.properties.get(GetETag.NAME)).eTag; + + // CardDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc6352#section-6.3.2.3] + GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME); + if (eTag == null || StringUtils.isEmpty(eTag.eTag)) + throw new DavException("Received CardDAV GET response without ETag for " + remote.location); Charset charset = Charsets.UTF_8; MediaType contentType = body.contentType(); @@ -323,7 +327,7 @@ public class ContactsSyncManager extends SyncManager { charset = contentType.charset(Charsets.UTF_8); @Cleanup InputStream stream = body.byteStream(); - processVCard(remote.fileName(), eTag, stream, charset, downloader); + processVCard(remote.fileName(), eTag.eTag, stream, charset, downloader); } else { // multiple contacts, use multi-get diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java index 2ed3f80c..1a1994fa 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/TasksSyncManager.java @@ -130,7 +130,11 @@ public class TasksSyncManager extends SyncManager { DavResource remote = bunch[0]; ResponseBody body = remote.get("text/calendar"); - String eTag = ((GetETag)remote.properties.get(GetETag.NAME)).eTag; + + // CalDAV servers MUST return ETag on GET [https://tools.ietf.org/html/rfc4791#section-5.3.4] + GetETag eTag = (GetETag)remote.properties.get(GetETag.NAME); + if (eTag == null || StringUtils.isEmpty(eTag.eTag)) + throw new DavException("Received CalDAV GET response without ETag for " + remote.location); Charset charset = Charsets.UTF_8; MediaType contentType = body.contentType(); @@ -138,7 +142,7 @@ public class TasksSyncManager extends SyncManager { charset = contentType.charset(Charsets.UTF_8); @Cleanup InputStream stream = body.byteStream(); - processVTodo(remote.fileName(), eTag, stream, charset); + processVTodo(remote.fileName(), eTag.eTag, stream, charset); } else { // multiple contacts, use multi-get diff --git a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java index 415544a5..21926dae 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java @@ -209,11 +209,19 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage for (Account acct : accountManager.getAccountsByType(Constants.ACCOUNT_TYPE)) try { AccountSettings settings = new AccountSettings(getContext(), acct); - report.append( - "Account: ").append(acct.name).append("\n" + - " Address book sync. interval: ").append(syncStatus(settings, ContactsContract.AUTHORITY)).append("\n" + - " Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" + - " OpenTasks sync. interval: ").append(syncStatus(settings, "org.dmfs.tasks")).append("\n"); + report.append("Account: ").append(acct.name).append("\n" + + " Address book sync. interval: ").append(syncStatus(settings, ContactsContract.AUTHORITY)).append("\n" + + " Calendar sync. interval: ").append(syncStatus(settings, CalendarContract.AUTHORITY)).append("\n" + + " OpenTasks sync. interval: ").append(syncStatus(settings, "org.dmfs.tasks")).append("\n" + + " Preemptive auth: ").append(settings.preemptiveAuth()).append("\n" + + " WiFi only: ").append(settings.getSyncWifiOnly()); + if (settings.getSyncWifiOnlySSID() != null) + report.append(", SSID: ").append(settings.getSyncWifiOnlySSID()); + report.append("\n [CardDAV] Contact group method: ").append(settings.getGroupMethod()) + .append("\n RFC 6868 encoding: ").append(settings.getVCardRFC6868()) + .append("\n [CalDAV] Time range (past days): ").append(settings.getTimeRangePastDays()) + .append("\n Manage calendar colors: ").append(settings.getManageCalendarColors()) + .append("\n"); } catch(InvalidAccountException e) { report.append(acct).append(" is invalid (unsupported settings version) or does not exist\n"); } @@ -230,7 +238,7 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage "Android version: ").append(Build.VERSION.RELEASE).append(" (").append(Build.DISPLAY).append(")\n" + "Device: ").append(WordUtils.capitalize(Build.MANUFACTURER)).append(" ").append(Build.MODEL).append(" (").append(Build.DEVICE).append(")\n\n" ); - } catch (Exception ex) { + } catch(Exception ex) { App.log.log(Level.SEVERE, "Couldn't get system details", ex); } diff --git a/dav4android b/dav4android index fde96be2..d5487a16 160000 --- a/dav4android +++ b/dav4android @@ -1 +1 @@ -Subproject commit fde96be29889d29f6ee796cf40f120fba6d50690 +Subproject commit d5487a1623d7fb7b9b25b41661dec4706bd4001e diff --git a/vcard4android b/vcard4android index 61ed6675..3a6692f0 160000 --- a/vcard4android +++ b/vcard4android @@ -1 +1 @@ -Subproject commit 61ed667572b0feed32503d912557360371794a59 +Subproject commit 3a6692f0969afc782358d37b92f291179f72276e