ea87fc9113f8
fix: Default private relay fields to wss scheme (v2.7.1)
- time
- 2026-07-27 21:26 UTC · 2 months ago
- machine
- koh2
- parent
- aeae7c03641f
↓ peach-android-ea87fc91.tar.gzatlas at this save
files changed5 files
app/build.gradle+2 −2app/src/main/java/com/peachpasswords/sync/RelaySettingsStore.kt+4 −0app/src/main/java/com/peachpasswords/ui/pairing/PairingRelayChoice.kt+4 −1app/src/main/java/com/peachpasswords/ui/settings/SettingsCardBodies.kt+5 −2app/src/test/java/com/peachpasswords/sync/RelaySettingsPropagationTest.kt+2 −0app/build.gradle+2 −2
@@ -16,8 +16,8 @@1616 applicationId "com.peachpasswords"1717 minSdk 261818 targetSdk 3519- versionCode 24012720- versionName "2.7.0"19+ versionCode 24012820+ versionName "2.7.1"2121 2222 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"2323 vectorDrawables {app/src/main/java/com/peachpasswords/sync/RelaySettingsStore.kt+4 −0
@@ -75,6 +75,10 @@7575 fun privateRelayUrlOf(storedRelayUrl: String): String =7676 storedRelayUrl.takeIf { it != Rendezvous.DEFAULT_RELAY_URL }.orEmpty()7777 78+/** The editable form always begins with the only accepted secure scheme. */79+fun privateRelayDraftOf(configuredPrivateUrl: String): String =80+ configuredPrivateUrl.ifBlank { "wss://" }81+7882 fun relayInForce(mode: SyncMode, storedRelayUrl: String): RelayDecision = when {7983 mode == SyncMode.OFF -> RelayDecision.Refuse(SyncOutcomeReason.SYNC_DISABLED)8084 isPrivateRelayUnconfigured(mode, storedRelayUrl) ->app/src/main/java/com/peachpasswords/ui/pairing/PairingRelayChoice.kt+4 −1
@@ -21,6 +21,7 @@2121 import androidx.compose.ui.unit.dp2222 import androidx.compose.ui.unit.sp2323 import com.peachpasswords.sync.SyncMode24+import com.peachpasswords.sync.privateRelayDraftOf2425 import com.peachpasswords.ui.theme.LocalPeachAccent2526 import com.peachpasswords.ui.theme.PeachSpacing2627 import com.peachpasswords.ui.theme.PeachType@@ -47,7 +48,9 @@4748 onSelectMode: (SyncMode) -> Unit,4849 onSavePrivateUrl: (String) -> Boolean,4950 ) {50- var draft by remember(configuredPrivateUrl) { mutableStateOf(configuredPrivateUrl) }51+ var draft by remember(configuredPrivateUrl) {52+ mutableStateOf(privateRelayDraftOf(configuredPrivateUrl))53+ }5154 var status by remember { mutableStateOf<String?>(null) }5255 5356 if (!expanded) {app/src/main/java/com/peachpasswords/ui/settings/SettingsCardBodies.kt+5 −2
@@ -33,6 +33,7 @@3333 import com.peachpasswords.shared.PeachClipboard3434 import com.peachpasswords.sync.SyncMode3535 import com.peachpasswords.sync.describeSyncOutcome36+import com.peachpasswords.sync.privateRelayDraftOf3637 import com.peachpasswords.sync.syncIndicator3738 import com.peachpasswords.sync.syncIndicatorLabel3839 import com.peachpasswords.ui.components.SyncIndicatorDot@@ -699,7 +700,9 @@699700 var rotateConfirmOpen by remember { mutableStateOf(false) }700701 var rotating by remember { mutableStateOf(false) }701702 var rotateError by remember { mutableStateOf<String?>(null) }702- var relayUrlDraft by remember(configuredRelayUrl) { mutableStateOf(configuredRelayUrl) }703+ var relayUrlDraft by remember(configuredRelayUrl) {704+ mutableStateOf(privateRelayDraftOf(configuredRelayUrl))705+ }703706 var relayUrlStatus by remember { mutableStateOf<String?>(null) }704707 var showConnection by remember { mutableStateOf(false) }705708 var showRecovery by remember { mutableStateOf(false) }@@ -865,7 +868,7 @@865868 ValueText(message, if (warn) peachColors.Breach else fg)866869 SubtleButton("save", fg) {867870 relayUrlStatus = if (syncVm.setRelayUrl(relayUrlDraft)) {868- relayUrlDraft = syncVm.privateRelayUrl.value871+ relayUrlDraft = privateRelayDraftOf(syncVm.privateRelayUrl.value)869872 "Saved"870873 } else {871874 "Use a valid wss:// relay URL"app/src/test/java/com/peachpasswords/sync/RelaySettingsPropagationTest.kt+2 −0
@@ -62,12 +62,14 @@6262 6363 assertEquals(SyncMode.PUBLIC, modeForRelayUrl(adopted))6464 assertEquals("", privateRelayUrlOf(adopted))65+ assertEquals("wss://", privateRelayDraftOf(privateRelayUrlOf(adopted)))6566 }6667 6768 @Test6869 fun `adoption over a private relay leaves the receiver reading that url`() {6970 assertEquals(SyncMode.PRIVATE, modeForRelayUrl(selfHosted))7071 assertEquals(selfHosted, privateRelayUrlOf(selfHosted))72+ assertEquals(selfHosted, privateRelayDraftOf(privateRelayUrlOf(selfHosted)))7173 // And the receiver is not stranded in the unconfigured-private state7274 // that would pause its sync.7375 assertEquals(