Skip to content

Commit

Permalink
add methods to accept arbitrary data and make string methods use dat…
Browse files Browse the repository at this point in the history
…a methods
  • Loading branch information
calebd committed Apr 28, 2012
1 parent 356eaf7 commit fbcadcc
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 10 deletions.
20 changes: 20 additions & 0 deletions SSKeychain.h
Expand Up @@ -185,6 +185,16 @@ extern NSString *const kSSKeychainWhereKey;
*/
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;

/**
*/
+ (NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account;

/**
*/
+ (NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;


///-------------------------
/// @name Deleting Passwords
Expand Down Expand Up @@ -255,6 +265,16 @@ extern NSString *const kSSKeychainWhereKey;
*/
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;

/**
*/
+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account;

/**
*/
+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error;


///--------------------
/// @name Configuration
Expand Down
36 changes: 26 additions & 10 deletions SSKeychain.m
Expand Up @@ -67,26 +67,31 @@ + (NSString *)passwordForService:(NSString *)service account:(NSString *)account


+ (NSString *)passwordForService:(NSString *)service account:(NSString *)account error:(NSError **)error {
NSData *data = [self passwordDataForService:service account:account error:error];
return ([data length]) ? [[[NSString alloc] initWithData:(NSData *)data encoding:NSUTF8StringEncoding] autorelease] : nil;
}


+ (NSData *)passwordDataForService:(NSString *)service account:(NSString *)account {
return [self passwordDataForService:service account:account error:nil];
}


+ (NSData *)passwordDataForService:(NSString *)service account:(NSString *)account error:(NSError **)error {
OSStatus status = SSKeychainErrorBadArguments;
NSString *result = nil;
NSData *result = nil;
if (service && account) {
CFDataRef data = NULL;
NSMutableDictionary *query = [self _queryForService:service account:account];
[query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
[query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&data);
if (status == noErr && CFDataGetLength(data) > 0) {
result = [[NSString alloc] initWithData:(NSData *)data encoding:NSUTF8StringEncoding];
}
if (data != NULL) { CFRelease(data); }
status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&result);
}
if (status != noErr && error != NULL) {
*error = [NSError errorWithDomain:kSSKeychainErrorDomain code:status userInfo:nil];
}
return [result autorelease];
}


#pragma mark - Deleting Passwords

+ (BOOL)deletePasswordForService:(NSString *)service account:(NSString *)account {
Expand Down Expand Up @@ -116,11 +121,22 @@ + (BOOL)setPassword:(NSString *)password forService:(NSString *)service account:


+ (BOOL)setPassword:(NSString *)password forService:(NSString *)service account:(NSString *)account error:(NSError **)error {
OSStatus status = SSKeychainErrorBadArguments;
NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
return [self setPasswordData:data forService:service account:account error:error];
}


+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)service account:(NSString *)account {
return [self setPasswordData:password forService:service account:account error:nil];
}


+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)service account:(NSString *)account error:(NSError **)error {
OSStatus status = SSKeychainErrorBadArguments;
if (password && service && account) {
[self deletePasswordForService:service account:account];
NSMutableDictionary *query = [self _queryForService:service account:account];
[query setObject:[password dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
[query setObject:password forKey:(id)kSecValueData];

#if __IPHONE_4_0 && TARGET_OS_IPHONE
if (SSKeychainAccessibilityType) {
Expand Down

0 comments on commit fbcadcc

Please sign in to comment.