Разграничете сесийните и системните елементи в ключодържателя на Mac OS X

Как мога да направя запитване до ключодържателя на Mac OS X, за да извлека само елементи от сесията?

Когато се опитам да получа всички елементи като този:

[SSKeychain accountsForService:nil];

Елементът на сесията и системният елемент имат абсолютно еднакви атрибути за ключовете: acct, cdat, class, crtr, labl, mdat, svce

Как можете да направите запитване до ключодържателя, за да получите само елементи от сесията или да ги разграничите?

Благодаря ти за помощта !


person malinois    schedule 06.08.2013    source източник


Отговори (2)


Можете да направите заявка за паролата на сесията по следния начин (заменете kSecMatchLimitOne с kSecMatchLimitAll, ако имате нужда от всички пароли. attributes ще има CFArrayRef тип в този случай):

NSDictionary* passwordQuery = @{
    (__bridge id)kSecAttrService : sessionServiceName,
    (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
    (__bridge id)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
    (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,
    (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne
};

CFTypeRef attributes = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)passwordQuery, &attributes);
if (status != 0){
    return nil;
 }
person Sergiy Salyuk    schedule 08.08.2013
comment
Вече имам всички елементи, но искам само елементи от сесията, а не системни елементи - person malinois; 09.08.2013
comment
Ох добре. Тогава (вероятно) използването на валиден kSecAttrService по време на създаването на елемент е единственият начин да намерите такива елементи по-късно. Току-що проверих моята система (OS X 10.8) и получих много различни стойности за атрибути на акаунт (Safari, AirPort и т.н.). Така че като опция можете да създадете списък със стандартни услуги и след това да ги филтрирате. - person Sergiy Salyuk; 12.08.2013
comment
Намерих, проверете отговора ми - person malinois; 16.08.2013

Открих, като отворих потребителския ключодържател:

NSArray *path = [NSHomeDirectory() pathComponents];
NSString *keychainPath = [NSString stringWithFormat:@"%@%@/%@%@",path[0],path[1],path[2],@"/Library/Keychains/login.keychain"];
SecKeychainRef ref = NULL;
SecKeychainOpen([keychainPath UTF8String],&ref);
person malinois    schedule 15.08.2013