Relax principal parsing

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

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

@ -1,10 +1,13 @@
package org.tasks.caldav package org.tasks.caldav
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import junit.framework.Assert.assertFalse
import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer import okhttp3.mockwebserver.MockWebServer
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.rules.Timeout
import org.tasks.R import org.tasks.R
import org.tasks.data.CaldavAccount import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
@ -22,6 +25,9 @@ abstract class CaldavTest : InjectingTestCase() {
protected val server = MockWebServer() protected val server = MockWebServer()
protected lateinit var account: CaldavAccount protected lateinit var account: CaldavAccount
@get:Rule
val globalTimeout: Timeout = Timeout.seconds(30)
@Before @Before
override fun setUp() { override fun setUp() {
super.setUp() super.setUp()
@ -33,6 +39,12 @@ abstract class CaldavTest : InjectingTestCase() {
@After @After
fun after() = server.shutdown() 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) { protected fun enqueue(vararg responses: String) {
responses.forEach { responses.forEach {
server.enqueue( 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) enqueue(OC_OWNER)
synchronizer.sync(account) sync()
assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access) assertEquals(ACCESS_OWNER, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
} }
@ -57,7 +57,7 @@ class SharingOwncloudTest : CaldavTest() {
} }
enqueue(OC_READ_ONLY) enqueue(OC_READ_ONLY)
synchronizer.sync(account) sync()
assertEquals(ACCESS_READ_ONLY, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access) assertEquals(ACCESS_READ_ONLY, caldavDao.getCalendarByUuid(calendar.uuid!!)?.access)
} }
@ -73,7 +73,7 @@ class SharingOwncloudTest : CaldavTest() {
} }
enqueue(OC_OWNER) enqueue(OC_OWNER)
synchronizer.sync(account) sync()
val principal = principalDao.getAll() val principal = principalDao.getAll()
.apply { assertTrue(size == 1) } .apply { assertTrue(size == 1) }
@ -97,7 +97,7 @@ class SharingOwncloudTest : CaldavTest() {
} }
enqueue(OC_READ_ONLY) enqueue(OC_READ_ONLY)
synchronizer.sync(account) sync()
val principal = principalDao.getAll() val principal = principalDao.getAll()
.apply { assertTrue(size == 1) } .apply { assertTrue(size == 1) }

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

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

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

Loading…
Cancel
Save