[SecurityFramework][Keychain] SecItemCopyMatching ne renvoie par de SecKeychainI

HollowManHollowMan Membre
04:57 modifié dans API AppKit #1
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 :

<br />&nbsp; &nbsp; NSMutableDictionary *query = [[[NSMutableDictionary alloc] init] autorelease]; // The rules dictionary<br />&nbsp; &nbsp; [query setObject:(id)kSecClassInternetPassword forKey:(id)kSecClass]; // We want only internet passswords<br />&nbsp; &nbsp; [query setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit]; // We want all of the matching passwords, so no limit<br />&nbsp; &nbsp; [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef]; // We want a ref to the SecKeychainItem (used later to retrieve the password)<br />&nbsp; &nbsp; [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes]; // We also want the attributes<br />&nbsp; &nbsp; [query setObject:(id)protocol forKey:(id)kSecAttrProtocol];<br />&nbsp; &nbsp; NSArray *keychainItems = nil;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // We request a list of all the password matching the defined rules<br />&nbsp; &nbsp; OSStatus err = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef*)&amp;keychainItems);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if ( err != noErr || keychainItems == nil )<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Error in Keychain access.&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; return nil;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Now we browse the results<br />&nbsp; &nbsp; NSMutableArray *result = [[[NSMutableArray alloc] init] autorelease];<br />&nbsp; &nbsp; for (NSDictionary *keychainItem in keychainItems)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSString *accountName = [keychainItem objectForKey:(id)kSecAttrAccount];<br />&nbsp; &nbsp; &nbsp; &nbsp; NSString *domainName = [keychainItem objectForKey:(id)kSecAttrServer];<br />&nbsp; &nbsp; &nbsp; &nbsp; NSDate *lastUpdate = [keychainItem objectForKey:(id)kSecAttrModificationDate];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; SecKeychainItemRef keychainItemRef = (SecKeychainItemRef)[keychainItem objectForKey:(id)kSecValueRef];<br /><br />&nbsp; &nbsp; &nbsp; // 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.

Réponses

  • AliGatorAliGator Membre, Modérateur
    04:57 modifié #2
    Tu veux dire que le OSStatus est bien égal à  noErr, que tu n'as pas d'erreur et un NSArray de NSDictionary qui t'es bien retourné, mais selon la plateforme ce NSDictionary n'a pas les mêmes clés ?
    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 ?
  • HollowManHollowMan Membre
    04:57 modifié #3
    J'ai effectivement fait ce test, et je n'ai pas la Ref, sous aucune clé...

    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).
Connectez-vous ou Inscrivez-vous pour répondre.