ページ

2010年3月13日土曜日

Keychain Services 調査 (13) コーディング #2 パスワードを取得する(拒否した場合)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(前回)Cocoaの日々: Keychain Services 調査 (12) コーディング #2 パスワードを取得する

前回の補足。パスワード取得時のダイアログで「拒否」を選択した場合。



SecKeychainFindGenericPassword の実行結果でエラーコード -25293 が返る。

Mac Dev Center: Keychain Services Reference によると:
errSecAuthFailed–25293
Authorization/Authentication failed.
Available in Mac OS X v10.2 and later.
手抜きせずちゃんとエラー処理を入れておく(といっても簡易)。


-(NSString*)getPasswordWithServiceName:(NSString*)serviceName accountName:(NSString*)accountName
{
OSStatus status;
const char *serviceNameUTF8 = [serviceName UTF8String];
const char *accountNameUTF8 = [accountName UTF8String];
void *passwordData = nil;
UInt32 passwordLength;
SecKeychainItemRef *itemRef = nil;

status = SecKeychainFindGenericPassword(NULL,
strlen(serviceNameUTF8),
serviceNameUTF8,
strlen(accountNameUTF8),
accountNameUTF8,
&passwordLength,
&passwordData,
itemRef);

NSString* password = nil;
if (status == errSecSuccess) {
password = [NSString stringWithUTF8String:passwordData];

status = SecKeychainItemFreeContent(NULL, passwordData);
} else {
NSLog(@"ERROR:SecKeychainFindGenericPassword:%d", status);
}
return password;
}


認証失敗と該当パスワードが見つからなかった場合のそれぞれの区別がついた方が良いかもしれない。