Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

95 lines (76 sloc) 3.181 kb
//
// OAToken_KeychainExtensions.m
// TouchTheFireEagle
//
// Created by Jonathan Wight on 04/04/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "OAToken_KeychainExtensions.h"
@implementation OAToken (OAToken_KeychainExtensions)
- (id)initWithKeychainUsingAppName:(NSString *)name serviceProviderName:(NSString *)provider
{
[super init];
SecKeychainItemRef item;
NSString *serviceName = [NSString stringWithFormat:@"%@::OAuth::%@", name, provider];
OSStatus status = SecKeychainFindGenericPassword(NULL,
strlen([serviceName UTF8String]),
[serviceName UTF8String],
0,
NULL,
NULL,
NULL,
&item);
if (status != noErr) {
return nil;
}
// from Advanced Mac OS X Programming, ch. 16
UInt32 length;
char *password;
SecKeychainAttribute attributes[8];
SecKeychainAttributeList list;
attributes[0].tag = kSecAccountItemAttr;
attributes[1].tag = kSecDescriptionItemAttr;
attributes[2].tag = kSecLabelItemAttr;
attributes[3].tag = kSecModDateItemAttr;
list.count = 4;
list.attr = attributes;
status = SecKeychainItemCopyContent(item, NULL, &list, &length, (void **)&password);
if (status == noErr) {
self.key = [NSString stringWithCString:list.attr[0].data
length:list.attr[0].length];
if (password != NULL) {
char passwordBuffer[1024];
if (length > 1023) {
length = 1023;
}
strncpy(passwordBuffer, password, length);
passwordBuffer[length] = '\0';
self.secret = [NSString stringWithCString:passwordBuffer];
}
SecKeychainItemFreeContent(&list, password);
} else {
// TODO find out why this always works in i386 and always fails on ppc
NSLog(@"Error from SecKeychainItemCopyContent: %d", status);
return nil;
}
NSMakeCollectable(item);
return self;
}
- (int)storeInDefaultKeychainWithAppName:(NSString *)name serviceProviderName:(NSString *)provider
{
return [self storeInKeychain:NULL appName:name serviceProviderName:provider];
}
- (int)storeInKeychain:(SecKeychainRef)keychain appName:(NSString *)name serviceProviderName:(NSString *)provider
{
OSStatus status = SecKeychainAddGenericPassword(keychain,
[name length] + [provider length] + 9,
[[NSString stringWithFormat:@"%@::OAuth::%@", name, provider] UTF8String],
[self.key length],
[self.key UTF8String],
[self.secret length],
[self.secret UTF8String],
NULL
);
return status;
}
@end
Jump to Line
Something went wrong with that request. Please try again.