Ignore HTTP 403 when the resource upload fails because of missing permissions (server will win)

This commit is contained in:
Ricki Hirner 2018-12-21 16:58:45 +01:00
parent 72749addcd
commit bc5f1e935e
5 changed files with 18 additions and 8 deletions

View file

@ -18,7 +18,7 @@ android {
defaultConfig {
applicationId "at.bitfire.davdroid"
versionCode 251
versionCode 252
buildConfigField "long", "buildTime", System.currentTimeMillis() + "L"
buildConfigField "boolean", "customCerts", "true"
@ -90,8 +90,8 @@ dependencies {
implementation 'org.apache.commons:commons-collections4:4.2'
// for tests
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test:rules:1.1.1'
androidTestImplementation 'junit:junit:4.12'
androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0'

View file

@ -170,7 +170,7 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
syncState = SyncState.fromSyncToken(result.first, initialSync)
furtherChanges = result.second
} catch(e: HttpException) {
if (e.errors.any { it.name == Property.Name(XmlUtils.NS_WEBDAV, "valid-sync-token") }) {
if (e.errors.contains(Error.VALID_SYNC_TOKEN)) {
Logger.log.info("Sync token invalid, performing initial sync")
initialSync = true
resetPresentRemotely()
@ -326,10 +326,20 @@ abstract class SyncManager<ResourceType: LocalResource<*>, out CollectionType: L
remote.put(body, local.eTag, false, processETag)
}
numUploaded++
} catch(e: ForbiddenException) {
// HTTP 403 Forbidden
// If and only if the upload failed because of missing permissions, treat it like 412.
if (e.errors.contains(Error.NEED_PRIVILEGES))
Logger.log.log(Level.INFO, "Couldn't upload because of missing permissions, ignoring", e)
else
throw e
} catch(e: ConflictException) {
// we can't interact with the user to resolve the conflict, so we treat 409 like 412
// HTTP 409 Conflict
// We can't interact with the user to resolve the conflict, so we treat 409 like 412.
Logger.log.log(Level.INFO, "Edit conflict, ignoring", e)
} catch(e: PreconditionFailedException) {
// HTTP 412 Precondition failed: Resource has been modified on the server in the meanwhile.
// Ignore this condition so that the resource can be downloaded and reset again.
Logger.log.log(Level.INFO, "Resource has been modified on the server before upload, ignoring", e)
}

View file

@ -8,7 +8,7 @@
buildscript {
ext.dokka_version = '0.9.17'
ext.kotlin_version = '1.3.10'
ext.kotlin_version = '1.3.11'
repositories {
jcenter()

@ -1 +1 @@
Subproject commit cad85fee5d0d3649df3e1cbc6a03c4a1645560d8
Subproject commit 2c7523be31985e683cedd342c48829dbee096c67

@ -1 +1 @@
Subproject commit 5b0cad59f2231b98185643e90edfa9af7ade53b4
Subproject commit e04df070148adaf4ddc454a97350ffe46280ee2b