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
5 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 −0
app/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 {

view file

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) ->

view file

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) {

view file

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"

view file

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(

view file