Relax principal parsing

Mailbox.org uses the same XML elements as sabre/dav, but uses them
differently
pull/1400/head
Alex Baker 3 years ago
parent 2eac8dd20c
commit ed4170dbe8

@ -50,9 +50,7 @@ class CaldavSynchronizerTest : CaldavTest() {
})
enqueue(OC_SHARE_PROPFIND)
synchronizer.sync(account)
assertFalse(caldavDao.getAccountByUuid(account.uuid!!)!!.hasError)
sync()
}
@Test
@ -70,16 +68,14 @@ class CaldavSynchronizerTest : CaldavTest() {
))
enqueue(OC_SHARE_PROPFIND, OC_SHARE_REPORT)
synchronizer.sync(account)
assertFalse(caldavDao.getAccountByUuid(account.uuid!!)!!.hasError)
sync()
}
@Test
fun syncNewTask() = runBlocking {
enqueue(OC_SHARE_PROPFIND, OC_SHARE_REPORT, OC_SHARE_TASK)
synchronizer.sync(account)
sync()
val calendar = caldavDao.getCalendars().takeIf { it.size == 1 }!!.first()
val caldavTask = caldavDao.getTaskByRemoteId(calendar.uuid!!, "3164728546640386952")!!

@ -1,10 +1,13 @@
package org.tasks.caldav
import com.todoroo.astrid.dao.TaskDao
import junit.framework.Assert.assertFalse
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.rules.Timeout
import org.tasks.R
import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavDao
@ -22,6 +25,9 @@ abstract class CaldavTest : InjectingTestCase() {
protected val server = MockWebServer()
protected lateinit var account: CaldavAccount
@get:Rule
val globalTimeout: Timeout = Timeout.seconds(30)
@Before
override fun setUp() {
super.setUp()
@ -33,6 +39,12 @@ abstract class CaldavTest : InjectingTestCase() {
@After
fun after() = server.shutdown()
protected suspend fun sync(account: CaldavAccount = this.account) {
synchronizer.sync(account)
assertFalse(caldavDao.getAccountByUuid(account.uuid!!)!!.hasError)
}
protected fun enqueue(vararg responses: String) {
responses.forEach {
server.enqueue(

@ -0,0 +1,126 @@
package org.tasks.caldav
import com.todoroo.astrid.helper.UUIDHelper
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.UninstallModules
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar
import org.tasks.data.PrincipalDao
import org.tasks.injection.ProductionModule
import javax.inject.Inject
@UninstallModules(ProductionModule::class)
@HiltAndroidTest
class SharingMailboxDotOrgTest : CaldavTest() {
@Inject lateinit var principalDao: PrincipalDao
@Test
fun principalForSharee() = runBlocking {
account = CaldavAccount().apply {
uuid = UUIDHelper.newUUID()
username = "3"
password = encryption.encrypt("password")
url = server.url("/caldav/").toString()
id = caldavDao.insert(this)
}
val calendar = CaldavCalendar().apply {
account = this@SharingMailboxDotOrgTest.account.uuid
ctag = "1614876450015"
url = "${this@SharingMailboxDotOrgTest.account.url}MzM/"
caldavDao.insert(this)
}
enqueue(SHARE_OWNER)
sync()
val principal = principalDao.getAll().first()
assertEquals(calendar.id, principal.list)
assertEquals("/principals/users/5", principal.principal)
assertNull(principal.displayName)
assertEquals(CaldavCalendar.INVITE_ACCEPTED, principal.inviteStatus)
assertEquals(CaldavCalendar.ACCESS_UNKNOWN, principal.access)
}
companion object {
private val SHARE_OWNER = """
<?xml version="1.0" encoding="UTF-8"?>
<D:multistatus xmlns:APPLE="http://apple.com/ns/ical/" xmlns:CAL="urn:ietf:params:xml:ns:caldav"
xmlns:CS="http://calendarserver.org/ns/" xmlns:D="DAV:">
<D:response>
<D:href>/caldav/MzM/</D:href>
<D:propstat>
<D:prop>
<D:current-user-privilege-set>
<D:privilege>
<D:read-acl />
</D:privilege>
<D:privilege>
<D:read-current-user-privilege-set />
</D:privilege>
<D:privilege>
<D:read />
</D:privilege>
<D:privilege>
<D:write />
</D:privilege>
<D:privilege>
<D:write-content />
</D:privilege>
<D:privilege>
<D:write-properties />
</D:privilege>
<D:privilege>
<D:write-acl />
</D:privilege>
<D:privilege>
<D:bind />
</D:privilege>
<D:privilege>
<D:unbind />
</D:privilege>
</D:current-user-privilege-set>
<D:displayname>Tasks</D:displayname>
<D:current-user-principal>
<D:href>/principals/users/3</D:href>
</D:current-user-principal>
<calendar-color symbolic-color="custom" xmlns="http://apple.com/ns/ical/">
#CEE7FFFF
</calendar-color>
<D:invite>
<D:sharee>
<D:href>/principals/users/5</D:href>
<D:invite-accepted />
<D:share-access>read</D:share-access>
</D:sharee>
</D:invite>
<D:sync-token>1614876450015</D:sync-token>
<D:share-access>shared-owner</D:share-access>
<D:resourcetype>
<D:collection />
<CAL:calendar />
</D:resourcetype>
<supported-calendar-component-set xmlns="urn:ietf:params:xml:ns:caldav">
<CAL:comp name="VTODO" />
</supported-calendar-component-set>
<getctag xmlns="http://calendarserver.org/ns/">33-1614876450015</getctag>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
<D:propstat>
<D:prop>
<invite xmlns="http://owncloud.org/ns" />
<owner-principal xmlns="http://owncloud.org/ns" />
</D:prop>
<D:status>HTTP/1.1 404 NOT FOUND</D:status>
</D:propstat>
</D:response>
</D:multistatus>
""".trimIndent()
}
}

@ -41,7 +41,7 @@ class SharingOwncloudTest : CaldavTest() {
}
enqueue(OC_OWNER)
synchronizer.sync(account)
sync()
assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
}
@ -57,7 +57,7 @@ class SharingOwncloudTest : CaldavTest() {
}
enqueue(OC_READ_ONLY)
synchronizer.sync(account)
sync()
assertEquals(ACCESS_READ_ONLY, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
}
@ -73,7 +73,7 @@ class SharingOwncloudTest : CaldavTest() {
}
enqueue(OC_OWNER)
synchronizer.sync(account)
sync()
val principal = principalDao.getAll()
.apply { assertTrue(size == 1) }
@ -97,7 +97,7 @@ class SharingOwncloudTest : CaldavTest() {
}
enqueue(OC_READ_ONLY)
synchronizer.sync(account)
sync()
val principal = principalDao.getAll()
.apply { assertTrue(size == 1) }

@ -43,7 +43,7 @@ class SharingSabredavTest : CaldavTest() {
}
enqueue(SD_OWNER)
synchronizer.sync(account)
sync()
assertEquals(
ACCESS_OWNER,
@ -62,7 +62,7 @@ class SharingSabredavTest : CaldavTest() {
}
enqueue(SD_SHAREE)
synchronizer.sync(account)
sync()
assertEquals(
ACCESS_READ_WRITE,
@ -81,7 +81,7 @@ class SharingSabredavTest : CaldavTest() {
}
enqueue(SD_OWNER)
synchronizer.sync(account)
sync()
assertEquals(1, principalDao.getAll().size)
}
@ -97,7 +97,7 @@ class SharingSabredavTest : CaldavTest() {
}
enqueue(SD_OWNER)
synchronizer.sync(account)
sync()
val principal = principalDao.getAll().first()
@ -119,7 +119,7 @@ class SharingSabredavTest : CaldavTest() {
}
enqueue(SD_SHAREE)
synchronizer.sync(account)
sync()
val principal = principalDao.getAll()
.apply { assertTrue(size == 1) }

@ -323,8 +323,6 @@ class CaldavSynchronizer @Inject constructor(
prodId = ProdId("+//IDN tasks.org//android-" + BuildConfig.VERSION_CODE + "//EN")
}
private val MAILTO = "^mailto:".toRegex()
fun registerFactories() {
PropertyRegistry.register(
ShareAccess.Factory(),
@ -367,16 +365,15 @@ class CaldavSynchronizer @Inject constructor(
val principals = ArrayList<Principal>()
this[Invite::class.java]
?.sharees
?.filterNot { isCurrentUser(it.href) }
?.filter { it.href?.let { href -> !isCurrentUser(href) } ?: false }
?.map {
Principal().apply {
principal = it.href
it.properties.find { it is DisplayName }?.let { name ->
displayName = (name as DisplayName).displayName
?: it.href.replace(MAILTO, "")
}
inviteStatus = it.response.toStatus
access = it.access.access.toAccess
inviteStatus = it.response?.toStatus ?: INVITE_UNKNOWN
access = it.access?.access?.toAccess ?: ACCESS_UNKNOWN
}
}
?.let { principals.addAll(it) }

@ -9,11 +9,11 @@ import org.tasks.BuildConfig
import org.xmlpull.v1.XmlPullParser
class Sharee(parser: XmlPullParser) {
lateinit var href: String
var href: String? = null
private set
lateinit var access: ShareAccess
var access: ShareAccess? = null
private set
lateinit var response: Property.Name
var response: Property.Name? = null
private set
var comment: String? = null
private set

Loading…
Cancel
Save