Remove machine-writing tells from comments and docs
Emoji markers, markdown bold inside code comments, and em-dashes are gone from source comments, string literals, scripts, Gradle files and the markdown docs. Counted before and after: emoji markers 2680 -> 1 (the emoji picker's own list, which is the feature) em-dashes 2490 -> 9 (table placeholders and fenced code) Two warning glyphs in user-facing strings in ChatScreens.kt are removed as well; the sentences say the same thing without them. Two backtick test names carried an em-dash and now carry a comma. Nothing else changed. 1208 tests pass, counted from the result XML. The three obfs4 interop tests are opted out with OBFS4_INTEROP_OPTOUT=1 for this run, as their own message instructs when no bridge is set up. CONTRIBUTING gets a four-line rule so it does not grow back. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
04e06452b6
commit
4dd544083c
@@ -70,12 +70,12 @@ class VaultTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔴 **The chain a re-establishment replaces must survive it.**
|
||||
* The chain a re-establishment replaces must survive it.
|
||||
*
|
||||
* Both sides open the chat at once, so each runs X3DH before seeing the
|
||||
* other's prekey and each adopts the other's chain to read what arrived.
|
||||
* From then on the peer sends on the chain being replaced. A client that
|
||||
* stored only the newest session could not open any of it — silently,
|
||||
* stored only the newest session could not open any of it, silently,
|
||||
* because an envelope that will not decrypt is skipped, not reported.
|
||||
*
|
||||
* This is the storage half of the fix. `E2ESessionTest` covers the engine
|
||||
@@ -105,28 +105,28 @@ class VaultTest {
|
||||
vault.saveRetiredSession(bob.deviceId, vault.loadSession(bob.deviceId)!!)
|
||||
vault.saveSession(bob.deviceId, adopted)
|
||||
|
||||
// Alice is still on the chain Bob started — she answers on it.
|
||||
// Alice is still on the chain Bob started, she answers on it.
|
||||
val onTheRetiredChain = E2ESession.respond(alice, bobsFirst)
|
||||
assertEquals("from bob", onTheRetiredChain.decrypt(bobsFirst))
|
||||
val reply = onTheRetiredChain.encrypt("bob, this is the old chain")
|
||||
|
||||
val fresh = Vault(storage, secret)
|
||||
assertNull(runCatching { fresh.loadSession(bob.deviceId)!!.decrypt(reply) }.getOrNull(),
|
||||
"the adopted session must NOT open the retired chain — otherwise this " +
|
||||
"the adopted session must NOT open the retired chain, otherwise this " +
|
||||
"test would pass without the retired copy existing at all")
|
||||
assertEquals("bob, this is the old chain",
|
||||
fresh.loadRetiredSession(bob.deviceId)!!.decrypt(reply))
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔴 **A failed decrypt damages the session object it was handed, so the
|
||||
* **A failed decrypt damages the session object it was handed, so the
|
||||
* thing that gets retired must be re-read from the vault.**
|
||||
*
|
||||
* This is the bug the first version of the retirement fix shipped with, and
|
||||
* the reason `a retired session is kept and still opens its chain` did not
|
||||
* catch it: that test retires a PRISTINE session, which is not what the
|
||||
* receive path has in its hand. The real path has just proved the peer is on
|
||||
* another chain — by handing this session an envelope it could not open —
|
||||
* another chain, by handing this session an envelope it could not open,
|
||||
* and `E2ESession` is a class, so that attempt consumed skipped keys and
|
||||
* stepped the chain. Retiring THAT instance stores something that can no
|
||||
* longer open anything, which looks exactly like not retiring at all.
|
||||
@@ -165,7 +165,7 @@ class VaultTest {
|
||||
Vault(wrong, secret).loadRetiredSession(bob.deviceId)!!
|
||||
.decrypt(alicesReplyOnBobsChain)
|
||||
}.getOrNull(),
|
||||
"a session damaged by a failed decrypt should NOT still open its chain — " +
|
||||
"a session damaged by a failed decrypt should NOT still open its chain, " +
|
||||
"if this ever starts passing, the hazard is gone and this test can go")
|
||||
|
||||
// Re-reading the vault copy keeps it. This is the fix.
|
||||
@@ -176,7 +176,7 @@ class VaultTest {
|
||||
.decrypt(alicesReplyOnBobsChain))
|
||||
}
|
||||
|
||||
/** Signing out must take the retired chains too — they hold chain keys. */
|
||||
/** Signing out must take the retired chains too, they hold chain keys. */
|
||||
@Test
|
||||
fun `forgetting sessions forgets the retired ones as well`() {
|
||||
val storage = MapStorage()
|
||||
@@ -210,7 +210,7 @@ class VaultTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* ⚠️ The failure this catches: a stored blob moved from one slot to
|
||||
* The failure this catches: a stored blob moved from one slot to
|
||||
* another. Without the name in the AAD, a peer's session pasted into a
|
||||
* different peer's slot decrypts perfectly and the app attributes their
|
||||
* messages to the wrong person.
|
||||
@@ -251,9 +251,9 @@ class VaultTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* ⚠️ A corrupt identity must NOT read as "no identity". The caller treats
|
||||
* A corrupt identity must NOT read as "no identity". The caller treats
|
||||
* null as a new install and mints a fresh device, which every contact sees
|
||||
* as "security keys changed" — the warning that is supposed to mean an
|
||||
* as "security keys changed", the warning that is supposed to mean an
|
||||
* attack. Absent and unreadable are different answers.
|
||||
*/
|
||||
@Test
|
||||
@@ -319,18 +319,18 @@ class VaultTest {
|
||||
// ---- Trust records and the platform's JSON ---------------------------
|
||||
|
||||
/**
|
||||
* 🔴 **A contact with no known address must come back with NO address.**
|
||||
* A contact with no known address must come back with NO address.
|
||||
*
|
||||
* `saveTrust` used to write `"fnid": null` explicitly, and Android's
|
||||
* bundled `org.json` reads a JSON null back as the four-character string
|
||||
* `"null"` — a non-null value that is not an address. `Trust.pin` compares a
|
||||
* `"null"`, a non-null value that is not an address. `Trust.pin` compares a
|
||||
* newly offered fnid against the pinned one and treats a difference as a
|
||||
* different person, so the first time a real address arrived the contact was
|
||||
* marked **CHANGED**: the "security keys changed" warning, which is meant to
|
||||
* marked CHANGED: the "security keys changed" warning, which is meant to
|
||||
* mean an attack, fired on an ordinary first sighting.
|
||||
*
|
||||
* ⚠️ The JVM's `org.json` returns `""` there, so this passed on a laptop and
|
||||
* failed on a phone. The two tests below cover both halves — what is
|
||||
* The JVM's `org.json` returns `""` there, so this passed on a laptop and
|
||||
* failed on a phone. The two tests below cover both halves, what is
|
||||
* written now, and what has to be tolerated because it is already on
|
||||
* devices in the field.
|
||||
*/
|
||||
@@ -345,7 +345,7 @@ class VaultTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* ⚠️ **This is the test that reproduces the device**, and the one above is
|
||||
* This is the test that reproduces the device, and the one above is
|
||||
* not. On the JVM a real JSON null reads back as `""` whether the writer
|
||||
* omits the key or not, so the round trip above passes with the bug intact.
|
||||
* Handing the reader the literal string is what Android actually does, so
|
||||
@@ -354,8 +354,8 @@ class VaultTest {
|
||||
|
||||
@Test
|
||||
fun `a record already holding the literal string null reads as no address`() {
|
||||
// 🔴 Records written the old way exist on phones already. The reader has
|
||||
// to repair them, or those contacts stay permanently mis-addressed —
|
||||
// Records written the old way exist on phones already. The reader has
|
||||
// to repair them, or those contacts stay permanently mis-addressed,
|
||||
// `rememberIdentity` returns early once `fnid != null`, so nothing would
|
||||
// ever ask again.
|
||||
val storage = MapStorage()
|
||||
|
||||
Reference in New Issue
Block a user