быстрое связывание ключей добавить, удалить, получить работу, обновление не работает - PullRequest
0 голосов
/ 15 февраля 2019

Я устраняю проблему с обновлениями связки ключей.У меня работают SecItemAdd, SecItemCopyMatching и SecItemDelete.Но я нахожусь в тупике на SecItemUpdate.Я всегда получаю -50 неудачу.

Я разместил общедоступный проект MacOS keychainTest на Github по адресу: https://github.com/darrellroot/keychainTest/blob/master/README.md

К вашему сведению, этот почти идентичный вопрос / ответ должен помочь мне, но это не так: Swift 4 Keychain SecItemUpdateКод состояния ошибки -50

Вот соответствующие фрагменты кода:

let keychainTest = "Keychain Test"
let serverHostname = "mail.nowhere.com"
let keychainService = "KeychainService"

AddQuery работает:

let addQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: keychainService,
kSecAttrAccount as String: serverHostname,
kSecValueData as String: inputTextOutlet.stringValue]
let status = SecItemAdd(addQuery as CFDictionary, nil)

GetQuery работает:

let getQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: keychainService,
kSecAttrAccount as String: serverHostname,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecReturnData as String: true]
var rawResult: AnyObject?
let status = SecItemCopyMatching(getQuery as CFDictionary, &rawResult)
statusLabel.stringValue = status.description        
guard let retrievedData = rawResult as? Data else { return }
guard let pass = String(data: retrievedData, encoding: String.Encoding.utf8) else { return }

DeleteQuery работает:

let deleteQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                  kSecAttrService as String: keychainService,
                                  kSecAttrAccount as String: serverHostname]
let status = SecItemDelete(deleteQuery as CFDictionary)
statusLabel.stringValue = status.description

Но для этого updateQuery я всегда получаю сообщение OSStatus -50:

let updateQuery: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                  kSecAttrService as String: keychainService,
                                  kSecAttrAccount as String: serverHostname]
 let newAttributes: [String: Any] = [kSecValueData as String: inputTextOutlet.stringValue]
 let status = SecItemUpdate(updateQuery as CFDictionary, newAttributes as CFDictionary)

для osstatus.com, -50 равно "Один или несколько параметров переданычтобы функция была недействительной. "

...