fix MAM history loading, multi-device resource, and OMEMO self-session
Multi-device: - Add DeviceResource with a stable per-install UUID-based resource (Luma-<hex>) persisted in UserDefaults and migrated from legacy "Luma". - AccountConfiguration.effectiveResource falls back to DeviceResource.default for a blank or legacy resource; LoginView defaults resource to "" with an auto placeholder. - Prevents two devices from sharing the same full JID resource and kicking each other off the stream (the "xmpp stream error" conflict). MAM / history: - loadOlderHistory now always issues the RSM page request instead of deferring, so scrolling up reliably loads older messages. - Track interactive history mutations separately so live messages are not dropped while an older-history page is decoding. - ChatView: replace the unreliable GeometryReader/preference scroll trigger with onAppear/onDisappear on a top sentinel; auto-load the first page when the conversation is empty. - AppModel: reset hasMoreOlderHistory for empty conversations and clear isLoadingOlderHistory on disconnect. - Decode own/duplicate/notEncrypted messages to decryption-failed/plaintext placeholders instead of dropping them, so every MAM stanza is collected. OMEMO: - Remove the encrypt-to-self setup that built a Signal session with the local device (cryptographically invalid), which caused an endless "Bad MAC" loop and a stream of undecryptable messages in the self-chat. - Add LumaOMEMOStore.removeSessionWithOwnDevice() and call it on connect to purge any self-session persisted by the previous build. Tests: - Update AccountConfigurationTests for the unique resource and add coverage for legacy-resource migration and explicit-resource preservation.
This commit is contained in:
1 parent
0b4a552044
commit
9c8cff7168
9 files changed
+235
-141
No files matched your search
@@ -0,0 +1,30 @@
|
||||
import Foundation
|
||||
|
||||
/// Stable, per-installation XMPP resource. Two devices that both fall back to
|
||||
/// the default must never share a resource: an XMPP server resolves a resource
|
||||
/// collision with a `conflict` stream error, which disconnects the older
|
||||
/// session. A UUID persisted in UserDefaults keeps the value stable across
|
||||
/// launches (so presence and stream-management resume stay consistent) while
|
||||
/// remaining distinct between macOS and iOS installs.
|
||||
enum DeviceResource {
|
||||
/// The legacy hard-coded default that older Luma builds sent from every
|
||||
/// device. Treated as "automatic" so existing accounts migrate without the
|
||||
/// user having to re-enter credentials.
|
||||
static let legacyDefault = "Luma"
|
||||
|
||||
private static let storageKey = "app.luma.xmpp.resource"
|
||||
|
||||
static var `default`: String {
|
||||
let defaults = UserDefaults.standard
|
||||
if let existing = defaults.string(forKey: storageKey), !existing.isEmpty {
|
||||
return existing
|
||||
}
|
||||
let suffix = UUID().uuidString
|
||||
.replacingOccurrences(of: "-", with: "")
|
||||
.prefix(8)
|
||||
.lowercased()
|
||||
let resource = "Luma-\(suffix)"
|
||||
defaults.set(resource, forKey: storageKey)
|
||||
return resource
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user