[SecurityFramework][Keychain] SecItemCopyMatching ne renvoie par de SecKeychainI
HollowMan
Membre
Bonjour à tous,
J'ai besoin de récupérer la liste des mots de passes du keychain pour une application sous Mac. Je procède donc de la manière suivante :
Ce code fonctionne parfaitement sous Mac OS X Lion, mais pas sous Snow Leopard. Dans le deuxième cas, je n'ai juste pas de clé kSecValueRef dans le dictionary retourné.
Ca a été testé en compilant depuis une machine sous Lion et depuis une autre sous Snow Leopard, les symptômes sont les mêmes.
Auriez-vous une idée de ce qui se passe ?
Merci par avance.
J'ai besoin de récupérer la liste des mots de passes du keychain pour une application sous Mac. Je procède donc de la manière suivante :
<br /> NSMutableDictionary *query = [[[NSMutableDictionary alloc] init] autorelease]; // The rules dictionary<br /> [query setObject:(id)kSecClassInternetPassword forKey:(id)kSecClass]; // We want only internet passswords<br /> [query setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit]; // We want all of the matching passwords, so no limit<br /> [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef]; // We want a ref to the SecKeychainItem (used later to retrieve the password)<br /> [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes]; // We also want the attributes<br /> [query setObject:(id)protocol forKey:(id)kSecAttrProtocol];<br /> NSArray *keychainItems = nil;<br /> <br /> // We request a list of all the password matching the defined rules<br /> OSStatus err = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef*)&keychainItems);<br /> <br /> if ( err != noErr || keychainItems == nil )<br /> {<br /> NSLog(@"Error in Keychain access.");<br /> return nil;<br /> }<br /> <br /> // Now we browse the results<br /> NSMutableArray *result = [[[NSMutableArray alloc] init] autorelease];<br /> for (NSDictionary *keychainItem in keychainItems)<br /> {<br /> NSString *accountName = [keychainItem objectForKey:(id)kSecAttrAccount];<br /> NSString *domainName = [keychainItem objectForKey:(id)kSecAttrServer];<br /> NSDate *lastUpdate = [keychainItem objectForKey:(id)kSecAttrModificationDate];<br /><br /> SecKeychainItemRef keychainItemRef = (SecKeychainItemRef)[keychainItem objectForKey:(id)kSecValueRef];<br /><br /> // Treat the output<br />}<br />
Ce code fonctionne parfaitement sous Mac OS X Lion, mais pas sous Snow Leopard. Dans le deuxième cas, je n'ai juste pas de clé kSecValueRef dans le dictionary retourné.
Ca a été testé en compilant depuis une machine sous Lion et depuis une autre sous Snow Leopard, les symptômes sont les mêmes.
Auriez-vous une idée de ce qui se passe ?
Merci par avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu as essayé de faire un [tt]NSLog(@item = %@", keychainItem);[/tt] pour voir les clés qu'il y a dans tes dictionary et les comparer entre SL et Lion ? Le nom de la clé a peut-être changé entre les 2 versions ?
J'ai aussi fait refait un test en enlevant le "kSecReturnAttributes" de mes clés de requête, c'est a dire que je demande uniquement la SecKeychainItemRef au framework. Dans ce cas, et toujours uniquement sous SL, l'appel à SecItemCopyMatching me renvoie NULL avec un OSStatus à -50 (ParamErr).