Merge branch 'fix/files-uses-your-flamenet-passphrase' into 'main'

Files asks for your Flamenet passphrase, not a second secret

See merge request paulhitt/flamenet-messenger-android!69
This commit was merged in pull request #96.
This commit is contained in:
Paul Hitt
2026-09-05 14:44:03 +00:00
3 changed files with 95 additions and 6 deletions
@@ -773,7 +773,7 @@ fun ColumnScope.AccountScreen(
Text("Files", fontWeight = FontWeight.Medium, fontSize = 16.sp)
Spacer(Modifier.height(Space.xs))
Text(
"Files encrypted on this phone, with a passphrase of their own. "
"Files encrypted on this phone, opened with your Flamenet passphrase. "
+ "Nothing is stored on a server.",
fontSize = 13.sp,
color = Palette.SecondaryText,
@@ -118,10 +118,22 @@ private fun ColumnScope.FilesSetUp(
var passphrase by remember { mutableStateOf("") }
var again by remember { mutableStateOf("") }
// 🔴 **"A passphrase of their own" told people to invent a second secret,
// and iOS never did.** iOS says "your passphrase" and takes whatever is
// typed, so a person naturally uses their Flamenet one and it simply
// works. Android's copy sent them off to make up something else, then
// asked for it again weeks later — and forgetting it is the one-way door
// described above this function.
//
// ⚠️ **Nothing about the derivation changes.** This is still a free-choice
// string protecting the identity record, so anyone who already set a
// different one keeps opening their files with it. Making the account
// passphrase the ACTUAL key would be a migration with permanent data loss
// on the far side of any mistake, and it is not what this fixes.
Text(
"Files on this phone are encrypted with a passphrase of their own. "
+ "Flamenet doesn't keep it, so nobody can open them by picking up "
+ "your unlocked phone.",
"Use your Flamenet passphrase — the one you sign in with. Files on "
+ "this phone are encrypted with it, and Flamenet keeps no copy, so "
+ "nobody can open them by picking up your unlocked phone.",
fontSize = 14.sp, color = Palette.SecondaryText,
)
Spacer(Modifier.height(Space.sm))
@@ -134,7 +146,7 @@ private fun ColumnScope.FilesSetUp(
OutlinedTextField(
value = passphrase, onValueChange = { passphrase = it },
label = { Text("Choose a passphrase") },
label = { Text("Your Flamenet passphrase") },
visualTransformation = PasswordVisualTransformation(),
singleLine = true,
modifier = Modifier.fillMaxWidth().testTag("files-new-passphrase"),
@@ -168,7 +180,10 @@ private fun ColumnScope.FilesUnlock(
) {
var passphrase by remember { mutableStateOf("") }
Text("Enter your Files passphrase to open them.",
// ⚠️ Not "your Files passphrase". That name implied a second secret even
// for somebody who had used their Flamenet one, and left them hunting for
// a passphrase they never set.
Text("Enter your Flamenet passphrase to open them.",
fontSize = 14.sp, color = Palette.SecondaryText)
Spacer(Modifier.height(Space.md))
OutlinedTextField(