Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
c37a6f5
fix(android): preserve queued upload scheduling
veryCrunchy Sep 1, 2026
017ac03
chore(changelog): link upload scheduling fix
veryCrunchy Sep 1, 2026
4706996
fix(android): restore queued uploads at startup
veryCrunchy Sep 1, 2026
f6c447d
fix(android): retain startup upload retries
veryCrunchy Sep 3, 2026
508eb69
fix(android): retain upload reconciliation after journal errors
veryCrunchy Sep 4, 2026
1ab9847
fix(android): defer uploads during credential recovery
veryCrunchy Sep 4, 2026
291f796
fix(uploads): skip WorkManager-owned recovery jobs
veryCrunchy Sep 4, 2026
f6f1ca9
fix(uploads): bound credential recovery retries
veryCrunchy Sep 4, 2026
01a43e8
fix(uploads): recover registry before worker rejection
veryCrunchy Sep 4, 2026
a75a06b
fix(uploads): keep credential recovery deferred
veryCrunchy Sep 4, 2026
8969213
fix(uploads): bound startup recovery diagnostics
veryCrunchy Sep 4, 2026
e2c0806
fix(uploads): wake failed scheduling recovery
veryCrunchy Sep 4, 2026
984982c
fix(uploads): wake recovery after worker failure
veryCrunchy Sep 5, 2026
6feb0d9
fix(uploads): close recovery wakeup races
veryCrunchy Sep 5, 2026
3b0c3f8
fix(uploads): centralize queued status recovery
veryCrunchy Sep 5, 2026
428514b
fix(uploads): back off worker recovery
veryCrunchy Sep 5, 2026
19aa454
fix(uploads): defer transient source failures
veryCrunchy Sep 5, 2026
4b51467
fix(uploads): fail permanently unavailable sources
veryCrunchy Sep 5, 2026
adfea37
fix(uploads): release cancelled unowned selections
veryCrunchy Sep 5, 2026
b413b94
fix(uploads): retry terminal capability cleanup
veryCrunchy Sep 5, 2026
4a1c61c
fix(uploads): retain pending capability cleanup
veryCrunchy Sep 5, 2026
2cdfd55
test(uploads): cover legacy cleanup marker
veryCrunchy Sep 5, 2026
0e2cb3e
fix(uploads): recover pending capability cleanup
veryCrunchy Sep 5, 2026
d7f9b4b
test(uploads): keep cleanup cancellation test void
veryCrunchy Sep 5, 2026
7c54894
fix(uploads): decouple terminal cleanup recovery
veryCrunchy Sep 5, 2026
c08afb5
fix(uploads): validate persisted cleanup marker
veryCrunchy Sep 5, 2026
5de864e
fix(uploads): run terminal cleanup offline
veryCrunchy Sep 5, 2026
f03c0fb
fix(uploads): preserve cleanup with corrupt registry
veryCrunchy Sep 5, 2026
06d3590
fix(uploads): retain unreadable capability metadata
veryCrunchy Sep 5, 2026
e2cd3e0
fix(uploads): clean cancelled picker grants
veryCrunchy Sep 5, 2026
baa3271
fix(uploads): release undelivered picker selections
veryCrunchy Sep 5, 2026
4a4eba7
fix(uploads): recover orphaned picker grants
veryCrunchy Sep 5, 2026
989b704
fix(uploads): preserve immediate recovery intent
veryCrunchy Sep 5, 2026
ff8222a
fix(uploads): enforce picker capability limit
veryCrunchy Sep 5, 2026
eba8536
fix(uploads): consume scheduling wakeups atomically
veryCrunchy Sep 5, 2026
29b63fd
fix(uploads): defer capability metadata read failures
veryCrunchy Sep 5, 2026
96e90b0
fix(uploads): reject malformed capability metadata
veryCrunchy Sep 5, 2026
9b60b71
fix(uploads): isolate malformed picker capabilities
veryCrunchy Sep 6, 2026
b20aceb
fix(uploads): protect owned malformed capabilities
veryCrunchy Sep 6, 2026
3af2a62
test(uploads): split account resolution coverage
veryCrunchy Sep 6, 2026
df6d4b2
fix(uploads): reject corrupt capability ciphertext
veryCrunchy Sep 6, 2026
d276894
refactor(platform): preserve service size boundary
veryCrunchy Sep 6, 2026
323ed12
chore(website): refresh marketing captures
obiente-automations[bot] Sep 6, 2026
97e529d
fix(uploads): bound capability recovery
veryCrunchy Sep 6, 2026
815a974
fix(uploads): coalesce terminal recovery
veryCrunchy Sep 6, 2026
94b3f5c
fix(uploads): quarantine unknowable capability cleanup
veryCrunchy Sep 6, 2026
f4216a3
fix(uploads): terminate quarantined cleanup
veryCrunchy Sep 6, 2026
d553758
fix(uploads): bound storage and preserve recovery backoff
veryCrunchy Sep 9, 2026
50db150
fix(uploads): finish stable malformed-peer cleanup
veryCrunchy Sep 9, 2026
2530237
fix(android): bound upload scheduling recovery passes
veryCrunchy Sep 9, 2026
c568dca
Merge branch 'fix/account-background-isolation' into fix/durable-uplo…
veryCrunchy Sep 9, 2026
1662b7a
test(android): group scheduling monitor regressions by owner
veryCrunchy Sep 9, 2026
9d2c9f0
fix(android): coalesce cleanup recovery self wakeups
veryCrunchy Sep 9, 2026
ce1c82a
chore(website): refresh marketing captures
obiente-automations[bot] Sep 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dev.obiente.nextcloudnative

import android.util.Base64
import androidx.test.ext.junit.runners.AndroidJUnit4
import javax.crypto.AEADBadTagException
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class SessionCipherInstrumentedTest {
@Test
fun invalidBase64EnvelopeIsDefinitivelyRejected() {
val failure = invalidCiphertextFailure("not-base64.invalid")

assertTrue(failure.cause is IllegalArgumentException)
}

@Test
fun authenticatedCiphertextCorruptionIsDefinitivelyRejected() {
val cipher = SessionCipher()
val encrypted = cipher.encrypt("private upload capability")
val parts = encrypted.split('.', limit = 2)
val payload = Base64.decode(parts[1], Base64.NO_WRAP).also { bytes ->
bytes[0] = (bytes[0].toInt() xor 1).toByte()
}
val corrupted = parts[0] + "." + Base64.encodeToString(payload, Base64.NO_WRAP)

val failure = invalidCiphertextFailure(corrupted)

assertTrue(failure.cause is AEADBadTagException)
}

private fun invalidCiphertextFailure(value: String): InvalidSessionCiphertextException = try {
SessionCipher().decrypt(value)
error("Corrupt ciphertext was accepted.")
} catch (failure: InvalidSessionCiphertextException) {
failure
}
}
Loading
Loading