Handle empty linked device names

This commit is contained in:
Elaine 2026-01-26 15:26:26 -05:00 committed by GitHub
parent 207023272a
commit 47cbfce8e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 17 additions and 10 deletions

View File

@ -994,6 +994,7 @@ class EditDeviceNameViewController: NameEditorViewController {
override class var nameByteLimit: Int { 225 }
override class var nameGlyphLimit: Int { 50 }
override var allowEmptyName: Bool { false }
override var placeholderText: String? {
OWSLocalizedString(
"SECONDARY_ONBOARDING_CHOOSE_DEVICE_NAME_PLACEHOLDER",

View File

@ -19,6 +19,7 @@ class NameEditorViewController: OWSTableViewController2 {
class var nameByteLimit: Int { owsFail("Must be implemented by subclasses") }
class var nameGlyphLimit: Int { owsFail("Must be implemented by subclasses") }
var allowEmptyName: Bool { true }
var placeholderText: String? { nil }
private lazy var nameField = OWSTextField(
@ -31,7 +32,7 @@ class NameEditorViewController: OWSTableViewController2 {
self.updateHasUnsavedChanges()
},
returnPressed: { [unowned self] in
if hasUnsavedChanges { self.didTapDone() }
if canSaveChanges { self.didTapDone() }
},
)
@ -63,7 +64,7 @@ class NameEditorViewController: OWSTableViewController2 {
if isPresentedInSheet {
self.navigationItem.leftBarButtonItem = .cancelButton(
dismissingFrom: self,
hasUnsavedChanges: { [unowned self] in self.hasUnsavedChanges },
hasUnsavedChanges: { [unowned self] in self.canSaveChanges },
)
}
self.navigationItem.rightBarButtonItem = .doneButton { [unowned self] in self.didTapDone() }
@ -98,20 +99,23 @@ class NameEditorViewController: OWSTableViewController2 {
}
override var isModalInPresentation: Bool {
get { hasUnsavedChanges }
get { canSaveChanges }
set {}
}
private func updateHasUnsavedChanges() {
self.hasUnsavedChanges = self.nameField.text != self.oldName
let hasUnsavedChanges = self.nameField.text != self.oldName
let hasUnallowedEmptyName = !self.allowEmptyName && self.nameField.text.isEmptyOrNil
self.navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges && !hasUnallowedEmptyName
}
private var hasUnsavedChanges: Bool = false {
private var canSaveChanges: Bool = false {
didSet {
if oldValue == hasUnsavedChanges {
if oldValue == canSaveChanges {
return
}
self.navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges
self.navigationItem.rightBarButtonItem?.isEnabled = canSaveChanges
}
}

View File

@ -10,6 +10,7 @@ public import LibSignalClient
public enum OWSDeviceNameError: Error {
case assertionFailure
case invalidInput
case emptyName
case cryptError(_ description: String)
}
@ -98,8 +99,7 @@ public enum OWSDeviceNames {
throw OWSDeviceNameError.assertionFailure
}
guard ciphertext.count > 0 else {
owsFailDebug("Invalid cipher text.")
throw OWSDeviceNameError.assertionFailure
throw OWSDeviceNameError.emptyName
}
// master_secret = ECDH(identity_private, ephemeral_public)

View File

@ -154,9 +154,11 @@ struct OWSDeviceServiceImpl: OWSDeviceService {
base64String: nameCiphertext,
identityKeyPair: identityKeyPair,
)
} catch OWSDeviceNameError.emptyName {
name = nil
} catch {
owsFailDebug("Failed to decrypt device name! Is this a legacy device name? \(error)")
name = nameCiphertext
name = nil
}
} else {
name = nil