@@ -6,6 +6,7 @@ import Foundation
66import Glean
77import Shared
88import Common
9+ import Security
910
1011import class MozillaAppServices. LoginsStorage
1112import class MozillaAppServices. MZKeychainWrapper
@@ -224,13 +225,33 @@ public class RustLoginEncryptionKeys {
224225 let canary = try createCanary ( text: canaryPhrase, encryptionKey: secret)
225226
226227 DispatchQueue . global ( qos: . background) . sync {
227- self . keychain. set ( secret,
228- forKey: self . loginPerFieldKeychainKey,
229- withAccessibility: MZKeychainItemAccessibility . afterFirstUnlock)
230- self . keychain. set ( canary,
231- forKey: self . canaryPhraseKey,
232- withAccessibility: MZKeychainItemAccessibility . afterFirstUnlock)
228+ let result = self . keychain. set ( secret,
229+ forKey: self . loginPerFieldKeychainKey,
230+ withAccessibility: MZKeychainItemAccessibility . afterFirstUnlock)
231+ self . logger. log ( " [issam] 0 createAndStoreKey set result " ,
232+ level: . warning,
233+ category: . storage,
234+ description: " \( result) " )
235+ if !result {
236+ let status = SecItemCopyMatching (
237+ setupKeychainQueryDictionary ( forKey: self . loginPerFieldKeychainKey) as CFDictionary , nil )
238+ self . logger. log ( " [issam] 000 Keychain SET FAILED - Status: \( status) Key: \( self . loginPerFieldKeychainKey) " )
239+ }
240+
241+ let result2 = self . keychain. set ( canary,
242+ forKey: self . canaryPhraseKey,
243+ withAccessibility: MZKeychainItemAccessibility . afterFirstUnlock)
244+ self . logger. log ( " [issam] 00 createAndStoreKey set result " ,
245+ level: . warning,
246+ category: . storage,
247+ description: " \( result2) " )
233248 }
249+
250+ let key = self . keychain. string ( forKey: self . loginPerFieldKeychainKey)
251+ self . logger. log ( " [issam] 1 createAndStoreKey " ,
252+ level: . warning,
253+ category: . storage,
254+ description: " \( key ?? " empty " ) " )
234255 return secret
235256 } catch let err as NSError {
236257 if let loginsStoreError = err as? LoginsStoreError {
@@ -605,9 +626,17 @@ public class RustLogins: LoginsProtocol, KeyManager {
605626 public func addLogin( login: LoginEntry ) -> Deferred < Maybe < String > > {
606627 let deferred = Deferred < Maybe < String > > ( )
607628
629+ self . logger. log ( " [issam] 0 Adding login " ,
630+ level: . warning,
631+ category: . storage,
632+ description: " xxxx " )
608633 queue. async {
609634 guard self . isOpen else {
610635 let error = LoginsStoreError . UnexpectedLoginsApiError ( reason: " Database is closed " )
636+ self . logger. log ( " [issam] 1 Adding login " ,
637+ level: . warning,
638+ category: . storage,
639+ description: error. descriptionValue)
611640
612641 deferred. fill ( Maybe ( failure: error as MaybeErrorType ) )
613642 return
@@ -620,9 +649,17 @@ public class RustLogins: LoginsProtocol, KeyManager {
620649 let id = try self . storage? . add ( login: login) . id
621650 deferred. fill ( Maybe ( success: id!) )
622651 } catch let err as NSError {
652+ self . logger. log ( " [issam] 2 Error adding login " ,
653+ level: . warning,
654+ category: . storage,
655+ description: err. localizedDescription)
623656 deferred. fill ( Maybe ( failure: err) )
624657 }
625658 case . failure( let err) :
659+ self . logger. log ( " [issam] 3 Error adding login " ,
660+ level: . warning,
661+ category: . storage,
662+ description: err. localizedDescription)
626663 deferred. fill ( Maybe ( failure: err) )
627664 }
628665 }
@@ -853,12 +890,25 @@ public class RustLogins: LoginsProtocol, KeyManager {
853890 private func getKeychainData( rustKeys: RustLoginEncryptionKeys ) -> ( String ? , String ? ) {
854891 var keychainData : ( String ? , String ? ) = ( nil , nil )
855892
893+ self . logger. log ( " [issam] 1 getKeychainData " ,
894+ level: . warning,
895+ category: . storage,
896+ description: " " )
897+
856898 DispatchQueue . global ( qos: . background) . sync {
857899 let key = rustKeys. keychain. string ( forKey: rustKeys. loginPerFieldKeychainKey)
858900 let encryptedCanaryPhrase = rustKeys. keychain. string ( forKey: rustKeys. canaryPhraseKey)
859901 keychainData = ( key, encryptedCanaryPhrase)
902+ self . logger. log ( " [issam] 2 getKeychainData " ,
903+ level: . warning,
904+ category: . storage,
905+ description: " \( keychainData. 0 ?? " empty " ) " )
860906 }
861907
908+ self . logger. log ( " [issam] 3 getKeychainData " ,
909+ level: . warning,
910+ category: . storage,
911+ description: " \( keychainData. 0 ?? " empty " ) " )
862912 return keychainData
863913 }
864914
@@ -937,27 +987,52 @@ public class RustLogins: LoginsProtocol, KeyManager {
937987 // call or the key data has been cleared from the keychain.
938988
939989 self . hasSyncedLogins ( ) . upon { result in
990+ self . logger. log ( " [issam] 0 getStoredKey " ,
991+ level: . warning,
992+ category: . storage,
993+ description: " " )
940994 guard result. failureValue == nil else {
941995 completion ( . failure( result. failureValue! as NSError ) )
942996 return
943997 }
998+ self . logger. log ( " [issam] 1 getStoredKey " ,
999+ level: . warning,
1000+ category: . storage,
1001+ description: " " )
9441002
9451003 guard let hasLogins = result. successValue else {
9461004 let msg = " Failed to verify logins count before attempting to reset key "
9471005 completion ( . failure( LoginEncryptionKeyError . dbRecordCountVerificationError ( msg) as NSError ) )
9481006 return
9491007 }
9501008
1009+ self . logger. log ( " [issam] 2 getStoredKey " ,
1010+ level: . warning,
1011+ category: . storage,
1012+ description: " " )
1013+
9511014 if hasLogins {
9521015 // Since the key data isn't present and we have login records in
9531016 // the database, we both clear the database and reset the key.
9541017 GleanMetrics . LoginsStoreKeyRegeneration. keychainDataLost. record ( )
1018+ self . logger. log ( " [issam] 3 getStoredKey " ,
1019+ level: . warning,
1020+ category: . storage,
1021+ description: " " )
9551022 self . resetLoginsAndKey ( rustKeys: rustKeys, completion: completion)
9561023 } else {
9571024 // There are no records in the database so we don't need to wipe any
9581025 // existing login records. We just need to create a new key.
9591026 do {
1027+ self . logger. log ( " [issam] 4 getStoredKey " ,
1028+ level: . warning,
1029+ category: . storage,
1030+ description: " " )
9601031 let key = try rustKeys. createAndStoreKey ( )
1032+ self . logger. log ( " [issam] 5 getStoredKey " ,
1033+ level: . warning,
1034+ category: . storage,
1035+ description: " \( key) " )
9611036 completion ( . success( key) )
9621037 } catch let error as NSError {
9631038 completion ( . failure( error) )
@@ -998,8 +1073,16 @@ public class RustLogins: LoginsProtocol, KeyManager {
9981073 */
9991074 public func getKey( ) throws -> Data {
10001075 let rustKeys = RustLoginEncryptionKeys ( )
1076+ let key1 = rustKeys. keychain. string ( forKey: rustKeys. loginPerFieldKeychainKey)
1077+ self . logger. log ( " [issam] 0 getKey " ,
1078+ level: . warning,
1079+ category: . storage,
1080+ description: " \( key1 ?? " empty " ) " )
10011081 let ( key, _) = getKeychainData ( rustKeys: rustKeys)
1002-
1082+ self . logger. log ( " [issam] 1 getKey " ,
1083+ level: . warning,
1084+ category: . storage,
1085+ description: " \( key ?? " empty " ) " )
10031086 guard let keyData = key? . data ( using: . utf8) else {
10041087 throw LoginsStoreError . MissingKey
10051088 }
0 commit comments