Skip to content

Commit

Permalink
Merge branch 'refs/heads/main' into 162-take-care-of-ical4j-dependenc…
Browse files Browse the repository at this point in the history
…ies-security
  • Loading branch information
ArnyminerZ committed Aug 14, 2024
2 parents dfd5d12 + 1d9c510 commit 99d3316
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import org.junit.Assert.assertTrue
import org.junit.Test

class DmfsTaskListTest(providerName: TaskProvider.ProviderName):
AbstractTasksTest(providerName) {
AbstractTasksTest(providerName) {

private val testAccount = Account("AndroidTaskListTest", TaskContract.LOCAL_ACCOUNT_TYPE)

Expand All @@ -34,10 +34,10 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName):
info.put(TaskContract.TaskLists.SYNC_ENABLED, 1)
info.put(TaskContract.TaskLists.VISIBLE, 1)

val uri = DmfsTaskList.create(testAccount, provider, info)
val uri = DmfsTaskList.create(testAccount, provider.client, providerName, info)
assertNotNull(uri)

return DmfsTaskList.findByID(testAccount, provider, TestTaskList.Factory, ContentUris.parseId(uri))
return DmfsTaskList.findByID(testAccount, provider.client, providerName, TestTaskList.Factory, ContentUris.parseId(uri))
}


Expand Down Expand Up @@ -80,7 +80,7 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName):
val parentId = ContentUris.parseId(parentContentUri)

// OpenTasks should provide the correct relation
taskList.provider.client.query(taskList.tasksPropertiesSyncUri(), null,
taskList.provider.query(taskList.tasksPropertiesSyncUri(), null,
"${Properties.TASK_ID}=?", arrayOf(childId.toString()),
null, null)!!.use { cursor ->
assertEquals(1, cursor.count)
Expand All @@ -99,7 +99,7 @@ class DmfsTaskListTest(providerName: TaskProvider.ProviderName):
taskList.touchRelations()

// now parent_id should bet set
taskList.provider.client.query(childContentUri, arrayOf(Tasks.PARENT_ID),
taskList.provider.query(childContentUri, arrayOf(Tasks.PARENT_ID),
null, null, null)!!.use { cursor ->
assertTrue(cursor.moveToNext())
assertEquals(parentId, cursor.getLong(0))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package at.bitfire.ical4android.impl

import android.accounts.Account
import android.content.ContentProviderClient
import android.content.ContentUris
import android.content.ContentValues
import at.bitfire.ical4android.DmfsTaskList
Expand All @@ -14,29 +15,33 @@ import org.dmfs.tasks.contract.TaskContract

class TestTaskList(
account: Account,
provider: TaskProvider,
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
id: Long
): DmfsTaskList<TestTask>(account, provider, TestTask.Factory, id) {
): DmfsTaskList<TestTask>(account, provider, providerName, TestTask.Factory, id) {

companion object {

fun create(account: Account, provider: TaskProvider): TestTaskList {
fun create(
account: Account,
provider: TaskProvider,
): TestTaskList {
val values = ContentValues(4)
values.put(TaskContract.TaskListColumns.LIST_NAME, "Test Task List")
values.put(TaskContract.TaskListColumns.LIST_COLOR, 0xffff0000)
values.put(TaskContract.TaskListColumns.SYNC_ENABLED, 1)
values.put(TaskContract.TaskListColumns.VISIBLE, 1)
val uri = DmfsTaskList.create(account, provider, values)
val uri = DmfsTaskList.create(account, provider.client, provider.name, values)

return TestTaskList(account, provider, ContentUris.parseId(uri))
return TestTaskList(account, provider.client, provider.name, ContentUris.parseId(uri))
}

}


object Factory: DmfsTaskListFactory<TestTaskList> {
override fun newInstance(account: Account, provider: TaskProvider, id: Long) =
TestTaskList(account, provider, id)
override fun newInstance(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, id: Long) =
TestTaskList(account, provider, providerName, id)
}

}
12 changes: 6 additions & 6 deletions lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ abstract class DmfsTask(
val id = requireNotNull(id)

try {
val client = taskList.provider.client
val client = taskList.provider
client.query(taskSyncURI(true), null, null, null, null)?.use { cursor ->
if (cursor.moveToFirst()) {
// create new Task which will be populated
Expand Down Expand Up @@ -161,7 +161,7 @@ abstract class DmfsTask(
task.sequence = values.getAsInteger(Tasks.SYNC_VERSION)
task.summary = values.getAsString(Tasks.TITLE)
task.location = values.getAsString(Tasks.LOCATION)
task.userAgents += taskList.provider.name.packageName
task.userAgents += taskList.providerName.packageName

values.getAsString(Tasks.GEO)?.let { geo ->
val (lng, lat) = geo.split(',')
Expand Down Expand Up @@ -330,7 +330,7 @@ abstract class DmfsTask(


fun add(): Uri {
val batch = BatchOperation(taskList.provider.client)
val batch = BatchOperation(taskList.provider)

val builder = CpoBuilder.newInsert(taskList.tasksSyncUri())
buildTask(builder, false)
Expand All @@ -350,7 +350,7 @@ abstract class DmfsTask(
this.task = task
val existingId = requireNotNull(id)

val batch = BatchOperation(taskList.provider.client)
val batch = BatchOperation(taskList.provider)

// remove associated rows which are added later again
batch.enqueue(CpoBuilder
Expand All @@ -367,7 +367,7 @@ abstract class DmfsTask(
insertProperties(batch, null)

batch.commit()
return ContentUris.withAppendedId(taskList.provider.tasksUri(), existingId)
return ContentUris.withAppendedId(Tasks.getContentUri(taskList.providerName.authority), existingId)
}

protected open fun insertProperties(batch: BatchOperation, idxTask: Int?) {
Expand Down Expand Up @@ -472,7 +472,7 @@ abstract class DmfsTask(
}

fun delete(): Int {
return taskList.provider.client.delete(taskSyncURI(), null, null)
return taskList.provider.delete(taskSyncURI(), null, null)
}

@CallSuper
Expand Down
51 changes: 28 additions & 23 deletions lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package at.bitfire.ical4android

import android.accounts.Account
import android.content.ContentProviderClient
import android.content.ContentUris
import android.content.ContentValues
import android.net.Uri
Expand All @@ -27,7 +28,8 @@ import java.util.logging.Logger
*/
abstract class DmfsTaskList<out T : DmfsTask>(
val account: Account,
val provider: TaskProvider,
val provider: ContentProviderClient,
val providerName: TaskProvider.ProviderName,
val taskFactory: DmfsTaskFactory<T>,
val id: Long
) {
Expand All @@ -37,30 +39,32 @@ abstract class DmfsTaskList<out T : DmfsTask>(
private val logger
get() = Logger.getLogger(DmfsTaskList::class.java.name)

fun create(account: Account, provider: TaskProvider, info: ContentValues): Uri {
fun create(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, info: ContentValues): Uri {
info.put(TaskContract.ACCOUNT_NAME, account.name)
info.put(TaskContract.ACCOUNT_TYPE, account.type)

logger.log(Level.FINE, "Creating ${provider.name.authority} task list", info)
return provider.client.insert(provider.taskListsUri().asSyncAdapter(account), info)
val url = TaskLists.getContentUri(providerName.authority).asSyncAdapter(account)
logger.log(Level.FINE, "Creating ${providerName.authority} task list", info)
return provider.insert(url, info)
?: throw CalendarStorageException("Couldn't create task list (empty result from provider)")
}

fun <T : DmfsTaskList<DmfsTask>> findByID(
account: Account,
provider: TaskProvider,
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
factory: DmfsTaskListFactory<T>,
id: Long
): T {
provider.client.query(
ContentUris.withAppendedId(provider.taskListsUri(), id).asSyncAdapter(account),
provider.query(
ContentUris.withAppendedId(TaskLists.getContentUri(providerName.authority), id).asSyncAdapter(account),
null,
null,
null,
null
)?.use { cursor ->
if (cursor.moveToNext()) {
val taskList = factory.newInstance(account, provider, id)
val taskList = factory.newInstance(account, provider, providerName, id)
taskList.populate(cursor.toValues())
return taskList
}
Expand All @@ -70,14 +74,15 @@ abstract class DmfsTaskList<out T : DmfsTask>(

fun <T : DmfsTaskList<DmfsTask>> find(
account: Account,
provider: TaskProvider,
factory: DmfsTaskListFactory<T>,
provider: ContentProviderClient,
providerName: TaskProvider.ProviderName,
where: String?,
whereArgs: Array<String>?
): List<T> {
val taskLists = LinkedList<T>()
provider.client.query(
provider.taskListsUri().asSyncAdapter(account),
provider.query(
TaskLists.getContentUri(providerName.authority).asSyncAdapter(account),
null,
where,
whereArgs,
Expand All @@ -86,7 +91,7 @@ abstract class DmfsTaskList<out T : DmfsTask>(
while (cursor.moveToNext()) {
val values = cursor.toValues()
val taskList =
factory.newInstance(account, provider, values.getAsLong(TaskLists._ID))
factory.newInstance(account, provider, providerName, values.getAsLong(TaskLists._ID))
taskList.populate(values)
taskLists += taskList
}
Expand All @@ -110,7 +115,7 @@ abstract class DmfsTaskList<out T : DmfsTask>(
* Called when an instance is created from a tasks provider data row, for example
* using [find].
*
* @param info values from tasks provider
* @param values values from tasks provider
*/
@CallSuper
protected open fun populate(values: ContentValues) {
Expand All @@ -122,8 +127,8 @@ abstract class DmfsTaskList<out T : DmfsTask>(
}

fun update(info: ContentValues): Int {
logger.log(Level.FINE, "Updating ${provider.name.authority} task list (#$id)", info)
return provider.client.update(taskListSyncUri(), info, null, null)
logger.log(Level.FINE, "Updating ${providerName.authority} task list (#$id)", info)
return provider.update(taskListSyncUri(), info, null, null)
}

/**
Expand All @@ -132,8 +137,8 @@ abstract class DmfsTaskList<out T : DmfsTask>(
* @return `true` if the calendar was deleted, `false` otherwise (like it was not there before the call)
*/
fun delete(): Boolean {
logger.log(Level.FINE, "Deleting ${provider.name.authority} task list (#$id)")
return provider.client.delete(taskListSyncUri(), null, null) > 0
logger.log(Level.FINE, "Deleting ${providerName.authority} task list (#$id)")
return provider.delete(taskListSyncUri(), null, null) > 0
}

/**
Expand All @@ -158,8 +163,8 @@ abstract class DmfsTaskList<out T : DmfsTask>(
*/
fun touchRelations(): Int {
logger.fine("Touching relations to set parent_id")
val batchOperation = BatchOperation(provider.client)
provider.client.query(
val batchOperation = BatchOperation(provider)
provider.query(
tasksSyncUri(true), null,
"${Tasks.LIST_ID}=? AND ${Tasks.PARENT_ID} IS NULL AND ${Relation.MIMETYPE}=? AND ${Relation.RELATED_ID} IS NOT NULL",
arrayOf(id.toString(), Relation.CONTENT_ITEM_TYPE),
Expand Down Expand Up @@ -194,7 +199,7 @@ abstract class DmfsTaskList<out T : DmfsTask>(
val whereArgs = (_whereArgs ?: arrayOf()) + id.toString()

val tasks = LinkedList<T>()
provider.client.query(
provider.query(
tasksSyncUri(),
null,
where, whereArgs, null
Expand All @@ -210,10 +215,10 @@ abstract class DmfsTaskList<out T : DmfsTask>(


fun taskListSyncUri() =
ContentUris.withAppendedId(provider.taskListsUri(), id).asSyncAdapter(account)
ContentUris.withAppendedId(TaskLists.getContentUri(providerName.authority), id).asSyncAdapter(account)

fun tasksSyncUri(loadProperties: Boolean = false): Uri {
val uri = provider.tasksUri().asSyncAdapter(account)
val uri = Tasks.getContentUri(providerName.authority).asSyncAdapter(account)
return if (loadProperties)
uri.buildUpon()
.appendQueryParameter(TaskContract.LOAD_PROPERTIES, "1")
Expand All @@ -222,6 +227,6 @@ abstract class DmfsTaskList<out T : DmfsTask>(
uri
}

fun tasksPropertiesSyncUri() = provider.propertiesUri().asSyncAdapter(account)
fun tasksPropertiesSyncUri() = TaskContract.Properties.getContentUri(providerName.authority).asSyncAdapter(account)

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
package at.bitfire.ical4android

import android.accounts.Account
import android.content.ContentProviderClient

interface DmfsTaskListFactory<out T: DmfsTaskList<DmfsTask>> {

fun newInstance(account: Account, provider: TaskProvider, id: Long): T
fun newInstance(account: Account, provider: ContentProviderClient, providerName: TaskProvider.ProviderName, id: Long): T

}

0 comments on commit 99d3316

Please sign in to comment.