2 // OAToken_KeychainExtensions.m
5 // Created by Jonathan Wight on 04/04/08.
6 // Modified by Cassie Doll on 02/02/09
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 #import "OAToken_KeychainExtensions.h"
27 #import "SFHFKeychainUtils.h"
29 @implementation OAToken (OAToken_KeychainExtensions)
32 - (NSError *)storeInDefaultKeychainWithAppName:(NSString *)name tokenType:(NSString *)type {
33 NSString *password = [NSString stringWithFormat:@"%@:::%@", self.key, self.secret];
36 [SFHFKeychainUtils storeUsername:type andPassword:password
37 forServiceName:name updateExisting:TRUE error:&error];
41 - (id)initWithKeychainUsingAppName:(NSString *)name tokenType:(NSString *)type {
44 NSString *password = [SFHFKeychainUtils getPasswordForUsername:type andServiceName:name error:nil];
46 if (!password || [password length] == 0) {
51 NSArray *components =[password componentsSeparatedByString:@":::"];
52 if (2 <= [components count]) {
53 self.key = [components objectAtIndex:0];
54 self.secret = [components objectAtIndex:1];
56 // TODO: this will fail if the key or the secret contain ':::'