Files
Luma/Sources/Shared/Models/DeviceResource.swift
T
wt 9c8cff7168
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s
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.
2026-08-18 02:41:52 +07:00

31 lines
1.2 KiB
Swift

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