From 88334f969fa158e1f89f6f9297b38966929e3674 Mon Sep 17 00:00:00 2001 From: Mouhcine Date: Fri, 17 Jan 2014 20:00:40 +0100 Subject: [PATCH 001/139] Implemented Meetup provider --- .../SimpleAuthMeetupLoginViewController.h | 13 ++ .../SimpleAuthMeetupLoginViewController.m | 38 ++++++ Providers/Meetup/SimpleAuthMeetupProvider.h | 13 ++ Providers/Meetup/SimpleAuthMeetupProvider.m | 124 ++++++++++++++++++ SimpleAuth.xcodeproj/project.pbxproj | 20 +++ 5 files changed, 208 insertions(+) create mode 100644 Providers/Meetup/SimpleAuthMeetupLoginViewController.h create mode 100644 Providers/Meetup/SimpleAuthMeetupLoginViewController.m create mode 100644 Providers/Meetup/SimpleAuthMeetupProvider.h create mode 100644 Providers/Meetup/SimpleAuthMeetupProvider.m diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.h b/Providers/Meetup/SimpleAuthMeetupLoginViewController.h new file mode 100644 index 0000000..f868124 --- /dev/null +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthMeetupLoginViewController.h +// SimpleAuth +// +// Created by Mouhcine El Amine on 17/01/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthMeetupLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m new file mode 100644 index 0000000..ca65c16 --- /dev/null +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m @@ -0,0 +1,38 @@ +// +// SimpleAuthMeetupLoginViewController.m +// SimpleAuth +// +// Created by Mouhcine El Amine on 17/01/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthMeetupLoginViewController.h" +#import "SimpleAuth.h" + +#import + +@implementation SimpleAuthMeetupLoginViewController + +#pragma mark - UIViewController + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + NSDictionary *parameters = @{@"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token", + @"scope" : @"ageless"}; + NSString *URLString = [NSString stringWithFormat:@"https://secure.meetup.com/oauth2/authorize?%@", [parameters sam_stringWithFormEncodedComponents]]; + [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; +} + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options { + self = [super initWithOptions:options]; + if (self) { + self.title = @"Meetup"; + } + return self; +} + +@end diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.h b/Providers/Meetup/SimpleAuthMeetupProvider.h new file mode 100644 index 0000000..3d5a3be --- /dev/null +++ b/Providers/Meetup/SimpleAuthMeetupProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthMeetupProvider.h +// SimpleAuth +// +// Created by Mouhcine El Amine on 17/01/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthMeetupProvider : SimpleAuthProvider + +@end diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m new file mode 100644 index 0000000..c763b12 --- /dev/null +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -0,0 +1,124 @@ +// +// SimpleAuthMeetupProvider.m +// SimpleAuth +// +// Created by Mouhcine El Amine on 17/01/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthMeetupProvider.h" +#import "SimpleAuthMeetupLoginViewController.h" + +#import "UIViewController+SimpleAuthAdditions.h" + +#import + +@implementation SimpleAuthMeetupProvider + +#pragma mark - NSObject + ++ (void)load { + @autoreleasepool { + [SimpleAuth registerProviderClass:self]; + } +} + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"meetup"; +} + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; + navigationController.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presentedViewController = [UIViewController sa_presentedViewController]; + [presentedViewController presentViewController:navigationController + animated:YES + completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id viewController) { + [viewController dismissViewControllerAnimated:YES + completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return options; +} + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + SimpleAuthMeetupLoginViewController *loginViewController = [[SimpleAuthMeetupLoginViewController alloc] initWithOptions:self.options]; + loginViewController.completion = ^(UIViewController *viewController, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(viewController); + + NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:[URL fragment]]; + NSString *token = dictionary[@"access_token"]; + if ([token length] > 0) { + NSDictionary *credentials = @{@"token": token, + @"type" : @"bearer", + @"expireDate" : [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expires_in"] doubleValue]]}; + [self userWithCredentials:credentials + completion:completion]; + } else { + completion(nil, error); + } + }; + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(loginViewController); +} + +#pragma mark - Private + +- (void)userWithCredentials:(NSDictionary *)credentials completion:(SimpleAuthRequestHandler)completion { + NSString *query = [@{ @"member_id" : @"self"} sam_stringWithFormEncodedComponents]; + NSString *URLString = [NSString stringWithFormat:@"https://api.meetup.com/2/members?%@", query]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]]; + [request setValue:[NSString stringWithFormat:@"Bearer %@", credentials[@"token"]] forHTTPHeaderField:@"Authorization"]; + [NSURLConnection sendAsynchronousRequest:request + queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError; + NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data + options:kNilOptions + error:&parseError]; + if (responseDictionary) { + NSDictionary *rawInfo = [responseDictionary[@"results"] firstObject]; + completion ([self dictionaryWithAccount:rawInfo credentials:credentials], nil); + } else { + completion(nil, parseError); + } + } else { + completion(nil, connectionError); + } + }]; +} + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account + credentials:(NSDictionary *)credentials +{ + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + dictionary[@"provider"] = [[self class] type]; + dictionary[@"credentials"] = [NSDictionary dictionaryWithDictionary:credentials]; + dictionary[@"uid"] = account[@"id"]; + dictionary[@"raw_info"] = account; + NSMutableDictionary *user = [NSMutableDictionary dictionary]; + user[@"name"] = account[@"name"]; + NSDictionary *photoDictionary = account[@"photo"]; + if (photoDictionary) { + user[@"image"] = photoDictionary[@"photo_link"]; + } + return dictionary; +} + +@end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index f6d5750..caf935f 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -25,6 +25,8 @@ 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */; }; 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; + 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; + 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; /* End PBXBuildFile section */ @@ -81,6 +83,10 @@ 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+SimpleAuthAdditions.m"; sourceTree = ""; }; 3C611F46183535A400D87E45 /* UIViewController+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+SimpleAuthAdditions.h"; sourceTree = ""; }; 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+SimpleAuthAdditions.m"; sourceTree = ""; }; + 4D149A3F1889B3DF0024639C /* SimpleAuthMeetupProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupProvider.h; path = Meetup/SimpleAuthMeetupProvider.h; sourceTree = ""; }; + 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; + 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; + 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -110,6 +116,7 @@ 3B52BB8E1887088400C73329 /* Twitter */, 3B8C408B18879296007DC578 /* TwitterWeb */, 3B52BB96188731A300C73329 /* Instagram */, + 4D149A3E1889B38C0024639C /* Meetup */, ); path = Providers; sourceTree = ""; @@ -263,6 +270,17 @@ name = Categories; sourceTree = ""; }; + 4D149A3E1889B38C0024639C /* Meetup */ = { + isa = PBXGroup; + children = ( + 4D149A3F1889B3DF0024639C /* SimpleAuthMeetupProvider.h */, + 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */, + 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */, + 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */, + ); + name = Meetup; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -390,12 +408,14 @@ buildActionMask = 2147483647; files = ( 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, + 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, + 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */, 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, From cbf163ef8a12ea9103246be6650b8b43888e89d5 Mon Sep 17 00:00:00 2001 From: Mouhcine Date: Fri, 17 Jan 2014 20:06:15 +0100 Subject: [PATCH 002/139] Added Meetup to demo app --- SimpleAuthDemo/SADAppDelegate.m | 3 +++ SimpleAuthDemo/SADProviderListViewController.m | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index 0072723..0318797 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -51,6 +51,9 @@ - (void)configureAuthorizaionProviders { // app_id is required SimpleAuth.configuration[@"facebook"] = @{}; + + // client_id and redirect_uri are required + SimpleAuth.configuration[@"meetup"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 12dd167..67ba137 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -46,7 +46,8 @@ + (NSArray *)providers { @"twitter", @"twitter-web", @"facebook", - @"instagram" + @"instagram", + @"meetup" ]; }); return array; From 94ec33f4958b75c91bdc6b9e3e5eb6c83325fe81 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 17 Jan 2014 13:43:30 -0800 Subject: [PATCH 003/139] Update readme. --- Readme.markdown | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 538122b..37fc638 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -9,11 +9,16 @@ SimpleAuth currently has the following providers: - Instagram - Twitter web -I also have plans to provide: +I would like to have: - Twitter xauth +- Tumblr xauth +- GitHub +- Foursquare +- Dropbox +- App Dot Net - Facebook web -- Tumblr +- Tumblr web ## Installing From ffdf5cda9b13ba6cea4612ba50d21612da74540b Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 17 Jan 2014 17:11:38 -0800 Subject: [PATCH 004/139] Add Meetup provider subspec. --- SimpleAuth.podspec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 42f11b1..de1a904 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -47,4 +47,11 @@ Pod::Spec.new do |s| ss.dependency 'cocoa-oauth' end + + s.subspec 'Meetup' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/Meetup/**/*.{h,m}' + ss.frameworks = 'UIKit' + end end \ No newline at end of file From 4f92e8455b8f881f7bf1efc3072e499b46466ba6 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 19 Jan 2014 19:48:07 -0800 Subject: [PATCH 005/139] Add Meetup provider to readme. --- Readme.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/Readme.markdown b/Readme.markdown index 37fc638..58d8f02 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -8,6 +8,7 @@ SimpleAuth currently has the following providers: - Twitter (system) - Instagram - Twitter web +- Meetup I would like to have: From ea2db0aacbe903d22d79280b7291da5215d07ce8 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 16 Jan 2014 17:06:11 -0800 Subject: [PATCH 006/139] Begin adding tumblr authentication. --- .../SimpleAuthTumblrLoginViewController.h | 15 + .../SimpleAuthTumblrLoginViewController.m | 49 ++++ Providers/Tumblr/SimpleAuthTumblrProvider.h | 13 + Providers/Tumblr/SimpleAuthTumblrProvider.m | 266 ++++++++++++++++++ SimpleAuth.podspec | 9 + SimpleAuth.xcodeproj/project.pbxproj | 20 ++ SimpleAuthDemo/SADAppDelegate.m | 5 +- .../SADProviderListViewController.m | 3 +- 8 files changed, 378 insertions(+), 2 deletions(-) create mode 100644 Providers/Tumblr/SimpleAuthTumblrLoginViewController.h create mode 100644 Providers/Tumblr/SimpleAuthTumblrLoginViewController.m create mode 100644 Providers/Tumblr/SimpleAuthTumblrProvider.h create mode 100644 Providers/Tumblr/SimpleAuthTumblrProvider.m diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h new file mode 100644 index 0000000..20b3fc6 --- /dev/null +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h @@ -0,0 +1,15 @@ +// +// SimpleAuthTumblrLoginViewController.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/16/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthTumblrLoginViewController : SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken; + +@end diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m new file mode 100644 index 0000000..0580c4a --- /dev/null +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -0,0 +1,49 @@ +// +// SimpleAuthTumblrLoginViewController.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/16/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthTumblrLoginViewController.h" + +#import + +@interface SimpleAuthTumblrLoginViewController () + +@property (nonatomic, copy) NSDictionary *requestToken; + +@end + +@implementation SimpleAuthTumblrLoginViewController + +#pragma mark - UIViewController + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + NSDictionary *parameters = @{ + @"oauth_token" : self.requestToken[@"oauth_token"], + }; + NSString *URLString = [NSString stringWithFormat: + @"http://www.tumblr.com/oauth/authorize?%@", + [parameters sam_stringWithFormEncodedComponents]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [self.webView loadRequest:request]; +} + + +#pragma mark - Public + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options])) { + self.requestToken = requestToken; + self.title = @"tumblr"; + } + return self; +} + +@end diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.h b/Providers/Tumblr/SimpleAuthTumblrProvider.h new file mode 100644 index 0000000..6cab224 --- /dev/null +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthTumblrProvider.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/16/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthTumblrProvider : SimpleAuthProvider + +@end diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m new file mode 100644 index 0000000..c1e7a5b --- /dev/null +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -0,0 +1,266 @@ +// +// SimpleAuthTumblrProvider.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/16/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "SimpleAuthTumblrProvider.h" +#import "SimpleAuthTumblrLoginViewController.h" + +#import "UIViewController+SimpleAuthAdditions.h" + +#import +#import +#import + +@implementation SimpleAuthTumblrProvider + +#pragma mark - NSObject + ++ (void)load { + @autoreleasepool { + [SimpleAuth registerProviderClass:self]; + } +} + + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"tumblr"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController sa_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + dictionary[SimpleAuthRedirectURIKey] = @"simple-auth://tumblr.auth"; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[[[self requestToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [RACSignal return:response], + [self authenticateWithRequestToken:response] + ]; + return [RACSignal zip:signals]; + }] + flattenMap:^(RACTuple *response) { + return [self accessTokenWithRequestToken:response.first authenticationResponse:response.second]; + }] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(id x) { + NSLog(@"%@", x); + } + error:^(NSError *error) { + NSLog(@"%@", error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)requestToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"oauth_callback" : self.options[SimpleAuthRedirectURIKey] }; + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/oauth/request_token" + POSTParameters:parameters + scheme:@"https" + host:@"www.tumblr.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:nil + tokenSecret:nil]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthTumblrLoginViewController *login = [[SimpleAuthTumblrLoginViewController alloc] initWithOptions:self.options requestToken:requestToken]; + + login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; + block(controller); + + // Parse URL + NSString *query = [URL query]; + NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:query]; + NSString *token = dictionary[@"oauth_token"]; + NSString *verifier = dictionary[@"oauth_verifier"]; + + // Check for error + if (![token length] || ![verifier length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithRequestToken:(NSDictionary *)requestToken authenticationResponse:(NSDictionary *)authenticationResponse { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"oauth_verifier" : authenticationResponse[@"oauth_verifier"] }; + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/oauth/access_token" + POSTParameters:parameters + scheme:@"https" + host:@"www.tumblr.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:authenticationResponse[@"oauth_token"] + tokenSecret:requestToken[@"oauth_token_secret"]]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSDictionary *dictinoary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; + [subscriber sendNext:dictinoary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/v2/user/info" + GETParameters:nil + scheme:@"https" + host:@"api.tumblr.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:accessToken[@"oauth_token"] + tokenSecret:accessToken[@"oauth_token_secret"]]; + [NSURLConnection + sendAsynchronousRequest:request + queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"oauth_token"], + @"secret" : accessToken[@"oauth_token_secret"] + }; + + // User ID +// dictionary[@"uid"] = account[@"id"]; + + // Extra + dictionary[@"extra"] = @{ + @"raw_info" : account, + }; + +// // Profile image +// NSString *avatar = account[@"profile_image_url_https"]; +// avatar = [avatar stringByReplacingOccurrencesOfString:@"_normal" withString:@""]; +// +// // URLs +// NSMutableDictionary *URLs = [NSMutableDictionary dictionary]; +// URLs[@"Twitter"] = [NSString stringWithFormat:@"https://twitter.com/%@", account[@"screen_name"]]; +// if (account[@"url"]) { +// URLs[@"Website"] = account[@"url"]; +// } +// +// // User info +// NSMutableDictionary *user = [NSMutableDictionary new]; +// user[@"nickname"] = account[@"screen_name"]; +// user[@"name"] = account[@"name"]; +// user[@"location"] = account[@"location"]; +// user[@"image"] = avatar; +// user[@"description"] = account[@"description"]; +// user[@"urls"] = URLs; +// dictionary[@"info"] = user; + + return dictionary; +} + +@end diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index de1a904..97e71eb 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -54,4 +54,13 @@ Pod::Spec.new do |s| ss.source_files = 'Providers/Meetup/**/*.{h,m}' ss.frameworks = 'UIKit' end + + s.subspec 'Tumblr' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/Tumblr/**/*.{h,m}' + ss.frameworks = 'UIKit' + + ss.dependency 'cocoa-oauth' + end end \ No newline at end of file diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index caf935f..17bc167 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 3B65843D188892FE00D59100 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3B65843C188892FE00D59100 /* Images.xcassets */; }; 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584571888931F00D59100 /* SADProviderListViewController.m */; }; 3B65845C188895E400D59100 /* libSimpleAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */; }; + 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */; }; + 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */; }; 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; @@ -65,6 +67,10 @@ 3B658443188892FE00D59100 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3B6584571888931F00D59100 /* SADProviderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SADProviderListViewController.m; sourceTree = ""; }; 3B6584591888933200D59100 /* SADProviderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADProviderListViewController.h; sourceTree = ""; }; + 3B65845E1888A94200D59100 /* SimpleAuthTumblrProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrProvider.h; sourceTree = ""; }; + 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrProvider.m; sourceTree = ""; }; + 3B6584611888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrLoginViewController.h; sourceTree = ""; }; + 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrLoginViewController.m; sourceTree = ""; }; 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebProvider.h; sourceTree = ""; }; 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebProvider.m; sourceTree = ""; }; 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebLoginViewController.h; sourceTree = ""; }; @@ -117,6 +123,7 @@ 3B8C408B18879296007DC578 /* TwitterWeb */, 3B52BB96188731A300C73329 /* Instagram */, 4D149A3E1889B38C0024639C /* Meetup */, + 3B65845D1888A93200D59100 /* Tumblr */, ); path = Providers; sourceTree = ""; @@ -174,6 +181,17 @@ name = "Supporting Files"; sourceTree = ""; }; + 3B65845D1888A93200D59100 /* Tumblr */ = { + isa = PBXGroup; + children = ( + 3B65845E1888A94200D59100 /* SimpleAuthTumblrProvider.h */, + 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */, + 3B6584611888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.h */, + 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */, + ); + path = Tumblr; + sourceTree = ""; + }; 3B8C408B18879296007DC578 /* TwitterWeb */ = { isa = PBXGroup; children = ( @@ -410,10 +428,12 @@ 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, + 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, + 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */, diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index 0318797..d8bac8b 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -51,9 +51,12 @@ - (void)configureAuthorizaionProviders { // app_id is required SimpleAuth.configuration[@"facebook"] = @{}; - + // client_id and redirect_uri are required SimpleAuth.configuration[@"meetup"] = @{}; + + // consumer_key and consumer_secret are required + SimpleAuth.configuration[@"tumblr"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 67ba137..6fa4dc7 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -47,7 +47,8 @@ + (NSArray *)providers { @"twitter-web", @"facebook", @"instagram", - @"meetup" + @"meetup", + @"tumblr" ]; }); return array; From 6d1247d267c4d4bf4bd12f3db622b0efae9b159d Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 19 Jan 2014 20:36:43 -0800 Subject: [PATCH 007/139] Update readme. --- Readme.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 58d8f02..1f28392 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -7,8 +7,9 @@ SimpleAuth currently has the following providers: - Facebook (system) - Twitter (system) - Instagram -- Twitter web +- Twitter (web) - Meetup +- Tumblr I would like to have: @@ -18,8 +19,7 @@ I would like to have: - Foursquare - Dropbox - App Dot Net -- Facebook web -- Tumblr web +- Facebook (web) ## Installing From 433d52f4a6820bb49e28c3eecef0742f38b0b2ae Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 19 Jan 2014 21:01:01 -0800 Subject: [PATCH 008/139] Finish Tumblr provider. --- Providers/Tumblr/SimpleAuthTumblrProvider.m | 42 ++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index c1e7a5b..fc2c719 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -203,6 +203,7 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { NSError *parseError = nil; NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; if (dictionary) { + dictionary = dictionary[@"response"][@"user"]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } @@ -232,33 +233,32 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD }; // User ID -// dictionary[@"uid"] = account[@"id"]; + dictionary[@"uid"] = account[@"name"]; // Extra dictionary[@"extra"] = @{ @"raw_info" : account, }; -// // Profile image -// NSString *avatar = account[@"profile_image_url_https"]; -// avatar = [avatar stringByReplacingOccurrencesOfString:@"_normal" withString:@""]; -// -// // URLs -// NSMutableDictionary *URLs = [NSMutableDictionary dictionary]; -// URLs[@"Twitter"] = [NSString stringWithFormat:@"https://twitter.com/%@", account[@"screen_name"]]; -// if (account[@"url"]) { -// URLs[@"Website"] = account[@"url"]; -// } -// -// // User info -// NSMutableDictionary *user = [NSMutableDictionary new]; -// user[@"nickname"] = account[@"screen_name"]; -// user[@"name"] = account[@"name"]; -// user[@"location"] = account[@"location"]; -// user[@"image"] = avatar; -// user[@"description"] = account[@"description"]; -// user[@"urls"] = URLs; -// dictionary[@"info"] = user; + // Blogs + NSArray *blogs = account[@"blogs"]; + blogs = [[blogs.rac_sequence map:^(NSDictionary *dictionary) { + return [dictionary dictionaryWithValuesForKeys:@[ @"name", @"url", @"title" ]]; + }] array]; + + // Profile image + NSString *blogURLString = blogs[0][@"url"]; + NSURL *blogURL = [NSURL URLWithString:blogURLString]; + NSString *host = [blogURL host]; + NSString *avatar = [NSString stringWithFormat:@"https://api.tumblr.com/v2/blog/%@/avatar", host]; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"nickname"] = account[@"name"]; + user[@"name"] = account[@"name"]; + user[@"blogs"] = blogs; + user[@"image"] = avatar; + dictionary[@"info"] = user; return dictionary; } From 0b22c35dc762fe3b28d9e8aa6f14e8007b753891 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 19 Jan 2014 21:33:06 -0800 Subject: [PATCH 009/139] Better load mechanism. --- .../Facebook/SimpleAuthFacebookProvider.m | 9 ----- .../Instagram/SimpleAuthInstagramProvider.m | 9 ----- Providers/Meetup/SimpleAuthMeetupProvider.m | 8 ---- Providers/Tumblr/SimpleAuthTumblrProvider.m | 9 ----- Providers/Twitter/SimpleAuthTwitterProvider.m | 9 ----- .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 7 ---- SimpleAuth/SimpleAuth.h | 10 ----- SimpleAuth/SimpleAuth.m | 39 +++++++++++++++++++ SimpleAuth/SimpleAuthProvider.m | 1 - 9 files changed, 39 insertions(+), 62 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 3baa9ab..a568c0b 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -13,15 +13,6 @@ @implementation SimpleAuthFacebookProvider -#pragma mark - NSObject - -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - - #pragma mark - SimpleAuthProvider + (NSString *)type { diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index f23588c..f5bfee2 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -16,15 +16,6 @@ @implementation SimpleAuthInstagramProvider -#pragma mark - NSObject - -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - - #pragma mark - SimpleAuthProvider + (NSString *)type { diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index c763b12..6e8f5d3 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -15,14 +15,6 @@ @implementation SimpleAuthMeetupProvider -#pragma mark - NSObject - -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - #pragma mark - SimpleAuthProvider + (NSString *)type { diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index fc2c719..59944e5 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -17,15 +17,6 @@ @implementation SimpleAuthTumblrProvider -#pragma mark - NSObject - -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - - #pragma mark - SimpleAuthProvider + (NSString *)type { diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index ae573a9..5260173 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -16,15 +16,6 @@ @implementation SimpleAuthTwitterProvider -#pragma mark - NSObject - -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - - #pragma mark - SimpleAuthProvider + (NSString *)type { diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 7fe9de6..ea046fc 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -19,13 +19,6 @@ @implementation SimpleAuthTwitterWebProvider #pragma mark - SimpleAuthProvider -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} - - + (NSString *)type { return @"twitter-web"; } diff --git a/SimpleAuth/SimpleAuth.h b/SimpleAuth/SimpleAuth.h index 5d2ad9b..3739039 100644 --- a/SimpleAuth/SimpleAuth.h +++ b/SimpleAuth/SimpleAuth.h @@ -69,16 +69,6 @@ extern NSString * const SimpleAuthEndActivityBlockKey; */ + (NSMutableDictionary *)configuration; -/** - Register a class as a provider. Ideally, this would be a subclass of - SimpleAuthProvider but it doesn't necessarily have to be. Minimally, it must - have the same interface as the SimpleAuthProvider class. Multiple calls to - this with classes that return the same provider type will be ignored. - - @param klass The class to register. - */ -+ (void)registerProviderClass:(Class)klass; - /** Perform authorization with the given provider and all previously configured and default provider options. diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index 0754d0d..e93795e 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -8,6 +8,8 @@ #import "SimpleAuthProvider.h" +#import + NSString * const SimpleAuthErrorDomain = @"SimpleAuthErrorDomain"; NSString * const SimpleAuthPresentInterfaceBlockKey = @"present_interface_block"; NSString * const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; @@ -17,6 +19,13 @@ @implementation SimpleAuth +#pragma mark - NSObject + ++ (void)initialize { + [self loadProviders]; +} + + #pragma mark - Public + (NSMutableDictionary *)configuration { @@ -83,4 +92,34 @@ + (NSMutableDictionary *)providers { return providers; } + ++ (BOOL)isProviderClass:(Class)klass { + if (klass == [SimpleAuthProvider class]) { + return YES; + } + Class superclass = class_getSuperclass(klass); + if (superclass == nil) { + return NO; + } + else { + return [self isProviderClass:superclass]; + } +} + + ++ (void)loadProviders { + int count = objc_getClassList(NULL, 0); + Class classes[count]; + objc_getClassList(classes, count); + for (int i = 0; i < count; i++) { + Class klass = classes[i]; + if ([self isProviderClass:klass]) { + NSString *type = [klass type]; + if (type) { + [self registerProviderClass:klass]; + } + } + } +} + @end diff --git a/SimpleAuth/SimpleAuthProvider.m b/SimpleAuth/SimpleAuthProvider.m index fa9a089..fb18613 100644 --- a/SimpleAuth/SimpleAuthProvider.m +++ b/SimpleAuth/SimpleAuthProvider.m @@ -21,7 +21,6 @@ @implementation SimpleAuthProvider #pragma mark - Public + (NSString *)type { - [self doesNotRecognizeSelector:_cmd]; return nil; } From e412a940e836394822614da23e5a78d12e575e47 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 19 Jan 2014 21:34:56 -0800 Subject: [PATCH 010/139] Classes are 'Nil'. --- SimpleAuth/SimpleAuth.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index e93795e..82d7115 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -98,7 +98,7 @@ + (BOOL)isProviderClass:(Class)klass { return YES; } Class superclass = class_getSuperclass(klass); - if (superclass == nil) { + if (superclass == Nil) { return NO; } else { From d9b82b7c7cebb59c4cd813044dbddca62faac3e9 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 20 Jan 2014 17:31:43 -0800 Subject: [PATCH 011/139] Better provider loading. --- SimpleAuth.xcodeproj/project.pbxproj | 6 +++ SimpleAuth/NSObject+SimpleAuthAdditions.h | 15 +++++++ SimpleAuth/NSObject+SimpleAuthAdditions.m | 50 +++++++++++++++++++++++ SimpleAuth/SimpleAuth.m | 37 +++++------------ SimpleAuth/SimpleAuthProvider.m | 1 + 5 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 SimpleAuth/NSObject+SimpleAuthAdditions.h create mode 100644 SimpleAuth/NSObject+SimpleAuthAdditions.m diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 17bc167..a760f65 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */; }; 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; + 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */; }; 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; @@ -83,6 +84,8 @@ 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuth-Prefix.pch"; sourceTree = ""; }; 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleAuth.h; sourceTree = ""; }; 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleAuth.m; sourceTree = ""; }; + 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SimpleAuthAdditions.h"; sourceTree = ""; }; + 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SimpleAuthAdditions.m"; sourceTree = ""; }; 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthWebViewController.h; sourceTree = ""; }; 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthWebViewController.m; sourceTree = ""; }; 3C611F431835352200D87E45 /* UIWindow+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+SimpleAuthAdditions.h"; sourceTree = ""; }; @@ -284,6 +287,8 @@ 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */, 3C611F46183535A400D87E45 /* UIViewController+SimpleAuthAdditions.h */, 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */, + 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */, + 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */, ); name = Categories; sourceTree = ""; @@ -441,6 +446,7 @@ 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, + 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.h b/SimpleAuth/NSObject+SimpleAuthAdditions.h new file mode 100644 index 0000000..2a7e6b0 --- /dev/null +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.h @@ -0,0 +1,15 @@ +// +// NSObject+SimpleAuthAdditions.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/20/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +@interface NSObject (SimpleAuthAdditions) + ++ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass))block; ++ (void)SimpleAuth_enumerateSubclassesExcludingClasses:(NSSet *)set withBlock:(void (^) (Class klass))block; ++ (BOOL)SimpleAuth_isClass:(Class)klassOne subclassOfClass:(Class)klassTwo; + +@end diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.m b/SimpleAuth/NSObject+SimpleAuthAdditions.m new file mode 100644 index 0000000..f4d0071 --- /dev/null +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.m @@ -0,0 +1,50 @@ +// +// NSObject+SimpleAuthAdditions.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/20/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "NSObject+SimpleAuthAdditions.h" + +#import + +@implementation NSObject (SimpleAuthAdditions) + ++ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass))block { + int numberOfClasses = objc_getClassList(NULL, 0); + Class allClasses[numberOfClasses]; + objc_getClassList(allClasses, numberOfClasses); + for (int i = 0; i < numberOfClasses; i++) { + Class klass = allClasses[i]; + if ([self SimpleAuth_isClass:klass subclassOfClass:self]) { + block(klass); + } + } +} + + ++ (void)SimpleAuth_enumerateSubclassesExcludingClasses:(NSSet *)set withBlock:(void (^) (Class klass))block { + [self SimpleAuth_enumerateSubclassesWithBlock:^(Class klass) { + if (![set containsObject:klass]) { + block(klass); + } + }]; +} + + ++ (BOOL)SimpleAuth_isClass:(Class)classOne subclassOfClass:(Class)classTwo { + if (classOne == classTwo) { + return YES; + } + Class superclass = class_getSuperclass(classOne); + if (superclass == Nil) { + return NO; + } + else { + return [self SimpleAuth_isClass:superclass subclassOfClass:classTwo]; + } +} + +@end diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index 82d7115..1102e2f 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -7,8 +7,11 @@ // #import "SimpleAuthProvider.h" +#import "SimpleAuthSystemProvider.h" -#import +#import "NSObject+SimpleAuthAdditions.h" + +#import NSString * const SimpleAuthErrorDomain = @"SimpleAuthErrorDomain"; NSString * const SimpleAuthPresentInterfaceBlockKey = @"present_interface_block"; @@ -93,33 +96,13 @@ + (NSMutableDictionary *)providers { } -+ (BOOL)isProviderClass:(Class)klass { - if (klass == [SimpleAuthProvider class]) { - return YES; - } - Class superclass = class_getSuperclass(klass); - if (superclass == Nil) { - return NO; - } - else { - return [self isProviderClass:superclass]; - } -} - - + (void)loadProviders { - int count = objc_getClassList(NULL, 0); - Class classes[count]; - objc_getClassList(classes, count); - for (int i = 0; i < count; i++) { - Class klass = classes[i]; - if ([self isProviderClass:klass]) { - NSString *type = [klass type]; - if (type) { - [self registerProviderClass:klass]; - } - } - } + NSSet *set = [NSSet setWithArray:@[ + [SimpleAuthProvider class], [SimpleAuthSystemProvider class] + ]]; + [SimpleAuthProvider SimpleAuth_enumerateSubclassesExcludingClasses:set withBlock:^(Class klass) { + [self registerProviderClass:klass]; + }]; } @end diff --git a/SimpleAuth/SimpleAuthProvider.m b/SimpleAuth/SimpleAuthProvider.m index fb18613..fa9a089 100644 --- a/SimpleAuth/SimpleAuthProvider.m +++ b/SimpleAuth/SimpleAuthProvider.m @@ -21,6 +21,7 @@ @implementation SimpleAuthProvider #pragma mark - Public + (NSString *)type { + [self doesNotRecognizeSelector:_cmd]; return nil; } From 7c256956a5248c0d4341b2d7adb3f628f22b385e Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 20 Jan 2014 17:36:24 -0800 Subject: [PATCH 012/139] Update readme --- Readme.markdown | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 1f28392..ad516d9 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -55,18 +55,10 @@ SimpleAuth.configuration[@"twitter"] = @{ ## Implementing a Provider -The API for creating providers is pretty simple. Providers should be stored in `Providers/` and have an appropriately named folder and sub spec. There are a handful of methods you'll need to implement: +The API for creating providers is pretty simple. Providers should be stored in `Providers/` and have an appropriately named folder and sub spec. All providers are automatically registered with the framework. There are a handful of methods you'll need to implement: Register your provider with SimpleAuth: -````objc -+ (void)load { - @autoreleasepool { - [SimpleAuth registerProviderClass:self]; - } -} -```` - Let SimpleAuth know what type of provider you are registering: ````objc From f41f8d764b5daac057a7d3b8466501538a723c13 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 20 Jan 2014 18:30:04 -0800 Subject: [PATCH 013/139] Bump spec version. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 97e71eb..96a1504 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.0' + s.version = '0.3.1' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 9304e60ff2df85bce50cdeb3dabf84fbb75f09d0 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 21 Jan 2014 10:03:44 -0800 Subject: [PATCH 014/139] Update copyright and license. --- LICENSE | 2 +- Providers/Facebook/SimpleAuthFacebookProvider.h | 2 +- Providers/Facebook/SimpleAuthFacebookProvider.m | 2 +- Providers/Instagram/SimpleAuthInstagramLoginViewController.h | 2 +- Providers/Instagram/SimpleAuthInstagramLoginViewController.m | 2 +- Providers/Instagram/SimpleAuthInstagramProvider.h | 2 +- Providers/Instagram/SimpleAuthInstagramProvider.m | 2 +- Providers/Meetup/SimpleAuthMeetupLoginViewController.h | 2 +- Providers/Meetup/SimpleAuthMeetupLoginViewController.m | 2 +- Providers/Meetup/SimpleAuthMeetupProvider.h | 2 +- Providers/Meetup/SimpleAuthMeetupProvider.m | 2 +- Providers/Tumblr/SimpleAuthTumblrLoginViewController.h | 2 +- Providers/Tumblr/SimpleAuthTumblrLoginViewController.m | 2 +- Providers/Tumblr/SimpleAuthTumblrProvider.h | 2 +- Providers/Tumblr/SimpleAuthTumblrProvider.m | 2 +- Providers/Twitter/SimpleAuthTwitterProvider.h | 2 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 2 +- .../TwitterWeb/SimpleAuthTwitterWebLoginViewController.h | 2 +- .../TwitterWeb/SimpleAuthTwitterWebLoginViewController.m | 2 +- Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h | 2 +- Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m | 2 +- Readme.markdown | 4 +--- SimpleAuth.xcodeproj/project.pbxproj | 2 +- SimpleAuth/NSObject+SimpleAuthAdditions.h | 2 +- SimpleAuth/NSObject+SimpleAuthAdditions.m | 2 +- SimpleAuth/SimpleAuth-Prefix.pch | 2 +- SimpleAuth/SimpleAuth.h | 2 +- SimpleAuth/SimpleAuth.m | 2 +- SimpleAuth/SimpleAuthProvider.h | 2 +- SimpleAuth/SimpleAuthProvider.m | 2 +- SimpleAuth/SimpleAuthSystemProvider.h | 2 +- SimpleAuth/SimpleAuthSystemProvider.m | 2 +- SimpleAuth/SimpleAuthWebViewController.h | 2 +- SimpleAuth/SimpleAuthWebViewController.m | 2 +- SimpleAuth/UIViewController+SimpleAuthAdditions.h | 2 +- SimpleAuth/UIViewController+SimpleAuthAdditions.m | 2 +- SimpleAuth/UIWindow+SimpleAuthAdditions.h | 2 +- SimpleAuth/UIWindow+SimpleAuthAdditions.m | 2 +- SimpleAuthDemo/SADAppDelegate.h | 2 +- SimpleAuthDemo/SADAppDelegate.m | 2 +- SimpleAuthDemo/SADProviderListViewController.h | 2 +- SimpleAuthDemo/SADProviderListViewController.m | 2 +- SimpleAuthDemo/main.m | 2 +- 43 files changed, 43 insertions(+), 45 deletions(-) diff --git a/LICENSE b/LICENSE index d1e81ae..bf8388b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013 Seesaw Decisions Corporation +Copyright (c) 2013-2014 Byliner, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.h b/Providers/Facebook/SimpleAuthFacebookProvider.h index 46e6fd1..f14c025 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.h +++ b/Providers/Facebook/SimpleAuthFacebookProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthSystemProvider.h" diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index a568c0b..91d521c 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthFacebookProvider.h" diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.h b/Providers/Instagram/SimpleAuthInstagramLoginViewController.h index 0984517..18d8cb0 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.h +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthWebViewController.h" diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m index 00f055c..f1a0c37 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m @@ -3,7 +3,7 @@ // SimpleAuthInstagram // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthInstagramLoginViewController.h" diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.h b/Providers/Instagram/SimpleAuthInstagramProvider.h index d4f9c53..855a12a 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.h +++ b/Providers/Instagram/SimpleAuthInstagramProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index f5bfee2..41fb5ff 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthInstagramProvider.h" diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.h b/Providers/Meetup/SimpleAuthMeetupLoginViewController.h index f868124..eb6d8e6 100644 --- a/Providers/Meetup/SimpleAuthMeetupLoginViewController.h +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Mouhcine El Amine on 17/01/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthWebViewController.h" diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m index ca65c16..57b25d8 100644 --- a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Mouhcine El Amine on 17/01/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthMeetupLoginViewController.h" diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.h b/Providers/Meetup/SimpleAuthMeetupProvider.h index 3d5a3be..2fdaaef 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.h +++ b/Providers/Meetup/SimpleAuthMeetupProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Mouhcine El Amine on 17/01/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index 6e8f5d3..4bb090b 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Mouhcine El Amine on 17/01/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthMeetupProvider.h" diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h index 20b3fc6..6dd6db2 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthWebViewController.h" diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m index 0580c4a..76a0318 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthTumblrLoginViewController.h" diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.h b/Providers/Tumblr/SimpleAuthTumblrProvider.h index 6cab224..5c57e00 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.h +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index 59944e5..9526c34 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthTumblrProvider.h" diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.h b/Providers/Twitter/SimpleAuthTwitterProvider.h index 2aa2730..399a86d 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.h +++ b/Providers/Twitter/SimpleAuthTwitterProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthSystemProvider.h" diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 5260173..5782643 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthTwitterProvider.h" diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h index ffe218e..eafc3ab 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/15/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthWebViewController.h" diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m index f568f88..847791d 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/15/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthTwitterWebLoginViewController.h" diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h index 6d50e38..901de1d 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/15/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index ea046fc..9740d8b 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/15/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthTwitterWebProvider.h" diff --git a/Readme.markdown b/Readme.markdown index ad516d9..ef3e826 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -55,9 +55,7 @@ SimpleAuth.configuration[@"twitter"] = @{ ## Implementing a Provider -The API for creating providers is pretty simple. Providers should be stored in `Providers/` and have an appropriately named folder and sub spec. All providers are automatically registered with the framework. There are a handful of methods you'll need to implement: - -Register your provider with SimpleAuth: +The API for creating providers is pretty simple. Be sure to look at `SimpleAuthProvider` and `SimpleAuthWebLoginViewController`. These classes will help you simplify your authentiction process. Providers should be stored in `Providers/` and have an appropriately named folder and sub spec. All providers are automatically registered with the framework. There are a handful of methods you'll need to implement: Let SimpleAuth know what type of provider you are registering: diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index a760f65..85b29bc 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -350,7 +350,7 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 0500; - ORGANIZATIONNAME = "Seesaw Decisions Corporation"; + ORGANIZATIONNAME = "Byliner, Inc"; }; buildConfigurationList = 3BB324FF182ABC8B00ACB555 /* Build configuration list for PBXProject "SimpleAuth" */; compatibilityVersion = "Xcode 3.2"; diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.h b/SimpleAuth/NSObject+SimpleAuthAdditions.h index 2a7e6b0..a1261cf 100644 --- a/SimpleAuth/NSObject+SimpleAuthAdditions.h +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/20/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // @interface NSObject (SimpleAuthAdditions) diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.m b/SimpleAuth/NSObject+SimpleAuthAdditions.m index f4d0071..0bb9c36 100644 --- a/SimpleAuth/NSObject+SimpleAuthAdditions.m +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/20/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "NSObject+SimpleAuthAdditions.h" diff --git a/SimpleAuth/SimpleAuth-Prefix.pch b/SimpleAuth/SimpleAuth-Prefix.pch index 9e80850..e2e9bda 100644 --- a/SimpleAuth/SimpleAuth-Prefix.pch +++ b/SimpleAuth/SimpleAuth-Prefix.pch @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #ifdef __OBJC__ diff --git a/SimpleAuth/SimpleAuth.h b/SimpleAuth/SimpleAuth.h index 3739039..191c482 100644 --- a/SimpleAuth/SimpleAuth.h +++ b/SimpleAuth/SimpleAuth.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // extern NSString * const SimpleAuthErrorDomain; diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index 1102e2f..eca2bf8 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/SimpleAuth/SimpleAuthProvider.h b/SimpleAuth/SimpleAuthProvider.h index 8537714..2215823 100644 --- a/SimpleAuth/SimpleAuthProvider.h +++ b/SimpleAuth/SimpleAuthProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuth.h" diff --git a/SimpleAuth/SimpleAuthProvider.m b/SimpleAuth/SimpleAuthProvider.m index fa9a089..369d868 100644 --- a/SimpleAuth/SimpleAuthProvider.m +++ b/SimpleAuth/SimpleAuthProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/SimpleAuth/SimpleAuthSystemProvider.h b/SimpleAuth/SimpleAuthSystemProvider.h index e54fd78..8fa2275 100644 --- a/SimpleAuth/SimpleAuthSystemProvider.h +++ b/SimpleAuth/SimpleAuthSystemProvider.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthProvider.h" diff --git a/SimpleAuth/SimpleAuthSystemProvider.m b/SimpleAuth/SimpleAuthSystemProvider.m index c85c013..818c9fe 100644 --- a/SimpleAuth/SimpleAuthSystemProvider.m +++ b/SimpleAuth/SimpleAuthSystemProvider.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthSystemProvider.h" diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index b5e77b9..b4259fa 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController *controller, NSURL *URL, NSError *error); diff --git a/SimpleAuth/SimpleAuthWebViewController.m b/SimpleAuth/SimpleAuthWebViewController.m index a9f86ee..7eb2f49 100644 --- a/SimpleAuth/SimpleAuthWebViewController.m +++ b/SimpleAuth/SimpleAuthWebViewController.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/7/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "SimpleAuthWebViewController.h" diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.h b/SimpleAuth/UIViewController+SimpleAuthAdditions.h index 6296a1a..6ca37d2 100644 --- a/SimpleAuth/UIViewController+SimpleAuthAdditions.h +++ b/SimpleAuth/UIViewController+SimpleAuthAdditions.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/14/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // @interface UIViewController (SimpleAuthAdditions) diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.m b/SimpleAuth/UIViewController+SimpleAuthAdditions.m index 4b24945..3601058 100644 --- a/SimpleAuth/UIViewController+SimpleAuthAdditions.m +++ b/SimpleAuth/UIViewController+SimpleAuthAdditions.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/14/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "UIViewController+SimpleAuthAdditions.h" diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.h b/SimpleAuth/UIWindow+SimpleAuthAdditions.h index 8515052..8643442 100644 --- a/SimpleAuth/UIWindow+SimpleAuthAdditions.h +++ b/SimpleAuth/UIWindow+SimpleAuthAdditions.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/14/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // @interface UIWindow (SimpleAuthAdditions) diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.m b/SimpleAuth/UIWindow+SimpleAuthAdditions.m index 7853006..8f8a9ed 100644 --- a/SimpleAuth/UIWindow+SimpleAuthAdditions.m +++ b/SimpleAuth/UIWindow+SimpleAuthAdditions.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 11/14/13. -// Copyright (c) 2013 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // #import "UIWindow+SimpleAuthAdditions.h" diff --git a/SimpleAuthDemo/SADAppDelegate.h b/SimpleAuthDemo/SADAppDelegate.h index b6e16fc..d1de658 100644 --- a/SimpleAuthDemo/SADAppDelegate.h +++ b/SimpleAuthDemo/SADAppDelegate.h @@ -3,7 +3,7 @@ // SimpleAuthDemo // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // @interface SADAppDelegate : UIResponder diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index d8bac8b..ea825fa 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -3,7 +3,7 @@ // SimpleAuthDemo // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SADAppDelegate.h" diff --git a/SimpleAuthDemo/SADProviderListViewController.h b/SimpleAuthDemo/SADProviderListViewController.h index 0da0e3b..cdafd9e 100644 --- a/SimpleAuthDemo/SADProviderListViewController.h +++ b/SimpleAuthDemo/SADProviderListViewController.h @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // @interface SADProviderListViewController : UITableViewController diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 6fa4dc7..e176b66 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -3,7 +3,7 @@ // SimpleAuth // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import "SADProviderListViewController.h" diff --git a/SimpleAuthDemo/main.m b/SimpleAuthDemo/main.m index 687b406..6d4d235 100644 --- a/SimpleAuthDemo/main.m +++ b/SimpleAuthDemo/main.m @@ -3,7 +3,7 @@ // SimpleAuthDemo // // Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. // #import From d6c9f92b4c703dee2588445243251ac071d004a6 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 21 Jan 2014 14:00:14 -0800 Subject: [PATCH 015/139] Add standard means for creating a web login controller with a request token. --- .../SimpleAuthTumblrLoginViewController.h | 2 -- .../SimpleAuthTwitterWebLoginViewController.h | 2 -- SimpleAuth/SimpleAuthWebViewController.h | 24 +++++++++++++++++++ SimpleAuth/SimpleAuthWebViewController.m | 10 +++++++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h index 6dd6db2..ea404ee 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h @@ -10,6 +10,4 @@ @interface SimpleAuthTumblrLoginViewController : SimpleAuthWebViewController -- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken; - @end diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h index eafc3ab..b2a5d1d 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h @@ -10,6 +10,4 @@ @interface SimpleAuthTwitterWebLoginViewController : SimpleAuthWebViewController -- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken; - @end diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index b4259fa..0245f36 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -12,12 +12,36 @@ typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController * @property (nonatomic, readonly) UIWebView *webView; @property (nonatomic, readonly, copy) NSDictionary *options; +@property (nonatomic, readonly, copy) NSDictionary *requestToken; @property (nonatomic, copy) SimpleAuthWebViewControllerCompletionHandler completion; +/** + Initializes a basic web login view controller. + @param options Providers should pass their options along here. + @see -initWithOptions:requestToken: + */ - (instancetype)initWithOptions:(NSDictionary *)options; +/** + Initializes a web login view controller for an OAuth 1 style provider. + @param options Providers should pass their options along here. + @param requestToken Token obtained through the OAuth 1 flow. + @see -initWithOptions: + */ +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken; + +/** + Subclasses may override this to determine if the a given URL is the desired + redirect URL. The default implementation of this method checks the given URL + agains the value provided in options. + @param URL The URL to inspect. + @return `YES` if the URL is the desired redirect URL, `NO` if it is not. + */ - (BOOL)isTargetRedirectURL:(NSURL *)URL; +/** + Tells the receiver to run the dismiss block provided in options. + */ - (void)dismiss; @end diff --git a/SimpleAuth/SimpleAuthWebViewController.m b/SimpleAuth/SimpleAuthWebViewController.m index 7eb2f49..de01efc 100644 --- a/SimpleAuth/SimpleAuthWebViewController.m +++ b/SimpleAuth/SimpleAuthWebViewController.m @@ -12,6 +12,7 @@ @interface SimpleAuthWebViewController () @property (nonatomic, copy) NSDictionary *options; +@property (nonatomic, copy) NSDictionary *requestToken; @end @@ -31,9 +32,10 @@ - (void)viewDidLoad { #pragma mark - Public -- (instancetype)initWithOptions:(NSDictionary *)options { +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { if ((self = [super init])) { self.options = options; + self.requestToken = requestToken; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self @@ -43,6 +45,12 @@ - (instancetype)initWithOptions:(NSDictionary *)options { } +- (instancetype)initWithOptions:(NSDictionary *)options { + self = [self initWithOptions:options requestToken:nil]; + return self; +} + + - (BOOL)isTargetRedirectURL:(NSURL *)URL { NSString *targetURLString = [self.options[SimpleAuthRedirectURIKey] lowercaseString]; NSString *actualURLString = [[URL absoluteString] lowercaseString]; From 45cc92968cad15cc951737db4052da47147e23f8 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 21 Jan 2014 12:48:21 -0800 Subject: [PATCH 016/139] Remove dependency on SAMCategories. #6 - Add `SimpleAuthFormSerialization` - Move all providers and web view controllers to new serializer API. --- Podfile.lock | 3 - .../Facebook/SimpleAuthFacebookProvider.m | 1 - .../SimpleAuthInstagramLoginViewController.m | 4 +- .../Instagram/SimpleAuthInstagramProvider.m | 5 +- .../SimpleAuthMeetupLoginViewController.m | 6 +- Providers/Meetup/SimpleAuthMeetupProvider.m | 8 +- .../SimpleAuthTumblrLoginViewController.m | 4 +- Providers/Tumblr/SimpleAuthTumblrProvider.m | 9 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 3 +- .../SimpleAuthTwitterWebLoginViewController.m | 4 +- .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 9 +- SimpleAuth.podspec | 1 - SimpleAuth.xcodeproj/project.pbxproj | 14 +++ SimpleAuth/SimpleAuthFormSerialization.h | 14 +++ SimpleAuth/SimpleAuthFormSerialization.m | 87 +++++++++++++++++++ SimpleAuth/SimpleAuthProvider.h | 1 + SimpleAuth/SimpleAuthWebViewController.h | 2 + 17 files changed, 139 insertions(+), 36 deletions(-) create mode 100644 SimpleAuth/SimpleAuthFormSerialization.h create mode 100644 SimpleAuth/SimpleAuthFormSerialization.m diff --git a/Podfile.lock b/Podfile.lock index dde1df2..0fab2a0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -8,17 +8,14 @@ PODS: - ReactiveCocoa/Core (2.2): - ReactiveCocoa/no-arc - ReactiveCocoa/no-arc (2.2) - - SAMCategories (0.4.0) DEPENDENCIES: - cocoa-oauth - ReactiveCocoa - - SAMCategories SPEC CHECKSUMS: cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 ReactiveCocoa: 5b340678dc3168d6c9a2ca70fb83df683c08ca02 - SAMCategories: fb35d723e2d29b70afdd7efabfd1f99d4d1fe7f5 COCOAPODS: 0.29.0 diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 91d521c..8cf7b61 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -8,7 +8,6 @@ #import "SimpleAuthFacebookProvider.h" -#import #import @implementation SimpleAuthFacebookProvider diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m index f1a0c37..fa2de5f 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m @@ -9,8 +9,6 @@ #import "SimpleAuthInstagramLoginViewController.h" #import "SimpleAuth.h" -#import - @interface SimpleAuthInstagramLoginViewController () @end @@ -29,7 +27,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"https://instagram.com/oauth/authorize/?%@", - [parameters sam_stringWithFormEncodedComponents]]; + [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index 41fb5ff..8068cb1 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -11,7 +11,6 @@ #import "UIViewController+SimpleAuthAdditions.h" -#import #import @implementation SimpleAuthInstagramProvider @@ -74,7 +73,7 @@ - (RACSignal *)accessToken { // Parse URL NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:fragment]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:fragment]; NSString *token = dictionary[@"access_token"]; // Check for error @@ -99,7 +98,7 @@ - (RACSignal *)accessToken { - (RACSignal *)accountWithAccessToken:(NSString *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSDictionary *parameters = @{ @"access_token" : accessToken }; - NSString *query = [parameters sam_stringWithFormEncodedComponents]; + NSString *query = [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]; NSString *URLString = [NSString stringWithFormat:@"https://api.instagram.com/v1/users/self?%@", query]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m index 57b25d8..f6f1bda 100644 --- a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m @@ -9,8 +9,6 @@ #import "SimpleAuthMeetupLoginViewController.h" #import "SimpleAuth.h" -#import - @implementation SimpleAuthMeetupLoginViewController #pragma mark - UIViewController @@ -21,7 +19,9 @@ - (void)viewDidAppear:(BOOL)animated { @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], @"response_type" : @"token", @"scope" : @"ageless"}; - NSString *URLString = [NSString stringWithFormat:@"https://secure.meetup.com/oauth2/authorize?%@", [parameters sam_stringWithFormEncodedComponents]]; + NSString *URLString = [NSString stringWithFormat: + @"https://secure.meetup.com/oauth2/authorize?%@", + [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; } diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index 4bb090b..40f155c 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -11,8 +11,6 @@ #import "UIViewController+SimpleAuthAdditions.h" -#import - @implementation SimpleAuthMeetupProvider #pragma mark - SimpleAuthProvider @@ -51,7 +49,8 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; dismissBlock(viewController); - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:[URL fragment]]; + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:fragment]; NSString *token = dictionary[@"access_token"]; if ([token length] > 0) { NSDictionary *credentials = @{@"token": token, @@ -70,7 +69,8 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { #pragma mark - Private - (void)userWithCredentials:(NSDictionary *)credentials completion:(SimpleAuthRequestHandler)completion { - NSString *query = [@{ @"member_id" : @"self"} sam_stringWithFormEncodedComponents]; + NSDictionary *parameters = @{ @"member_id" : @"self" }; + NSString *query = [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]; NSString *URLString = [NSString stringWithFormat:@"https://api.meetup.com/2/members?%@", query]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]]; [request setValue:[NSString stringWithFormat:@"Bearer %@", credentials[@"token"]] forHTTPHeaderField:@"Authorization"]; diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m index 76a0318..b33246b 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -8,8 +8,6 @@ #import "SimpleAuthTumblrLoginViewController.h" -#import - @interface SimpleAuthTumblrLoginViewController () @property (nonatomic, copy) NSDictionary *requestToken; @@ -28,7 +26,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"http://www.tumblr.com/oauth/authorize?%@", - [parameters sam_stringWithFormEncodedComponents]]; + [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index 9526c34..b54a3f6 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -13,7 +13,6 @@ #import #import -#import @implementation SimpleAuthTumblrProvider @@ -95,7 +94,7 @@ - (RACSignal *)requestToken { NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } @@ -119,7 +118,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Parse URL NSString *query = [URL query]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:query]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:query]; NSString *token = dictionary[@"oauth_token"]; NSString *verifier = dictionary[@"oauth_verifier"]; @@ -160,8 +159,8 @@ - (RACSignal *)accessTokenWithRequestToken:(NSDictionary *)requestToken authenti NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictinoary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; - [subscriber sendNext:dictinoary]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } else { diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 5782643..32c1557 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -11,7 +11,6 @@ #import "UIWindow+SimpleAuthAdditions.h" #import -#import #import @implementation SimpleAuthTwitterProvider @@ -228,7 +227,7 @@ - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account: NSInteger statusCode = [response statusCode]; if (statusCode == 200 && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m index 847791d..fe02251 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m @@ -8,8 +8,6 @@ #import "SimpleAuthTwitterWebLoginViewController.h" -#import - @interface SimpleAuthTwitterWebLoginViewController () @property (nonatomic, copy) NSDictionary *requestToken; @@ -28,7 +26,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"https://api.twitter.com/oauth/authenticate?%@", - [parameters sam_stringWithFormEncodedComponents]]; + [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 9740d8b..4b4bbcd 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -13,7 +13,6 @@ #import #import -#import @implementation SimpleAuthTwitterWebProvider @@ -91,7 +90,7 @@ - (RACSignal *)requestToken { NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } @@ -114,7 +113,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Parse URL NSString *query = [URL query]; - NSDictionary *dictionary = [NSDictionary sam_dictionaryWithFormEncodedString:query]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:query]; NSString *token = dictionary[@"oauth_token"]; NSString *verifier = dictionary[@"oauth_verifier"]; @@ -155,8 +154,8 @@ - (RACSignal *)accessTokenWithAuthenticationResponse:(NSDictionary *)authenticat NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictinoary = [NSDictionary sam_dictionaryWithFormEncodedString:string]; - [subscriber sendNext:dictinoary]; + NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } else { diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 96a1504..8c576a7 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -13,7 +13,6 @@ Pod::Spec.new do |s| ss.source_files = 'SimpleAuth/**/*.{h,m}' ss.public_header_files = 'SimpleAuth/SipmleAuth.h' ss.dependency 'ReactiveCocoa' - ss.dependency 'SAMCategories' end s.subspec 'Twitter' do |ss| diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 85b29bc..abe75ef 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */; }; + 3B9EF198188F018800A6667A /* SimpleAuthFormSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */; }; 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; @@ -80,6 +81,8 @@ 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthProvider.m; sourceTree = ""; }; 3B9AB06C182ACCBB0011FB9E /* SimpleAuthSystemProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSystemProvider.h; sourceTree = ""; }; 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSystemProvider.m; sourceTree = ""; }; + 3B9EF196188F018800A6667A /* SimpleAuthFormSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFormSerialization.h; sourceTree = ""; }; + 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFormSerialization.m; sourceTree = ""; }; 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSimpleAuth.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuth-Prefix.pch"; sourceTree = ""; }; 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleAuth.h; sourceTree = ""; }; @@ -217,6 +220,15 @@ name = Providers; sourceTree = ""; }; + 3B9EF195188F016900A6667A /* Other */ = { + isa = PBXGroup; + children = ( + 3B9EF196188F018800A6667A /* SimpleAuthFormSerialization.h */, + 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */, + ); + name = Other; + sourceTree = ""; + }; 3BB324FB182ABC8B00ACB555 = { isa = PBXGroup; children = ( @@ -257,6 +269,7 @@ 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */, 3B8F11B8182AC0E50035C4EA /* Providers */, 3C0A5390182C4206002C050C /* View Controllers */, + 3B9EF195188F016900A6667A /* Other */, 3C611F421835350800D87E45 /* Categories */, 3BB3250A182ABC8B00ACB555 /* Supporting Files */, ); @@ -436,6 +449,7 @@ 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, + 3B9EF198188F018800A6667A /* SimpleAuthFormSerialization.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, diff --git a/SimpleAuth/SimpleAuthFormSerialization.h b/SimpleAuth/SimpleAuthFormSerialization.h new file mode 100644 index 0000000..3eb904f --- /dev/null +++ b/SimpleAuth/SimpleAuthFormSerialization.h @@ -0,0 +1,14 @@ +// +// SimpleAuthFormSerialization.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/21/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +@interface SimpleAuthFormSerialization : NSObject + ++ (NSDictionary *)dictionaryWithFormEncodedString:(NSString *)string; ++ (NSString *)formEncodedStringWithDictionary:(NSDictionary *)dictionary; + +@end diff --git a/SimpleAuth/SimpleAuthFormSerialization.m b/SimpleAuth/SimpleAuthFormSerialization.m new file mode 100644 index 0000000..68a2157 --- /dev/null +++ b/SimpleAuth/SimpleAuthFormSerialization.m @@ -0,0 +1,87 @@ +// +// SimpleAuthFormSerialization.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/21/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthFormSerialization.h" + +@interface NSString (SimpleAuthAdditions) + +- (NSString *)SimpleAuth_stringByAddingEscapes; +- (NSString *)Simpleauth_stringByRemovingEscapes; + +@end + +@implementation SimpleAuthFormSerialization + ++ (NSDictionary *)dictionaryWithFormEncodedString:(NSString *)string { + if (!string) { + return nil; + } + + NSMutableDictionary *result = [NSMutableDictionary new]; + NSArray *pairs = [string componentsSeparatedByString:@"&"]; + + for (NSString *pair in pairs) { + if ([pair length] == 0) { + continue; + } + + NSRange range = [pair rangeOfString:@"="]; + NSString *key; + NSString *value; + + if (range.location == NSNotFound) { + key = [pair Simpleauth_stringByRemovingEscapes]; + value = @""; + } else { + key = [pair substringToIndex:range.location]; + key = [key Simpleauth_stringByRemovingEscapes]; + + value = [pair substringFromIndex:(range.location + range.length)]; + value = [key Simpleauth_stringByRemovingEscapes]; + } + + if (!key || !value) { + continue; + } + + result[key] = value; + } + + return result; +} + + ++ (NSString *)formEncodedStringWithDictionary:(NSDictionary *)dictionary { + NSMutableArray *pairs = [NSMutableArray arrayWithCapacity:[dictionary count]]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) { + NSString *string = [NSString stringWithFormat:@"%@=%@", + [key SimpleAuth_stringByAddingEscapes], + [value SimpleAuth_stringByAddingEscapes]]; + [pairs addObject:string]; + }]; + return [pairs componentsJoinedByString:@"&"]; +} + +@end + +@implementation NSString (SimpleAuthAdditions) + +- (NSString *)SimpleAuth_stringByAddingEscapes { + CFStringRef string = CFURLCreateStringByAddingPercentEscapes(NULL, + (CFStringRef)self, + NULL, + CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8); + return (NSString *)CFBridgingRelease(string); +} + + +- (NSString *)Simpleauth_stringByRemovingEscapes { + return [self stringByRemovingPercentEncoding]; +} + +@end diff --git a/SimpleAuth/SimpleAuthProvider.h b/SimpleAuth/SimpleAuthProvider.h index 2215823..3e35674 100644 --- a/SimpleAuth/SimpleAuthProvider.h +++ b/SimpleAuth/SimpleAuthProvider.h @@ -7,6 +7,7 @@ // #import "SimpleAuth.h" +#import "SimpleAuthFormSerialization.h" @interface SimpleAuthProvider : NSObject diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index 0245f36..18b9f19 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -6,6 +6,8 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // +#import "SimpleAuthFormSerialization.h" + typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController *controller, NSURL *URL, NSError *error); @interface SimpleAuthWebViewController : UIViewController From 6c2b00095a3e2a7ed5a4e3c9faf719ab097b679f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 21 Jan 2014 13:22:56 -0800 Subject: [PATCH 017/139] Move to pod implementation of query string stuff. --- Podfile.lock | 3 + .../SimpleAuthInstagramLoginViewController.m | 2 +- .../Instagram/SimpleAuthInstagramProvider.m | 4 +- .../SimpleAuthMeetupLoginViewController.m | 2 +- Providers/Meetup/SimpleAuthMeetupProvider.m | 4 +- .../SimpleAuthTumblrLoginViewController.m | 2 +- Providers/Tumblr/SimpleAuthTumblrProvider.m | 6 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 2 +- .../SimpleAuthTwitterWebLoginViewController.m | 2 +- .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 6 +- SimpleAuth.podspec | 1 + SimpleAuth.xcodeproj/project.pbxproj | 14 --- SimpleAuth/SimpleAuthFormSerialization.h | 14 --- SimpleAuth/SimpleAuthFormSerialization.m | 87 ------------------- SimpleAuth/SimpleAuthProvider.h | 3 +- SimpleAuth/SimpleAuthWebViewController.h | 2 +- 16 files changed, 22 insertions(+), 132 deletions(-) delete mode 100644 SimpleAuth/SimpleAuthFormSerialization.h delete mode 100644 SimpleAuth/SimpleAuthFormSerialization.m diff --git a/Podfile.lock b/Podfile.lock index 0fab2a0..48b7835 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,4 +1,5 @@ PODS: + - CMDQueryStringSerialization (0.1.0) - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - NSData+Base64 (1.0.0) @@ -10,10 +11,12 @@ PODS: - ReactiveCocoa/no-arc (2.2) DEPENDENCIES: + - CMDQueryStringSerialization - cocoa-oauth - ReactiveCocoa SPEC CHECKSUMS: + CMDQueryStringSerialization: 6224cae84129669eeb3ae29730ef827ddbf9f88b cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 ReactiveCocoa: 5b340678dc3168d6c9a2ca70fb83df683c08ca02 diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m index fa2de5f..7806ec4 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m @@ -27,7 +27,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"https://instagram.com/oauth/authorize/?%@", - [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index 8068cb1..936d226 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -73,7 +73,7 @@ - (RACSignal *)accessToken { // Parse URL NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; NSString *token = dictionary[@"access_token"]; // Check for error @@ -98,7 +98,7 @@ - (RACSignal *)accessToken { - (RACSignal *)accountWithAccessToken:(NSString *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSDictionary *parameters = @{ @"access_token" : accessToken }; - NSString *query = [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; NSString *URLString = [NSString stringWithFormat:@"https://api.instagram.com/v1/users/self?%@", query]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m index f6f1bda..0f9afb7 100644 --- a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m @@ -21,7 +21,7 @@ - (void)viewDidAppear:(BOOL)animated { @"scope" : @"ageless"}; NSString *URLString = [NSString stringWithFormat: @"https://secure.meetup.com/oauth2/authorize?%@", - [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; } diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index 40f155c..6aa2998 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -50,7 +50,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { dismissBlock(viewController); NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; NSString *token = dictionary[@"access_token"]; if ([token length] > 0) { NSDictionary *credentials = @{@"token": token, @@ -70,7 +70,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (void)userWithCredentials:(NSDictionary *)credentials completion:(SimpleAuthRequestHandler)completion { NSDictionary *parameters = @{ @"member_id" : @"self" }; - NSString *query = [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; NSString *URLString = [NSString stringWithFormat:@"https://api.meetup.com/2/members?%@", query]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]]; [request setValue:[NSString stringWithFormat:@"Bearer %@", credentials[@"token"]] forHTTPHeaderField:@"Authorization"]; diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m index b33246b..790661d 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -26,7 +26,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"http://www.tumblr.com/oauth/authorize?%@", - [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index b54a3f6..f0a268b 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -94,7 +94,7 @@ - (RACSignal *)requestToken { NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } @@ -118,7 +118,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Parse URL NSString *query = [URL query]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; NSString *token = dictionary[@"oauth_token"]; NSString *verifier = dictionary[@"oauth_verifier"]; @@ -159,7 +159,7 @@ - (RACSignal *)accessTokenWithRequestToken:(NSDictionary *)requestToken authenti NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 32c1557..703274b 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -227,7 +227,7 @@ - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account: NSInteger statusCode = [response statusCode]; if (statusCode == 200 && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m index fe02251..c32697c 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m @@ -26,7 +26,7 @@ - (void)viewDidAppear:(BOOL)animated { }; NSString *URLString = [NSString stringWithFormat: @"https://api.twitter.com/oauth/authenticate?%@", - [SimpleAuthFormSerialization formEncodedStringWithDictionary:parameters]]; + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 4b4bbcd..40163ac 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -90,7 +90,7 @@ - (RACSignal *)requestToken { NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } @@ -113,7 +113,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Parse URL NSString *query = [URL query]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; NSString *token = dictionary[@"oauth_token"]; NSString *verifier = dictionary[@"oauth_verifier"]; @@ -154,7 +154,7 @@ - (RACSignal *)accessTokenWithAuthenticationResponse:(NSDictionary *)authenticat NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSDictionary *dictionary = [SimpleAuthFormSerialization dictionaryWithFormEncodedString:string]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 8c576a7..7334cf0 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -13,6 +13,7 @@ Pod::Spec.new do |s| ss.source_files = 'SimpleAuth/**/*.{h,m}' ss.public_header_files = 'SimpleAuth/SipmleAuth.h' ss.dependency 'ReactiveCocoa' + ss.dependency 'CMDQueryStringSerialization' end s.subspec 'Twitter' do |ss| diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index abe75ef..85b29bc 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -23,7 +23,6 @@ 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */; }; - 3B9EF198188F018800A6667A /* SimpleAuthFormSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */; }; 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; @@ -81,8 +80,6 @@ 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthProvider.m; sourceTree = ""; }; 3B9AB06C182ACCBB0011FB9E /* SimpleAuthSystemProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSystemProvider.h; sourceTree = ""; }; 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSystemProvider.m; sourceTree = ""; }; - 3B9EF196188F018800A6667A /* SimpleAuthFormSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFormSerialization.h; sourceTree = ""; }; - 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFormSerialization.m; sourceTree = ""; }; 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSimpleAuth.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuth-Prefix.pch"; sourceTree = ""; }; 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleAuth.h; sourceTree = ""; }; @@ -220,15 +217,6 @@ name = Providers; sourceTree = ""; }; - 3B9EF195188F016900A6667A /* Other */ = { - isa = PBXGroup; - children = ( - 3B9EF196188F018800A6667A /* SimpleAuthFormSerialization.h */, - 3B9EF197188F018800A6667A /* SimpleAuthFormSerialization.m */, - ); - name = Other; - sourceTree = ""; - }; 3BB324FB182ABC8B00ACB555 = { isa = PBXGroup; children = ( @@ -269,7 +257,6 @@ 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */, 3B8F11B8182AC0E50035C4EA /* Providers */, 3C0A5390182C4206002C050C /* View Controllers */, - 3B9EF195188F016900A6667A /* Other */, 3C611F421835350800D87E45 /* Categories */, 3BB3250A182ABC8B00ACB555 /* Supporting Files */, ); @@ -449,7 +436,6 @@ 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, - 3B9EF198188F018800A6667A /* SimpleAuthFormSerialization.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, diff --git a/SimpleAuth/SimpleAuthFormSerialization.h b/SimpleAuth/SimpleAuthFormSerialization.h deleted file mode 100644 index 3eb904f..0000000 --- a/SimpleAuth/SimpleAuthFormSerialization.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// SimpleAuthFormSerialization.h -// SimpleAuth -// -// Created by Caleb Davenport on 1/21/14. -// Copyright (c) 2014 Byliner, Inc. All rights reserved. -// - -@interface SimpleAuthFormSerialization : NSObject - -+ (NSDictionary *)dictionaryWithFormEncodedString:(NSString *)string; -+ (NSString *)formEncodedStringWithDictionary:(NSDictionary *)dictionary; - -@end diff --git a/SimpleAuth/SimpleAuthFormSerialization.m b/SimpleAuth/SimpleAuthFormSerialization.m deleted file mode 100644 index 68a2157..0000000 --- a/SimpleAuth/SimpleAuthFormSerialization.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// SimpleAuthFormSerialization.m -// SimpleAuth -// -// Created by Caleb Davenport on 1/21/14. -// Copyright (c) 2014 Byliner, Inc. All rights reserved. -// - -#import "SimpleAuthFormSerialization.h" - -@interface NSString (SimpleAuthAdditions) - -- (NSString *)SimpleAuth_stringByAddingEscapes; -- (NSString *)Simpleauth_stringByRemovingEscapes; - -@end - -@implementation SimpleAuthFormSerialization - -+ (NSDictionary *)dictionaryWithFormEncodedString:(NSString *)string { - if (!string) { - return nil; - } - - NSMutableDictionary *result = [NSMutableDictionary new]; - NSArray *pairs = [string componentsSeparatedByString:@"&"]; - - for (NSString *pair in pairs) { - if ([pair length] == 0) { - continue; - } - - NSRange range = [pair rangeOfString:@"="]; - NSString *key; - NSString *value; - - if (range.location == NSNotFound) { - key = [pair Simpleauth_stringByRemovingEscapes]; - value = @""; - } else { - key = [pair substringToIndex:range.location]; - key = [key Simpleauth_stringByRemovingEscapes]; - - value = [pair substringFromIndex:(range.location + range.length)]; - value = [key Simpleauth_stringByRemovingEscapes]; - } - - if (!key || !value) { - continue; - } - - result[key] = value; - } - - return result; -} - - -+ (NSString *)formEncodedStringWithDictionary:(NSDictionary *)dictionary { - NSMutableArray *pairs = [NSMutableArray arrayWithCapacity:[dictionary count]]; - [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) { - NSString *string = [NSString stringWithFormat:@"%@=%@", - [key SimpleAuth_stringByAddingEscapes], - [value SimpleAuth_stringByAddingEscapes]]; - [pairs addObject:string]; - }]; - return [pairs componentsJoinedByString:@"&"]; -} - -@end - -@implementation NSString (SimpleAuthAdditions) - -- (NSString *)SimpleAuth_stringByAddingEscapes { - CFStringRef string = CFURLCreateStringByAddingPercentEscapes(NULL, - (CFStringRef)self, - NULL, - CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8); - return (NSString *)CFBridgingRelease(string); -} - - -- (NSString *)Simpleauth_stringByRemovingEscapes { - return [self stringByRemovingPercentEncoding]; -} - -@end diff --git a/SimpleAuth/SimpleAuthProvider.h b/SimpleAuth/SimpleAuthProvider.h index 3e35674..12bc9b5 100644 --- a/SimpleAuth/SimpleAuthProvider.h +++ b/SimpleAuth/SimpleAuthProvider.h @@ -6,8 +6,9 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // +#import + #import "SimpleAuth.h" -#import "SimpleAuthFormSerialization.h" @interface SimpleAuthProvider : NSObject diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index 18b9f19..4f03621 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -6,7 +6,7 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthFormSerialization.h" +#import typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController *controller, NSURL *URL, NSError *error); From bfe2836e1446d3b34e26f3b8c0bbe505f6a9e3d2 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 10:01:57 -0800 Subject: [PATCH 018/139] Update query string serialization library. --- Podfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile.lock b/Podfile.lock index 48b7835..0f1ca40 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -16,7 +16,7 @@ DEPENDENCIES: - ReactiveCocoa SPEC CHECKSUMS: - CMDQueryStringSerialization: 6224cae84129669eeb3ae29730ef827ddbf9f88b + CMDQueryStringSerialization: f6118185b92689188026e648c4eb5e2c87b5835b cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 ReactiveCocoa: 5b340678dc3168d6c9a2ca70fb83df683c08ca02 From 24338d4f3de276de6c900fb8dbe54b968af6ce8e Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:05:13 -0800 Subject: [PATCH 019/139] Internalize some of the web view controller loading logic and simplify API. --- .../SimpleAuthInstagramLoginViewController.m | 29 ++++++--------- .../SimpleAuthMeetupLoginViewController.m | 36 +++++++++---------- .../SimpleAuthTumblrLoginViewController.m | 32 ++++++----------- .../SimpleAuthTwitterWebLoginViewController.m | 32 ++++++----------- SimpleAuth/SimpleAuthWebViewController.h | 9 +++++ SimpleAuth/SimpleAuthWebViewController.m | 22 ++++++++++-- 6 files changed, 77 insertions(+), 83 deletions(-) diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m index 7806ec4..f74352b 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m @@ -7,19 +7,20 @@ // #import "SimpleAuthInstagramLoginViewController.h" -#import "SimpleAuth.h" -@interface SimpleAuthInstagramLoginViewController () +@implementation SimpleAuthInstagramLoginViewController -@end +#pragma mark - SimpleAuthWebViewController -@implementation SimpleAuthInstagramLoginViewController +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Instagram"; + } + return self; +} -#pragma mark - UIViewController -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - +- (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"client_id" : self.options[@"client_id"], @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], @@ -30,17 +31,7 @@ - (void)viewDidAppear:(BOOL)animated { [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; - NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - [self.webView loadRequest:request]; -} - -#pragma mark - SimpleAuthWebViewController - -- (instancetype)initWithOptions:(NSDictionary *)options { - if ((self = [super initWithOptions:options])) { - self.title = @"Instagram"; - } - return self; + return [NSURLRequest requestWithURL:URL]; } @end diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m index 0f9afb7..c6f6944 100644 --- a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m +++ b/Providers/Meetup/SimpleAuthMeetupLoginViewController.m @@ -7,32 +7,32 @@ // #import "SimpleAuthMeetupLoginViewController.h" -#import "SimpleAuth.h" @implementation SimpleAuthMeetupLoginViewController -#pragma mark - UIViewController - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - NSDictionary *parameters = @{@"client_id" : self.options[@"client_id"], - @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], - @"response_type" : @"token", - @"scope" : @"ageless"}; - NSString *URLString = [NSString stringWithFormat: - @"https://secure.meetup.com/oauth2/authorize?%@", - [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; - [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]]; -} - #pragma mark - SimpleAuthWebViewController -- (instancetype)initWithOptions:(NSDictionary *)options { - self = [super initWithOptions:options]; - if (self) { +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { self.title = @"Meetup"; } return self; } + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token", + @"scope" : @"ageless" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://secure.meetup.com/oauth2/authorize?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + @end diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m index 790661d..e79e8a9 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -8,19 +8,19 @@ #import "SimpleAuthTumblrLoginViewController.h" -@interface SimpleAuthTumblrLoginViewController () - -@property (nonatomic, copy) NSDictionary *requestToken; +@implementation SimpleAuthTumblrLoginViewController -@end +#pragma mark - SimpleAuthWebViewController -@implementation SimpleAuthTumblrLoginViewController +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options])) { + self.title = @"tumblr"; + } + return self; +} -#pragma mark - UIViewController -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - +- (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"oauth_token" : self.requestToken[@"oauth_token"], }; @@ -29,19 +29,7 @@ - (void)viewDidAppear:(BOOL)animated { [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; - NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - [self.webView loadRequest:request]; -} - - -#pragma mark - Public - -- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - if ((self = [super initWithOptions:options])) { - self.requestToken = requestToken; - self.title = @"tumblr"; - } - return self; + return [NSURLRequest requestWithURL:URL]; } @end diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m index c32697c..dbbbc06 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m @@ -8,19 +8,19 @@ #import "SimpleAuthTwitterWebLoginViewController.h" -@interface SimpleAuthTwitterWebLoginViewController () - -@property (nonatomic, copy) NSDictionary *requestToken; +@implementation SimpleAuthTwitterWebLoginViewController -@end +#pragma mark - SimpleAuthWebViewController -@implementation SimpleAuthTwitterWebLoginViewController +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Twitter"; + } + return self; +} -#pragma mark - UIViewController -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - +- (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"oauth_token" : self.requestToken[@"oauth_token"], }; @@ -29,19 +29,7 @@ - (void)viewDidAppear:(BOOL)animated { [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; - NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - [self.webView loadRequest:request]; -} - - -#pragma mark - Public - -- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - if ((self = [super initWithOptions:options])) { - self.requestToken = requestToken; - self.title = @"Twitter"; - } - return self; + return [NSURLRequest requestWithURL:URL]; } @end diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index 4f03621..72d4097 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -8,6 +8,8 @@ #import +#import "SimpleAuth.h" + typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController *controller, NSURL *URL, NSError *error); @interface SimpleAuthWebViewController : UIViewController @@ -32,6 +34,13 @@ typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController * */ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken; +/** + Subclasses should override this to provide the request that will be loaded the + first time that the web view appears. + @return A URL request. + */ +- (NSURLRequest *)initialRequest; + /** Subclasses may override this to determine if the a given URL is the desired redirect URL. The default implementation of this method checks the given URL diff --git a/SimpleAuth/SimpleAuthWebViewController.m b/SimpleAuth/SimpleAuthWebViewController.m index de01efc..38c5e0d 100644 --- a/SimpleAuth/SimpleAuthWebViewController.m +++ b/SimpleAuth/SimpleAuthWebViewController.m @@ -7,7 +7,6 @@ // #import "SimpleAuthWebViewController.h" -#import "SimpleAuth.h" @interface SimpleAuthWebViewController () @@ -16,7 +15,9 @@ @interface SimpleAuthWebViewController () @end -@implementation SimpleAuthWebViewController +@implementation SimpleAuthWebViewController { + BOOL _hasInitialLoad; +} @synthesize webView = _webView; @@ -30,6 +31,17 @@ - (void)viewDidLoad { } +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + if (!_hasInitialLoad) { + _hasInitialLoad = YES; + NSURLRequest *request = [self initialRequest]; + [self.webView loadRequest:request]; + } +} + + #pragma mark - Public - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { @@ -69,6 +81,12 @@ - (void)dismiss { } +- (NSURLRequest *)initialRequest { + [self doesNotRecognizeSelector:_cmd]; + return nil; +} + + #pragma mark - Accessors - (UIWebView *)webView { From 0fc0bd1a382f271f0d7144fcc12726b6c91cfd3b Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 10:38:03 -0800 Subject: [PATCH 020/139] Add Facebook web login. --- .../SimpleAuthFaceBookWebProvider.h | 13 ++ .../SimpleAuthFaceBookWebProvider.m | 179 ++++++++++++++++++ ...SimpleAuthFacebookWebLoginViewController.h | 13 ++ ...SimpleAuthFacebookWebLoginViewController.m | 47 +++++ SimpleAuth.xcodeproj/project.pbxproj | 20 ++ .../SADProviderListViewController.m | 1 + 6 files changed, 273 insertions(+) create mode 100644 Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h create mode 100644 Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m create mode 100644 Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h create mode 100644 Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h new file mode 100644 index 0000000..856bebd --- /dev/null +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthFaceBookWebProvider.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/22/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthFaceBookWebProvider : SimpleAuthProvider + +@end diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m new file mode 100644 index 0000000..3a6d47b --- /dev/null +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -0,0 +1,179 @@ +// +// SimpleAuthFaceBookWebProvider.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/22/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthFaceBookWebProvider.h" +#import "SimpleAuthFacebookWebLoginViewController.h" + +#import "UIViewController+SimpleAuthAdditions.h" + +#import + +@implementation SimpleAuthFaceBookWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"facebook-web"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController sa_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + dictionary[SimpleAuthRedirectURIKey] = @"https://www.facebook.com/connect/login_success.html"; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(id x) { + completion(x, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthFacebookWebLoginViewController *login = [[SimpleAuthFacebookWebLoginViewController alloc] initWithOptions:self.options]; + + login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; + block(controller); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + id token = dictionary[@"access_token"]; + id expiration = dictionary[@"expires_in"]; + + // Check for error + if (!token || !expiration) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"access_token" : accessToken[@"access_token"] }; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSString *URLString = [NSString stringWithFormat:@"https://graph.facebook.com/me?%@", query]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"access_token"], + @"expires_in" : accessToken[@"expires_in"] + }; + + // User ID + dictionary[@"uid"] = account[@"id"]; + + // Raw response + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // Profile image + NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", account[@"id"]]; + + // Location + NSString *location = account[@"location"][@"name"]; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"nickname"] = account[@"username"]; + user[@"email"] = account[@"email"]; + user[@"name"] = account[@"name"]; + user[@"first_name"] = account[@"first_name"]; + user[@"last_name"] = account[@"last_name"]; + user[@"image"] = avatar; + if (location) { + user[@"location"] = location; + } + user[@"verified"] = account[@"verified"]; + user[@"urls"] = @{ + @"Facebook" : account[@"link"], + }; + dictionary[@"info"] = user; + + return dictionary; +} + +@end diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h new file mode 100644 index 0000000..e0f5445 --- /dev/null +++ b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthFacebookWebLoginViewController.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/22/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthFacebookWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m new file mode 100644 index 0000000..79059c6 --- /dev/null +++ b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m @@ -0,0 +1,47 @@ +// +// SimpleAuthFacebookWebLoginViewController.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/22/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthFacebookWebLoginViewController.h" +#import "SimpleAuth.h" + +@interface SimpleAuthFacebookWebLoginViewController () + +@end + +@implementation SimpleAuthFacebookWebLoginViewController + +#pragma mark - UIViewController + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + NSDictionary *parameters = @{ + @"client_id" : self.options[@"app_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://www.facebook.com/dialog/oauth?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [self.webView loadRequest:request]; +} + + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Facebook"; + } + return self; +} + +@end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 85b29bc..c1875ea 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 3B65845C188895E400D59100 /* libSimpleAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */; }; 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */; }; 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */; }; + 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */; }; + 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */; }; 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; @@ -72,6 +74,10 @@ 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrProvider.m; sourceTree = ""; }; 3B6584611888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrLoginViewController.h; sourceTree = ""; }; 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrLoginViewController.m; sourceTree = ""; }; + 3B66656A18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFaceBookWebProvider.h; sourceTree = ""; }; + 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFaceBookWebProvider.m; sourceTree = ""; }; + 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFacebookWebLoginViewController.h; sourceTree = ""; }; + 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFacebookWebLoginViewController.m; sourceTree = ""; }; 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebProvider.h; sourceTree = ""; }; 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebProvider.m; sourceTree = ""; }; 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebLoginViewController.h; sourceTree = ""; }; @@ -122,6 +128,7 @@ isa = PBXGroup; children = ( 3B52BB9218871F6200C73329 /* Facebook */, + 3B66656918903F4000F3BF58 /* FacebookWeb */, 3B52BB8E1887088400C73329 /* Twitter */, 3B8C408B18879296007DC578 /* TwitterWeb */, 3B52BB96188731A300C73329 /* Instagram */, @@ -195,6 +202,17 @@ path = Tumblr; sourceTree = ""; }; + 3B66656918903F4000F3BF58 /* FacebookWeb */ = { + isa = PBXGroup; + children = ( + 3B66656A18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.h */, + 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */, + 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */, + 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */, + ); + path = FacebookWeb; + sourceTree = ""; + }; 3B8C408B18879296007DC578 /* TwitterWeb */ = { isa = PBXGroup; children = ( @@ -441,10 +459,12 @@ 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, + 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */, 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */, 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */, + 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, ); diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index e176b66..a2d2115 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -46,6 +46,7 @@ + (NSArray *)providers { @"twitter", @"twitter-web", @"facebook", + @"facebook-web", @"instagram", @"meetup", @"tumblr" From 30954e5d04dedf657ddf235717d3a691dff4fc33 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:06:14 -0800 Subject: [PATCH 021/139] Add Facebook web config to app delegate. --- SimpleAuthDemo/SADAppDelegate.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index ea825fa..b5a44ff 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -51,6 +51,7 @@ - (void)configureAuthorizaionProviders { // app_id is required SimpleAuth.configuration[@"facebook"] = @{}; + SimpleAuth.configuration[@"facebook-web"] = @{}; // client_id and redirect_uri are required SimpleAuth.configuration[@"meetup"] = @{}; From 1bf855f933fd2a39bc1d674605816186e7f8982a Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:08:03 -0800 Subject: [PATCH 022/139] Move Facebook web provider to new web login api. --- .../SimpleAuthFaceBookWebProvider.m | 5 ++-- ...SimpleAuthFacebookWebLoginViewController.m | 30 +++++++------------ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 3a6d47b..52e4ea4 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -102,8 +102,9 @@ - (RACSignal *)accessToken { - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSDictionary *parameters = @{ @"access_token" : accessToken[@"access_token"] }; - NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; - NSString *URLString = [NSString stringWithFormat:@"https://graph.facebook.com/me?%@", query]; + NSString *URLString = [NSString stringWithFormat: + @"https://graph.facebook.com/me?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m index 79059c6..af3dc87 100644 --- a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m +++ b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m @@ -7,19 +7,20 @@ // #import "SimpleAuthFacebookWebLoginViewController.h" -#import "SimpleAuth.h" -@interface SimpleAuthFacebookWebLoginViewController () +@implementation SimpleAuthFacebookWebLoginViewController -@end +#pragma mark - SimpleAuthWebViewController -@implementation SimpleAuthFacebookWebLoginViewController +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Facebook"; + } + return self; +} -#pragma mark - UIViewController -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - +- (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"client_id" : self.options[@"app_id"], @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], @@ -30,18 +31,7 @@ - (void)viewDidAppear:(BOOL)animated { [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; - NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - [self.webView loadRequest:request]; -} - - -#pragma mark - SimpleAuthWebViewController - -- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - if ((self = [super initWithOptions:options requestToken:requestToken])) { - self.title = @"Facebook"; - } - return self; + return [NSURLRequest requestWithURL:URL]; } @end From 56d2aa753e5e0cbf747681a16f5cbebe4aea385e Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:12:29 -0800 Subject: [PATCH 023/139] Parse `expires_in` to `NSDate`. --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 52e4ea4..9b0e2c2 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -138,9 +138,11 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD dictionary[@"provider"] = [[self class] type]; // Credentials + NSTimeInterval expiresAtInterval = [accessToken[@"expires_in"] doubleValue]; + NSData *expiresAtDate = [NSDate dateWithTimeIntervalSinceNow:expiresAtInterval]; dictionary[@"credentials"] = @{ @"token" : accessToken[@"access_token"], - @"expires_in" : accessToken[@"expires_in"] + @"expires_at" : expiresAtDate }; // User ID From be6b41b272542485367afc21b20aa24315134a79 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:16:26 -0800 Subject: [PATCH 024/139] Update readme. --- Readme.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index ef3e826..6482b54 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -5,9 +5,10 @@ SimpleAuth is designed to do the hard work of social account login on iOS. It ha SimpleAuth currently has the following providers: - Facebook (system) +- Facebook (web) - Twitter (system) -- Instagram - Twitter (web) +- Instagram - Meetup - Tumblr @@ -19,7 +20,6 @@ I would like to have: - Foursquare - Dropbox - App Dot Net -- Facebook (web) ## Installing From 43b34cdc038903217f1eb7711389a68c34a50036 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:28:45 -0800 Subject: [PATCH 025/139] Add FacebookWeb subspec. --- SimpleAuth.podspec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 7334cf0..000f030 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -32,6 +32,13 @@ Pod::Spec.new do |s| ss.frameworks = 'Accounts', 'Social' end + s.subspec 'FacebookWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/FacebookWeb/**/*.{h,m}' + ss.frameworks = 'UIKit' + end + s.subspec 'Instagram' do |ss| ss.dependency 'SimpleAuth/Core' From cfc133071f6bca5f4dcc6dee7a7c4c25df404409 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 11:49:53 -0800 Subject: [PATCH 026/139] Add support for requesting permissions from Facebook web auth. --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 1 + .../FacebookWeb/SimpleAuthFacebookWebLoginViewController.m | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 9b0e2c2..838e7dd 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -41,6 +41,7 @@ + (NSDictionary *)defaultOptions { dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; dictionary[SimpleAuthRedirectURIKey] = @"https://www.facebook.com/connect/login_success.html"; + dictionary[@"permissions"] = @[ @"email" ]; return dictionary; } diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m index af3dc87..d6b937c 100644 --- a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m +++ b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m @@ -24,7 +24,8 @@ - (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"client_id" : self.options[@"app_id"], @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], - @"response_type" : @"token" + @"response_type" : @"token", + @"permissions" : [self.options[@"permissions"] componentsJoinedByString:@","] }; NSString *URLString = [NSString stringWithFormat: @"https://www.facebook.com/dialog/oauth?%@", From 4e3dd9133e719354c9d45648117396111dddad15 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 14:45:20 -0800 Subject: [PATCH 027/139] Change prefix on old category methods. --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 2 +- Providers/Instagram/SimpleAuthInstagramProvider.m | 2 +- Providers/Meetup/SimpleAuthMeetupProvider.m | 2 +- Providers/Tumblr/SimpleAuthTumblrProvider.m | 2 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 2 +- Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m | 2 +- SimpleAuth/UIViewController+SimpleAuthAdditions.h | 2 +- SimpleAuth/UIViewController+SimpleAuthAdditions.m | 4 ++-- SimpleAuth/UIWindow+SimpleAuthAdditions.h | 2 +- SimpleAuth/UIWindow+SimpleAuthAdditions.m | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 838e7dd..180ef56 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -28,7 +28,7 @@ + (NSDictionary *)defaultOptions { SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; navigation.modalPresentationStyle = UIModalPresentationFormSheet; - UIViewController *presented = [UIViewController sa_presentedViewController]; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; [presented presentViewController:navigation animated:YES completion:nil]; }; diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index 936d226..a815b83 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -28,7 +28,7 @@ + (NSDictionary *)defaultOptions { SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; navigation.modalPresentationStyle = UIModalPresentationFormSheet; - UIViewController *presented = [UIViewController sa_presentedViewController]; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; [presented presentViewController:navigation animated:YES completion:nil]; }; diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index 6aa2998..84df37c 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -25,7 +25,7 @@ + (NSDictionary *)defaultOptions { SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; navigationController.modalPresentationStyle = UIModalPresentationFormSheet; - UIViewController *presentedViewController = [UIViewController sa_presentedViewController]; + UIViewController *presentedViewController = [UIViewController SimpleAuth_presentedViewController]; [presentedViewController presentViewController:navigationController animated:YES completion:nil]; diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index f0a268b..d0de434 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -29,7 +29,7 @@ + (NSDictionary *)defaultOptions { SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; navigation.modalPresentationStyle = UIModalPresentationFormSheet; - UIViewController *presented = [UIViewController sa_presentedViewController]; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; [presented presentViewController:navigation animated:YES completion:nil]; }; diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 703274b..127674c 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -24,7 +24,7 @@ + (NSString *)type { + (NSDictionary *)defaultOptions { void (^actionSheetBlock) (UIActionSheet *) = ^(UIActionSheet *sheet) { - UIWindow *window = [UIWindow sa_mainWindow]; + UIWindow *window = [UIWindow SimpleAuth_mainWindow]; [sheet showInView:window]; }; diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 40163ac..fcf54a5 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -29,7 +29,7 @@ + (NSDictionary *)defaultOptions { SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; navigation.modalPresentationStyle = UIModalPresentationFormSheet; - UIViewController *presented = [UIViewController sa_presentedViewController]; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; [presented presentViewController:navigation animated:YES completion:nil]; }; diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.h b/SimpleAuth/UIViewController+SimpleAuthAdditions.h index 6ca37d2..6b4a805 100644 --- a/SimpleAuth/UIViewController+SimpleAuthAdditions.h +++ b/SimpleAuth/UIViewController+SimpleAuthAdditions.h @@ -8,6 +8,6 @@ @interface UIViewController (SimpleAuthAdditions) -+ (instancetype)sa_presentedViewController; ++ (instancetype)SimpleAuth_presentedViewController; @end diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.m b/SimpleAuth/UIViewController+SimpleAuthAdditions.m index 3601058..80cd8e4 100644 --- a/SimpleAuth/UIViewController+SimpleAuthAdditions.m +++ b/SimpleAuth/UIViewController+SimpleAuthAdditions.m @@ -11,8 +11,8 @@ @implementation UIViewController (SimpleAuthAdditions) -+ (instancetype)sa_presentedViewController { - UIWindow *window = [UIWindow sa_mainWindow]; ++ (instancetype)SimpleAuth_presentedViewController { + UIWindow *window = [UIWindow SimpleAuth_mainWindow]; UIViewController *controller = window.rootViewController; while (controller.presentedViewController) { controller = controller.presentedViewController; diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.h b/SimpleAuth/UIWindow+SimpleAuthAdditions.h index 8643442..66729af 100644 --- a/SimpleAuth/UIWindow+SimpleAuthAdditions.h +++ b/SimpleAuth/UIWindow+SimpleAuthAdditions.h @@ -8,6 +8,6 @@ @interface UIWindow (SimpleAuthAdditions) -+ (instancetype)sa_mainWindow; ++ (instancetype)SimpleAuth_mainWindow; @end diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.m b/SimpleAuth/UIWindow+SimpleAuthAdditions.m index 8f8a9ed..6f7ae4a 100644 --- a/SimpleAuth/UIWindow+SimpleAuthAdditions.m +++ b/SimpleAuth/UIWindow+SimpleAuthAdditions.m @@ -10,7 +10,7 @@ @implementation UIWindow (SimpleAuthAdditions) -+ (instancetype)sa_mainWindow { ++ (instancetype)SimpleAuth_mainWindow { return [[[UIApplication sharedApplication] delegate] window]; } From 00af24aa827225ffb70446844178408666496b9f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 22 Jan 2014 14:46:57 -0800 Subject: [PATCH 028/139] Link to wiki from readme. --- Readme.markdown | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 6482b54..9fe29b5 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -4,18 +4,14 @@ SimpleAuth is designed to do the hard work of social account login on iOS. It ha SimpleAuth currently has the following providers: -- Facebook (system) -- Facebook (web) -- Twitter (system) -- Twitter (web) -- Instagram -- Meetup -- Tumblr +- [Twitter](https://github.com/calebd/SimpleAuth/wiki/Twitter) +- [Facebook](https://github.com/calebd/SimpleAuth/wiki/Facebook) +- [Instagram](https://github.com/calebd/SimpleAuth/wiki/Instagram) +- [Tumblr](https://github.com/calebd/SimpleAuth/wiki/Tumblr) +- [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) I would like to have: -- Twitter xauth -- Tumblr xauth - GitHub - Foursquare - Dropbox From 00de99ee87eb63403476d602fe969bfd758508a4 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Thu, 23 Jan 2014 12:59:52 +0100 Subject: [PATCH 029/139] Add foursquare-web provider --- ...mpleAuthFoursquareWebLoginViewController.h | 13 ++ ...mpleAuthFoursquareWebLoginViewController.m | 36 ++++ .../SimpleAuthFoursquareWebProvider.h | 13 ++ .../SimpleAuthFoursquareWebProvider.m | 156 ++++++++++++++++++ SimpleAuth.xcodeproj/project.pbxproj | 20 +++ 5 files changed, 238 insertions(+) create mode 100644 Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h create mode 100644 Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m create mode 100644 Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h create mode 100644 Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h new file mode 100644 index 0000000..71945a2 --- /dev/null +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthFoursquareWebLoginViewController.h +// SimpleAuth +// +// Created by Julien Seren-Rosso on 23/01/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthFoursquareWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m new file mode 100644 index 0000000..a748f18 --- /dev/null +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m @@ -0,0 +1,36 @@ +// +// SimpleAuthFoursquareWebLoginViewController.m +// SimpleAuth +// +// Created by Julien Seren-Rosso on 23/01/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthFoursquareWebLoginViewController.h" + +@implementation SimpleAuthFoursquareWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Foursquare"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://foursquare.com/oauth2/authenticate?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} +@end diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h new file mode 100644 index 0000000..05e5879 --- /dev/null +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthFoursquareWebProvider.h +// SimpleAuth +// +// Created by Julien Seren-Rosso on 23/01/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthFoursquareWebProvider : SimpleAuthProvider + +@end diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m new file mode 100644 index 0000000..e9c6aef --- /dev/null +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -0,0 +1,156 @@ +// +// SimpleAuthFoursquareWebProvider.m +// SimpleAuth +// +// Created by Julien Seren-Rosso on 23/01/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthFoursquareWebProvider.h" +#import "SimpleAuthFoursquareWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthFoursquareWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"foursquare-web"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return options; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^RACStream *(NSString *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + +#pragma mark - Private + +- (RACSignal *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + SimpleAuthFoursquareWebLoginViewController *login = [[SimpleAuthFoursquareWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *token = dictionary[@"access_token"]; + + // Check for error + if (![token length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:token]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSString *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"oauth_token" : accessToken }; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSString *URLString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/users/self?%@", query]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSString *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + NSDictionary *userData = account[@"response"][@"user"]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken + }; + + // User ID + dictionary[@"uid"] = userData[@"id"]; + + // Raw response + dictionary[@"raw_info"] = account; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"first_name"] = userData[@"firstName"]; + user[@"last_name"] = userData[@"lastName"]; + user[@"photo"] = userData[@"photo"]; + dictionary[@"user_info"] = user; + + return dictionary; +} + + +@end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index c1875ea..b9a58dc 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -33,6 +33,8 @@ 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; + F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; + F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -102,6 +104,10 @@ 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; + F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; + F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; + F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; + F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebLoginViewController.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -127,6 +133,7 @@ 3B52BB8D1887088400C73329 /* Providers */ = { isa = PBXGroup; children = ( + F9BE4F32189120BE00AE303A /* FoursquareWeb */, 3B52BB9218871F6200C73329 /* Facebook */, 3B66656918903F4000F3BF58 /* FacebookWeb */, 3B52BB8E1887088400C73329 /* Twitter */, @@ -322,6 +329,17 @@ name = Meetup; sourceTree = ""; }; + F9BE4F32189120BE00AE303A /* FoursquareWeb */ = { + isa = PBXGroup; + children = ( + F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */, + F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */, + F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */, + F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */, + ); + path = FoursquareWeb; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -449,12 +467,14 @@ buildActionMask = 2147483647; files = ( 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, + F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, + F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, From 2fc99c00484fa7de96febe1d84b8423dd4db2b76 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Thu, 23 Jan 2014 13:02:44 +0100 Subject: [PATCH 030/139] Update demo project with foursquare-web provider --- SimpleAuth.xcodeproj/project.pbxproj | 2 ++ SimpleAuthDemo/SADAppDelegate.m | 3 +++ SimpleAuthDemo/SADProviderListViewController.m | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index b9a58dc..baee936 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -514,6 +514,7 @@ /* Begin XCBuildConfiguration section */ 3B658451188892FE00D59100 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -536,6 +537,7 @@ }; 3B658452188892FE00D59100 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index b5a44ff..6f33bd9 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -58,6 +58,9 @@ - (void)configureAuthorizaionProviders { // consumer_key and consumer_secret are required SimpleAuth.configuration[@"tumblr"] = @{}; + + // client_id and redirect_uri are required + SimpleAuth.configuration[@"foursquare-web"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index a2d2115..7266e4a 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -49,7 +49,8 @@ + (NSArray *)providers { @"facebook-web", @"instagram", @"meetup", - @"tumblr" + @"tumblr", + @"foursquare-web" ]; }); return array; From c4a7ef0ab7a28aad1e2c127c02f2e30bd4621523 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 10:46:11 -0800 Subject: [PATCH 031/139] Be sure to do UI things on the main thread. --- .../SimpleAuthFoursquareWebProvider.m | 101 +++++++++--------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index e9c6aef..f020b5d 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -45,13 +45,13 @@ + (NSDictionary *)defaultOptions { - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { [[[self accessToken] - flattenMap:^RACStream *(NSString *response) { - NSArray *signals = @[ - [self accountWithAccessToken:response], - [RACSignal return:response] - ]; - return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; - }] + flattenMap:^RACStream *(NSString *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] subscribeNext:^(NSDictionary *response) { completion(response, nil); } @@ -64,30 +64,31 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - SimpleAuthFoursquareWebLoginViewController *login = [[SimpleAuthFoursquareWebLoginViewController alloc] initWithOptions:self.options]; - login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { - SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; - dismissBlock(login); + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthFoursquareWebLoginViewController *login = [[SimpleAuthFoursquareWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *token = dictionary[@"access_token"]; + + // Check for error + if (![token length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:token]; + [subscriber sendCompleted]; + }; - // Parse URL - NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; - NSString *token = dictionary[@"access_token"]; - - // Check for error - if (![token length]) { - [subscriber sendError:nil]; - return; - } - - // Send completion - [subscriber sendNext:token]; - [subscriber sendCompleted]; - }; - - SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; - block(login); - + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); return nil; }]; } @@ -101,24 +102,24 @@ - (RACSignal *)accountWithAccessToken:(NSString *)accessToken { NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; - NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - if ([indexSet containsIndex:statusCode] && data) { - NSError *parseError = nil; - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; - if (dictionary) { - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; - } - else { - [subscriber sendError:parseError]; - } - } - else { - [subscriber sendError:connectionError]; - } - }]; + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; return nil; }]; } @@ -133,8 +134,8 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS // Credentials dictionary[@"credentials"] = @{ - @"token" : accessToken - }; + @"token" : accessToken + }; // User ID dictionary[@"uid"] = userData[@"id"]; From c66919169878a2ed589ada1f4138fce1d12d7cf7 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 10:47:40 -0800 Subject: [PATCH 032/139] Update Foursquare in Readme. --- Readme.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.markdown b/Readme.markdown index 9fe29b5..3cc3dd9 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -8,12 +8,12 @@ SimpleAuth currently has the following providers: - [Facebook](https://github.com/calebd/SimpleAuth/wiki/Facebook) - [Instagram](https://github.com/calebd/SimpleAuth/wiki/Instagram) - [Tumblr](https://github.com/calebd/SimpleAuth/wiki/Tumblr) +- [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) I would like to have: - GitHub -- Foursquare - Dropbox - App Dot Net From 8d8cc7897e075d1aed03e0d6fab1198676c980b6 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 10:48:26 -0800 Subject: [PATCH 033/139] Add Foursquare to pod spec. --- SimpleAuth.podspec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 000f030..2fd05f8 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -70,4 +70,11 @@ Pod::Spec.new do |s| ss.dependency 'cocoa-oauth' end + + s.subspec 'Foursquare' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' + ss.frameworks = 'UIKit' + end end \ No newline at end of file From 6cc427a02db9dabe1f1ae35256b2b909869a1672 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 10:53:18 -0800 Subject: [PATCH 034/139] Add contributors to readme. --- Readme.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Readme.markdown b/Readme.markdown index 3cc3dd9..9471ea0 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -90,3 +90,8 @@ SimpleAuth is released under the MIT license. ## Thanks Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising on the SimpleAuth API design. + +## Contributors + +- [kornifex](https://github.com/kornifex): Foursquare provider +- [mouhcine](https://github.com/mouhcine): Meetup provider From 811ee3219755a3500487fc858e387549c6f4ea79 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 10:54:00 -0800 Subject: [PATCH 035/139] Put contributors under thanks section. --- Readme.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.markdown b/Readme.markdown index 9471ea0..ef26b72 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -91,7 +91,7 @@ SimpleAuth is released under the MIT license. Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising on the SimpleAuth API design. -## Contributors +### Contributors - [kornifex](https://github.com/kornifex): Foursquare provider - [mouhcine](https://github.com/mouhcine): Meetup provider From bfa04101ae20fb9be4f77b5716498b4f55ed9128 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 12:17:32 -0800 Subject: [PATCH 036/139] Rename foursquare provider. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 2fd05f8..8e254bd 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -71,7 +71,7 @@ Pod::Spec.new do |s| ss.dependency 'cocoa-oauth' end - s.subspec 'Foursquare' do |ss| + s.subspec 'FoursquareWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' From 9b92e971b0e4954cc93498ae292cd29f0789b3dc Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 14:58:33 -0800 Subject: [PATCH 037/139] Use defined options key. --- Providers/Twitter/SimpleAuthTwitterProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 127674c..5bb7d2f 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -133,7 +133,7 @@ - (RACSignal *)twitterAccountFromAccounts:(NSArray *)accounts { }]; sheet.delegate = (id)sheet; - void (^block) (UIActionSheet *) = self.options[@"action_sheet_block"]; + void (^block) (UIActionSheet *) = self.options[SimpleAuthPresentInterfaceBlockKey]; block(sheet); }); return nil; From 90ff0eb1765cc88aa18e9cf523eed2f21105dc03 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 15:03:15 -0800 Subject: [PATCH 038/139] Be sure to do UI things on the main thread. --- .../Instagram/SimpleAuthInstagramProvider.m | 47 +++++++++--------- Providers/Meetup/SimpleAuthMeetupProvider.m | 42 ++++++++-------- .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 49 ++++++++++--------- 3 files changed, 71 insertions(+), 67 deletions(-) diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index a815b83..ff4703e 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -66,30 +66,31 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - SimpleAuthInstagramLoginViewController *login = [[SimpleAuthInstagramLoginViewController alloc] initWithOptions:self.options]; - login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { - SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; - dismissBlock(login); + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthInstagramLoginViewController *login = [[SimpleAuthInstagramLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *token = dictionary[@"access_token"]; + + // Check for error + if (![token length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:token]; + [subscriber sendCompleted]; + }; - // Parse URL - NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; - NSString *token = dictionary[@"access_token"]; - - // Check for error - if (![token length]) { - [subscriber sendError:nil]; - return; - } - - // Send completion - [subscriber sendNext:token]; - [subscriber sendCompleted]; - }; - - SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; - block(login); - + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); return nil; }]; } diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Providers/Meetup/SimpleAuthMeetupProvider.m index 84df37c..44afc98 100644 --- a/Providers/Meetup/SimpleAuthMeetupProvider.m +++ b/Providers/Meetup/SimpleAuthMeetupProvider.m @@ -44,26 +44,28 @@ + (NSDictionary *)defaultOptions { } - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - SimpleAuthMeetupLoginViewController *loginViewController = [[SimpleAuthMeetupLoginViewController alloc] initWithOptions:self.options]; - loginViewController.completion = ^(UIViewController *viewController, NSURL *URL, NSError *error) { - SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; - dismissBlock(viewController); - - NSString *fragment = [URL fragment]; - NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; - NSString *token = dictionary[@"access_token"]; - if ([token length] > 0) { - NSDictionary *credentials = @{@"token": token, - @"type" : @"bearer", - @"expireDate" : [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expires_in"] doubleValue]]}; - [self userWithCredentials:credentials - completion:completion]; - } else { - completion(nil, error); - } - }; - SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; - block(loginViewController); + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthMeetupLoginViewController *loginViewController = [[SimpleAuthMeetupLoginViewController alloc] initWithOptions:self.options]; + loginViewController.completion = ^(UIViewController *viewController, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(viewController); + + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *token = dictionary[@"access_token"]; + if ([token length] > 0) { + NSDictionary *credentials = @{@"token": token, + @"type" : @"bearer", + @"expireDate" : [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expires_in"] doubleValue]]}; + [self userWithCredentials:credentials + completion:completion]; + } else { + completion(nil, error); + } + }; + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(loginViewController); + }); } #pragma mark - Private diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index fcf54a5..8c3fa18 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -105,32 +105,33 @@ - (RACSignal *)requestToken { - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - SimpleAuthTwitterWebLoginViewController *login = [[SimpleAuthTwitterWebLoginViewController alloc] initWithOptions:self.options requestToken:requestToken]; - - login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { - SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; - block(controller); + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthTwitterWebLoginViewController *login = [[SimpleAuthTwitterWebLoginViewController alloc] initWithOptions:self.options requestToken:requestToken]; - // Parse URL - NSString *query = [URL query]; - NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; - NSString *token = dictionary[@"oauth_token"]; - NSString *verifier = dictionary[@"oauth_verifier"]; + login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; + block(controller); + + // Parse URL + NSString *query = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; + NSString *token = dictionary[@"oauth_token"]; + NSString *verifier = dictionary[@"oauth_verifier"]; + + // Check for error + if (![token length] || ![verifier length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + }; - // Check for error - if (![token length] || ![verifier length]) { - [subscriber sendError:nil]; - return; - } - - // Send completion - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; - }; - - SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; - block(login); - + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); return nil; }]; } From 43b769f3a1c930dafb49854bb0c0a1e00c231f63 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 23 Jan 2014 15:30:54 -0800 Subject: [PATCH 039/139] Add Dropbox web provider. --- .../SimpleAuthDropboxWebLoginViewController.h | 13 ++ .../SimpleAuthDropboxWebLoginViewController.m | 37 ++++ .../DropboxWeb/SimpleAuthDropboxWebProvider.h | 13 ++ .../DropboxWeb/SimpleAuthDropboxWebProvider.m | 160 ++++++++++++++++++ Readme.markdown | 2 +- SimpleAuth.podspec | 7 + SimpleAuth.xcodeproj/project.pbxproj | 20 +++ SimpleAuthDemo/SADAppDelegate.m | 3 + .../SADProviderListViewController.m | 3 +- 9 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h create mode 100644 Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m create mode 100644 Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h create mode 100644 Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h b/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h new file mode 100644 index 0000000..e426e80 --- /dev/null +++ b/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthDropboxWebLoginViewController.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/23/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthDropboxWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m b/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m new file mode 100644 index 0000000..69f68c0 --- /dev/null +++ b/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m @@ -0,0 +1,37 @@ +// +// SimpleAuthDropboxWebLoginViewController.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/23/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthDropboxWebLoginViewController.h" + +@implementation SimpleAuthDropboxWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Dropbox"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://www.dropbox.com/1/oauth2/authorize?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h b/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h new file mode 100644 index 0000000..b06ee0b --- /dev/null +++ b/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthDropboxWebProvider.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/23/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthDropboxWebProvider : SimpleAuthProvider + +@end diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m b/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m new file mode 100644 index 0000000..bfdd5f1 --- /dev/null +++ b/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m @@ -0,0 +1,160 @@ +// +// SimpleAuthDropboxWebProvider.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/23/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthDropboxWebProvider.h" +#import "SimpleAuthDropboxWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthDropboxWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"dropbox-web"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthDropboxWebLoginViewController *login = [[SimpleAuthDropboxWebLoginViewController alloc] initWithOptions:self.options]; + + login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; + block(controller); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + id token = dictionary[@"access_token"]; + + // Check for error + if (!token) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"access_token" : accessToken[@"access_token"] }; + NSString *URLString = [NSString stringWithFormat: + @"https://api.dropbox.com/1/account/info?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"access_token"], + @"type" : accessToken[@"token_type"] + }; + + // User ID + dictionary[@"uid"] = account[@"uid"]; + + // Raw response + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"email"] = account[@"email"]; + user[@"name"] = account[@"display_name"]; + dictionary[@"info"] = user; + + return dictionary; +} + +@end diff --git a/Readme.markdown b/Readme.markdown index ef26b72..3b2829e 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -8,13 +8,13 @@ SimpleAuth currently has the following providers: - [Facebook](https://github.com/calebd/SimpleAuth/wiki/Facebook) - [Instagram](https://github.com/calebd/SimpleAuth/wiki/Instagram) - [Tumblr](https://github.com/calebd/SimpleAuth/wiki/Tumblr) +- [Dropbox](https://github.com/calebd/SimpleAuth/wiki/Dropbox) - [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) I would like to have: - GitHub -- Dropbox - App Dot Net ## Installing diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 8e254bd..5a69312 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -77,4 +77,11 @@ Pod::Spec.new do |s| ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' ss.frameworks = 'UIKit' end + + s.subspec 'DropboxWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' + ss.frameworks = 'UIKit' + end end \ No newline at end of file diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index baee936..344ed86 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */; }; 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; + 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */; }; + 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */; }; 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */; }; 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; @@ -94,6 +96,10 @@ 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleAuth.m; sourceTree = ""; }; 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SimpleAuthAdditions.h"; sourceTree = ""; }; 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SimpleAuthAdditions.m"; sourceTree = ""; }; + 3BC5FC6E1891D86A00523166 /* SimpleAuthDropboxWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthDropboxWebProvider.h; sourceTree = ""; }; + 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthDropboxWebProvider.m; sourceTree = ""; }; + 3BC5FC711891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthDropboxWebLoginViewController.h; sourceTree = ""; }; + 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthDropboxWebLoginViewController.m; sourceTree = ""; }; 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthWebViewController.h; sourceTree = ""; }; 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthWebViewController.m; sourceTree = ""; }; 3C611F431835352200D87E45 /* UIWindow+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+SimpleAuthAdditions.h"; sourceTree = ""; }; @@ -141,6 +147,7 @@ 3B52BB96188731A300C73329 /* Instagram */, 4D149A3E1889B38C0024639C /* Meetup */, 3B65845D1888A93200D59100 /* Tumblr */, + 3BC5FC6D1891D80E00523166 /* DropboxWeb */, ); path = Providers; sourceTree = ""; @@ -296,6 +303,17 @@ name = "Supporting Files"; sourceTree = ""; }; + 3BC5FC6D1891D80E00523166 /* DropboxWeb */ = { + isa = PBXGroup; + children = ( + 3BC5FC6E1891D86A00523166 /* SimpleAuthDropboxWebProvider.h */, + 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */, + 3BC5FC711891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.h */, + 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */, + ); + path = DropboxWeb; + sourceTree = ""; + }; 3C0A5390182C4206002C050C /* View Controllers */ = { isa = PBXGroup; children = ( @@ -466,6 +484,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */, 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, @@ -480,6 +499,7 @@ 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */, + 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */, 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */, 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index 6f33bd9..a4d901b 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -61,6 +61,9 @@ - (void)configureAuthorizaionProviders { // client_id and redirect_uri are required SimpleAuth.configuration[@"foursquare-web"] = @{}; + + // client_id and redirect_uri are required + SimpleAuth.configuration[@"dropbox-web"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 7266e4a..f396b3d 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -50,7 +50,8 @@ + (NSArray *)providers { @"instagram", @"meetup", @"tumblr", - @"foursquare-web" + @"foursquare-web", + @"dropbox-web" ]; }); return array; From 602ad0efd3980e206ca6908fb9540631f849b45d Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 24 Jan 2014 14:00:46 -0800 Subject: [PATCH 040/139] Get ready for v0.3.1 tag. --- Readme.markdown | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 3b2829e..a5b4523 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -1,6 +1,6 @@ # SimpleAuth -SimpleAuth is designed to do the hard work of social account login on iOS. It has a small set of public APIs backed by a set of "providers" that implement the functionality needed to communicate with various social services. You can read more about it [here](http://blog.calebd.me/introducing-simpleauth). +SimpleAuth is designed to do the hard work of social account login on iOS. It has a small set of public APIs backed by a set of "providers" that implement the functionality needed to communicate with various social services. SimpleAuth currently has the following providers: @@ -12,11 +12,6 @@ SimpleAuth currently has the following providers: - [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) -I would like to have: - -- GitHub -- App Dot Net - ## Installing Install SimpleAuth with CocoaPods. For example, to use Facebook and Twitter authentication, add From 531fae82cb98f29f83500a3514044aa4a8620750 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 24 Jan 2014 14:06:00 -0800 Subject: [PATCH 041/139] Fix type mismatch warning. --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 180ef56..088577a 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -140,7 +140,7 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD // Credentials NSTimeInterval expiresAtInterval = [accessToken[@"expires_in"] doubleValue]; - NSData *expiresAtDate = [NSDate dateWithTimeIntervalSinceNow:expiresAtInterval]; + NSDate *expiresAtDate = [NSDate dateWithTimeIntervalSinceNow:expiresAtInterval]; dictionary[@"credentials"] = @{ @"token" : accessToken[@"access_token"], @"expires_at" : expiresAtDate From cc88f04eb8267f3f342e72000036ab9c593ab7e9 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sat, 25 Jan 2014 21:04:36 -0800 Subject: [PATCH 042/139] Make a new account store helper. - Add class category for accessing accounts of a given type. - Move Facebook provider to new account access pattern. --- .../Facebook/SimpleAuthFacebookProvider.h | 4 +- .../Facebook/SimpleAuthFacebookProvider.m | 40 ++++------------ SimpleAuth.xcodeproj/project.pbxproj | 6 +++ SimpleAuth/ACAccountStore+SimpleAuth.h | 35 ++++++++++++++ SimpleAuth/ACAccountStore+SimpleAuth.m | 48 +++++++++++++++++++ 5 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 SimpleAuth/ACAccountStore+SimpleAuth.h create mode 100644 SimpleAuth/ACAccountStore+SimpleAuth.m diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.h b/Providers/Facebook/SimpleAuthFacebookProvider.h index f14c025..389f1ca 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.h +++ b/Providers/Facebook/SimpleAuthFacebookProvider.h @@ -6,8 +6,8 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthSystemProvider.h" +#import "SimpleAuthProvider.h" -@interface SimpleAuthFacebookProvider : SimpleAuthSystemProvider +@interface SimpleAuthFacebookProvider : SimpleAuthProvider @end diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 8cf7b61..893ec10 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -8,8 +8,11 @@ #import "SimpleAuthFacebookProvider.h" +#import "ACAccountStore+SimpleAuth.h" #import +@import Social; + @implementation SimpleAuthFacebookProvider #pragma mark - SimpleAuthProvider @@ -47,40 +50,17 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { #pragma mark - Private - (RACSignal *)systemAccounts { - return [RACSignal createSignal:^RACDisposable *(id subscriber) { - ACAccountStore *store = [[self class] accountStore]; - ACAccountType *type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; - NSDictionary *options = @{ - ACFacebookAppIdKey : self.options[@"app_id"], - ACFacebookPermissionsKey : self.options[@"permissions"] - }; - [store requestAccessToAccountsWithType:type options:options completion:^(BOOL granted, NSError *error) { - if (granted) { - NSArray *accounts = [store accountsWithAccountType:type]; - NSUInteger numberOfAccounts = [accounts count]; - if (numberOfAccounts == 0) { - error = (error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorAccountNotFound userInfo:nil]); - [subscriber sendError:error]; - } - else { - [subscriber sendNext:accounts]; - [subscriber sendCompleted]; - } - } - else { - error = (error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorPermissionDenied userInfo:nil]); - [subscriber sendError:error]; - } - }]; - return nil; - }]; + NSDictionary *options = @{ + ACFacebookAppIdKey : self.options[@"app_id"], + ACFacebookPermissionsKey : self.options[@"permissions"] + }; + return [ACAccountStore SimpleAuth_accountsWithTypeIdentifier:ACAccountTypeIdentifierFacebook options:options]; } - (RACSignal *)systemAccount { - return [[self systemAccounts] flattenMap:^RACStream *(NSArray *accounts) { - ACAccount *account = [accounts lastObject]; - return [RACSignal return:account]; + return [[self systemAccounts] map:^(NSArray *accounts) { + return [accounts lastObject]; }]; } diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 344ed86..3c590c4 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */; }; 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB901887088400C73329 /* SimpleAuthTwitterProvider.m */; }; 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB9418871F6200C73329 /* SimpleAuthFacebookProvider.m */; }; 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB98188731A300C73329 /* SimpleAuthInstagramLoginViewController.m */; }; @@ -52,6 +53,8 @@ /* Begin PBXFileReference section */ 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; + 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ACAccountStore+SimpleAuth.h"; sourceTree = ""; }; + 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ACAccountStore+SimpleAuth.m"; sourceTree = ""; }; 3B52BB8F1887088400C73329 /* SimpleAuthTwitterProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterProvider.h; sourceTree = ""; }; 3B52BB901887088400C73329 /* SimpleAuthTwitterProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterProvider.m; sourceTree = ""; }; 3B52BB9318871F6200C73329 /* SimpleAuthFacebookProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFacebookProvider.h; sourceTree = ""; }; @@ -332,6 +335,8 @@ 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */, 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */, 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */, + 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */, + 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */, ); name = Categories; sourceTree = ""; @@ -505,6 +510,7 @@ 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, + 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, ); diff --git a/SimpleAuth/ACAccountStore+SimpleAuth.h b/SimpleAuth/ACAccountStore+SimpleAuth.h new file mode 100644 index 0000000..ada2a73 --- /dev/null +++ b/SimpleAuth/ACAccountStore+SimpleAuth.h @@ -0,0 +1,35 @@ +// +// ACAccountStore+SimpleAuth.h +// SimpleAuth +// +// Created by Caleb Davenport on 1/25/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +@import Accounts; +@class RACSignal; + +@interface ACAccountStore (SimpleAuth) + +/** + Access a shared account store instance. + + @return A shared account store. + */ ++ (instancetype)SimpleAuth_sharedAccountStore; + +/** + Creates and returns a signal that sends next with all system accounts of the + given type. This is a convenience wrapper for + `-[ACAccountStore requestAccessToAccountsWithType:options:completion:]`. + + @return A signal that sends next with all system accounts of the given type. + + @param typeIdentifier Value passed to + `-[ACAccountStore accountTypeWithAccountTypeIdentifier:]` + @param options Value passed to + `-[ACAccountStore requestAccessToAccountsWithType:options:completion:]`. + */ ++ (RACSignal *)SimpleAuth_accountsWithTypeIdentifier:(NSString *)typeIdentifier options:(NSDictionary *)options; + +@end diff --git a/SimpleAuth/ACAccountStore+SimpleAuth.m b/SimpleAuth/ACAccountStore+SimpleAuth.m new file mode 100644 index 0000000..211853e --- /dev/null +++ b/SimpleAuth/ACAccountStore+SimpleAuth.m @@ -0,0 +1,48 @@ +// +// ACAccountStore+SimpleAuth.m +// SimpleAuth +// +// Created by Caleb Davenport on 1/25/14. +// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. +// + +#import "ACAccountStore+SimpleAuth.h" +#import + +@implementation ACAccountStore (SimpleAuth) + ++ (instancetype)SimpleAuth_sharedAccountStore { + static dispatch_once_t token; + static ACAccountStore *store; + dispatch_once(&token, ^{ + store = [ACAccountStore new]; + }); + return store; +} + + ++ (RACSignal *)SimpleAuth_accountsWithTypeIdentifier:(NSString *)typeIdentifier options:(NSDictionary *)options { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + ACAccountStore *store = [self SimpleAuth_sharedAccountStore]; + ACAccountType *type = [store accountTypeWithAccountTypeIdentifier:typeIdentifier]; + [store requestAccessToAccountsWithType:type options:options completion:^(BOOL granted, NSError *error) { + if (granted) { + NSArray *accounts = [store accountsWithAccountType:type]; + NSUInteger numberOfAccounts = [accounts count]; + if (numberOfAccounts == 0) { + [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorAccountNotFound userInfo:nil])]; + } + else { + [subscriber sendNext:accounts]; + [subscriber sendCompleted]; + } + } + else { + [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorPermissionDenied userInfo:nil])]; + } + }]; + return nil; + }]; +} + +@end From c234d309096fdab5b94f44d6c89a4c7fb154b943 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sat, 25 Jan 2014 21:42:21 -0800 Subject: [PATCH 043/139] Some cleanup of the Twitter provider before I refactor it. --- .../Facebook/SimpleAuthFacebookProvider.m | 4 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 116 +++++++----------- 2 files changed, 46 insertions(+), 74 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 893ec10..820da52 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -49,7 +49,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { #pragma mark - Private -- (RACSignal *)systemAccounts { +- (RACSignal *)allSystemAccounts { NSDictionary *options = @{ ACFacebookAppIdKey : self.options[@"app_id"], ACFacebookPermissionsKey : self.options[@"permissions"] @@ -59,7 +59,7 @@ - (RACSignal *)systemAccounts { - (RACSignal *)systemAccount { - return [[self systemAccounts] map:^(NSArray *accounts) { + return [[self allSystemAccounts] map:^(NSArray *accounts) { return [accounts lastObject]; }]; } diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 5bb7d2f..7a2a1c8 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -9,7 +9,7 @@ #import "SimpleAuthTwitterProvider.h" #import "UIWindow+SimpleAuthAdditions.h" - +#import "ACAccountStore+SimpleAuth.h" #import #import @@ -43,7 +43,7 @@ - (void)authorizeWithSystemAccount:(ACAccount *)account completion:(SimpleAuthRe RACSignal *zipSignal = [RACSignal zip:@[ accountSignal, accessTokenSignal ] reduce:^(NSDictionary *accountDictionary, NSDictionary *accessTokenDictionary) { return [self responseWithAccount:account accountDictionary:accountDictionary accessTokenDictionary:accessTokenDictionary]; }]; - [[zipSignal deliverOn:[RACScheduler mainThreadScheduler]] + [zipSignal subscribeNext:^(NSDictionary *dictionary) { completion(dictionary, nil); } @@ -54,8 +54,7 @@ - (void)authorizeWithSystemAccount:(ACAccount *)account completion:(SimpleAuthRe - (void)loadSystemAccount:(SimpleAuthSystemAccountHandler)completion { - [[[self selectedTwitterAccount] - deliverOn:[RACScheduler mainThreadScheduler]] + [[self systemAccount] subscribeNext:^(ACAccount *account) { completion(account, nil); } @@ -67,45 +66,25 @@ - (void)loadSystemAccount:(SimpleAuthSystemAccountHandler)completion { #pragma mark - Private -- (RACSignal *)allTwitterAccounts { - return [RACSignal createSignal:^RACDisposable *(id subscriber) { - ACAccountStore *store = [[self class] accountStore]; - ACAccountType *type = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; - [store requestAccessToAccountsWithType:type options:nil completion:^(BOOL granted, NSError *error) { - if (granted) { - NSArray *accounts = [store accountsWithAccountType:type]; - NSUInteger numberOfAccounts = [accounts count]; - if (numberOfAccounts) { - [subscriber sendNext:accounts]; - [subscriber sendCompleted]; - } - else { - [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorAccountNotFound userInfo:nil])]; - } - } - else { - [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorPermissionDenied userInfo:nil])]; - } - }]; - return nil; - }]; +- (RACSignal *)allSystemAccounts { + return [ACAccountStore SimpleAuth_accountsWithTypeIdentifier:ACAccountTypeIdentifierTwitter options:nil]; } -- (RACSignal *)selectedTwitterAccount { - return [[self allTwitterAccounts] flattenMap:^RACStream *(NSArray *accounts) { +- (RACSignal *)systemAccount { + return [[self allSystemAccounts] flattenMap:^RACStream *(NSArray *accounts) { if ([accounts count] == 1) { ACAccount *account = [accounts lastObject]; return [RACSignal return:account]; } else { - return [self twitterAccountFromAccounts:accounts]; + return [self systemAccountFromAccounts:accounts]; } }]; } -- (RACSignal *)twitterAccountFromAccounts:(NSArray *)accounts { +- (RACSignal *)systemAccountFromAccounts:(NSArray *)accounts { return [RACSignal createSignal:^RACDisposable *(id subscriber) { dispatch_async(dispatch_get_main_queue(), ^{ UIActionSheet *sheet = [UIActionSheet new]; @@ -133,7 +112,7 @@ - (RACSignal *)twitterAccountFromAccounts:(NSArray *)accounts { }]; sheet.delegate = (id)sheet; - void (^block) (UIActionSheet *) = self.options[SimpleAuthPresentInterfaceBlockKey]; + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; block(sheet); }); return nil; @@ -141,29 +120,29 @@ - (RACSignal *)twitterAccountFromAccounts:(NSArray *)accounts { } -- (RACSignal *)requestTokenWithParameters:(NSDictionary *)parameters { +- (RACSignal *)reverseAuthRequestToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"x_auth_mode" : @"reverse_auth" }; NSURLRequest *request = [GCOAuth - URLRequestForPath:@"/oauth/request_token" - POSTParameters:parameters - scheme:@"https" - host:@"api.twitter.com" - consumerKey:self.options[@"consumer_key"] - consumerSecret:self.options[@"consumer_secret"] - accessToken:nil - tokenSecret:nil]; - [NSURLConnection - sendAsynchronousRequest:request - queue:[NSOperationQueue mainQueue] - completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { + URLRequestForPath:@"/oauth/request_token" + POSTParameters:parameters + scheme:@"https" + host:@"api.twitter.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:nil + tokenSecret:nil]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - if (statusCode == 200 && data) { + if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; [subscriber sendNext:string]; [subscriber sendCompleted]; } else { - [subscriber sendError:error]; + [subscriber sendError:connectionError]; } }]; return nil; @@ -181,21 +160,24 @@ - (RACSignal *)accessTokenWithAccount:(ACAccount *)account { - (RACSignal *)twitterAccountWithAccount:(ACAccount *)account { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSURL *URL = [NSURL URLWithString:@"https://api.twitter.com/1.1/account/verify_credentials.json"]; - SLRequest *request = [SLRequest - requestForServiceType:SLServiceTypeTwitter - requestMethod:SLRequestMethodGET - URL:URL - parameters:nil]; + SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:URL parameters:nil]; request.account = account; - [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error) { + [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [response statusCode]; - if (statusCode == 200 && data) { - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendNext:parseError]; + } } else { - [subscriber sendError:error]; + [subscriber sendError:connectionError]; } }]; return nil; @@ -203,13 +185,6 @@ - (RACSignal *)twitterAccountWithAccount:(ACAccount *)account { } -- (RACSignal *)reverseAuthRequestToken { - return [self requestTokenWithParameters:@{ - @"x_auth_mode" : @"reverse_auth" - }]; -} - - - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account:(ACAccount *)account { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSURL *URL = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"]; @@ -217,22 +192,19 @@ - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account: @"x_reverse_auth_parameters" : token, @"x_reverse_auth_target" : self.options[@"consumer_key"] }; - SLRequest *request = [SLRequest - requestForServiceType:SLServiceTypeTwitter - requestMethod:SLRequestMethodPOST - URL:URL - parameters:parameters]; + SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:URL parameters:parameters]; request.account = account; - [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error) { + [request performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [response statusCode]; - if (statusCode == 200 && data) { + if ([indexSet containsIndex:statusCode] && data) { NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; [subscriber sendNext:dictionary]; [subscriber sendCompleted]; } else { - [subscriber sendError:error]; + [subscriber sendError:connectionError]; } }]; return nil; From 59123b63b1134c5164c6e7ca03fe134f5743a9bd Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 11:27:12 -0800 Subject: [PATCH 044/139] Finish refactoring system providers to standard provider API. --- Providers/Twitter/SimpleAuthTwitterProvider.h | 4 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 62 ++++++++----------- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.h b/Providers/Twitter/SimpleAuthTwitterProvider.h index 399a86d..ba74888 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.h +++ b/Providers/Twitter/SimpleAuthTwitterProvider.h @@ -6,8 +6,8 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthSystemProvider.h" +#import "SimpleAuthProvider.h" -@interface SimpleAuthTwitterProvider : SimpleAuthSystemProvider +@interface SimpleAuthTwitterProvider : SimpleAuthProvider @end diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 7a2a1c8..3688fd7 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -13,6 +13,8 @@ #import #import +@import Social; + @implementation SimpleAuthTwitterProvider #pragma mark - SimpleAuthProvider @@ -35,28 +37,18 @@ + (NSDictionary *)defaultOptions { } -#pragma mark - SimpleAuthSystemProvider - -- (void)authorizeWithSystemAccount:(ACAccount *)account completion:(SimpleAuthRequestHandler)completion { - RACSignal *accountSignal = [self twitterAccountWithAccount:account]; - RACSignal *accessTokenSignal = [self accessTokenWithAccount:account]; - RACSignal *zipSignal = [RACSignal zip:@[ accountSignal, accessTokenSignal ] reduce:^(NSDictionary *accountDictionary, NSDictionary *accessTokenDictionary) { - return [self responseWithAccount:account accountDictionary:accountDictionary accessTokenDictionary:accessTokenDictionary]; - }]; - [zipSignal - subscribeNext:^(NSDictionary *dictionary) { - completion(dictionary, nil); - } - error:^(NSError *error) { - completion(nil, error); - }]; -} - - -- (void)loadSystemAccount:(SimpleAuthSystemAccountHandler)completion { - [[self systemAccount] - subscribeNext:^(ACAccount *account) { - completion(account, nil); +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self systemAccount] + flattenMap:^(ACAccount *account) { + NSArray *signals = @[ + [RACSignal return:account], + [self remoteAccountWithSystemAccount:account], + [self accessTokenWithSystemAccount:account] + ]; + return [self rac_liftSelector:@selector(dictionaryWithSystemAccount:remoteAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); } error:^(NSError *error) { completion(nil, error); @@ -150,14 +142,14 @@ - (RACSignal *)reverseAuthRequestToken { } -- (RACSignal *)accessTokenWithAccount:(ACAccount *)account { +- (RACSignal *)accessTokenWithSystemAccount:(ACAccount *)account { return [[self reverseAuthRequestToken] flattenMap:^(NSString *token) { return [self accessTokenWithReverseAuthRequestToken:token account:account]; }]; } -- (RACSignal *)twitterAccountWithAccount:(ACAccount *)account { +- (RACSignal *)remoteAccountWithSystemAccount:(ACAccount *)account { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSURL *URL = [NSURL URLWithString:@"https://api.twitter.com/1.1/account/verify_credentials.json"]; SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:URL parameters:nil]; @@ -212,7 +204,7 @@ - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account: } -- (NSDictionary *)responseWithAccount:(ACAccount *)account accountDictionary:(NSDictionary *)accountDictionary accessTokenDictionary:(NSDictionary *)accessToken { +- (NSDictionary *)dictionaryWithSystemAccount:(ACAccount *)systemAccount remoteAccount:(NSDictionary *)remoteAccount accessToken:(NSDictionary *)accessToken { NSMutableDictionary *dictionary = [NSMutableDictionary new]; // Provider @@ -225,31 +217,31 @@ - (NSDictionary *)responseWithAccount:(ACAccount *)account accountDictionary:(NS }; // User ID - dictionary[@"uid"] = accountDictionary[@"id"]; + dictionary[@"uid"] = remoteAccount[@"id"]; // Extra dictionary[@"extra"] = @{ - @"raw_info" : accountDictionary, - @"account" : account + @"raw_info" : remoteAccount, + @"account" : systemAccount }; // Profile image - NSString *avatar = accountDictionary[@"profile_image_url_https"]; + NSString *avatar = remoteAccount[@"profile_image_url_https"]; avatar = [avatar stringByReplacingOccurrencesOfString:@"_normal" withString:@""]; // Profile - NSString *profile = [NSString stringWithFormat:@"https://twitter.com/%@", accountDictionary[@"screen_name"]]; + NSString *profile = [NSString stringWithFormat:@"https://twitter.com/%@", remoteAccount[@"screen_name"]]; // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"nickname"] = accountDictionary[@"screen_name"]; - user[@"name"] = accountDictionary[@"name"]; - user[@"location"] = accountDictionary[@"location"]; + user[@"nickname"] = remoteAccount[@"screen_name"]; + user[@"name"] = remoteAccount[@"name"]; + user[@"location"] = remoteAccount[@"location"]; user[@"image"] = avatar; - user[@"description"] = accountDictionary[@"description"]; + user[@"description"] = remoteAccount[@"description"]; user[@"urls"] = @{ @"Twitter" : profile, - @"Website" : accountDictionary[@"url"] + @"Website" : remoteAccount[@"url"] }; dictionary[@"info"] = user; From 5c3e920516f869ed9e7a0b64376d2d510886dcc6 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 11:35:53 -0800 Subject: [PATCH 045/139] Use old Ruby hash syntax. --- Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Podfile b/Podfile index c1f9133..636556f 100644 --- a/Podfile +++ b/Podfile @@ -1,3 +1,3 @@ platform :ios, '6.0' -podspec name: 'SimpleAuth' \ No newline at end of file +podspec :name => 'SimpleAuth' \ No newline at end of file From e2123fbb798f3f3bc6c48aaf6bcd36b1fb341e2e Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:10:25 -0800 Subject: [PATCH 046/139] Add ability to pass scope to Instagram. --- .../SimpleAuthInstagramLoginViewController.m | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m index f74352b..439f0ab 100644 --- a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m +++ b/Providers/Instagram/SimpleAuthInstagramLoginViewController.m @@ -21,11 +21,13 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona - (NSURLRequest *)initialRequest { - NSDictionary *parameters = @{ - @"client_id" : self.options[@"client_id"], - @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], - @"response_type" : @"token" - }; + NSMutableDictionary *parameters = [NSMutableDictionary new]; + parameters[@"client_id"] = self.options[@"client_id"]; + parameters[@"redirect_uri"] = self.options[SimpleAuthRedirectURIKey]; + parameters[@"response_type"] = @"token"; + if (self.options[@"scope"]) { + parameters[@"scope"] = [self.options[@"scope"] componentsJoinedByString:@" "]; + } NSString *URLString = [NSString stringWithFormat: @"https://instagram.com/oauth/authorize/?%@", [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; From 67cb1c7071e3e2f65318587472f78a0e42bf4cc0 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:26:26 -0800 Subject: [PATCH 047/139] Better cancel error handling. --- Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m | 2 +- Providers/Instagram/SimpleAuthInstagramProvider.m | 2 +- Providers/Tumblr/SimpleAuthTumblrProvider.m | 2 +- Providers/Twitter/SimpleAuthTwitterProvider.m | 2 +- Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m | 2 +- SimpleAuth/SimpleAuth.h | 4 +++- SimpleAuth/SimpleAuth.m | 2 -- SimpleAuth/SimpleAuthWebViewController.h | 5 ----- SimpleAuth/SimpleAuthWebViewController.m | 8 ++++---- 9 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index f020b5d..189f8df 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -77,7 +77,7 @@ - (RACSignal *)accessToken { // Check for error if (![token length]) { - [subscriber sendError:nil]; + [subscriber sendError:error]; return; } diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index ff4703e..baf9ec9 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -79,7 +79,7 @@ - (RACSignal *)accessToken { // Check for error if (![token length]) { - [subscriber sendError:nil]; + [subscriber sendError:error]; return; } diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index d0de434..1b5b83e 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -124,7 +124,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Check for error if (![token length] || ![verifier length]) { - [subscriber sendError:nil]; + [subscriber sendError:error]; return; } diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 3688fd7..930aaca 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -93,7 +93,7 @@ - (RACSignal *)systemAccountFromAccounts:(NSArray *)accounts { RACTupleUnpack(UIActionSheet *sheet, NSNumber *number) = tuple; NSInteger index = [number integerValue]; if (index == sheet.cancelButtonIndex) { - NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthUserCancelledErrorCode userInfo:nil]; + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorUserCancelled userInfo:nil]; [subscriber sendError:error]; } else { diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 8c3fa18..08ce8dd 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -120,7 +120,7 @@ - (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { // Check for error if (![token length] || ![verifier length]) { - [subscriber sendError:nil]; + [subscriber sendError:error]; return; } diff --git a/SimpleAuth/SimpleAuth.h b/SimpleAuth/SimpleAuth.h index 191c482..14042d3 100644 --- a/SimpleAuth/SimpleAuth.h +++ b/SimpleAuth/SimpleAuth.h @@ -7,7 +7,9 @@ // extern NSString * const SimpleAuthErrorDomain; -extern NSInteger const SimpleAuthUserCancelledErrorCode; +enum { + SimpleAuthErrorUserCancelled +}; /** Called when authorization either completes with a response or fails with an diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index eca2bf8..bae4273 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -18,8 +18,6 @@ NSString * const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; NSString * const SimpleAuthRedirectURIKey = @"redirect_uri"; -NSInteger const SimpleAuthUserCancelledErrorCode = NSUserCancelledError; - @implementation SimpleAuth #pragma mark - NSObject diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index 72d4097..abceafd 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -50,9 +50,4 @@ typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController * */ - (BOOL)isTargetRedirectURL:(NSURL *)URL; -/** - Tells the receiver to run the dismiss block provided in options. - */ -- (void)dismiss; - @end diff --git a/SimpleAuth/SimpleAuthWebViewController.m b/SimpleAuth/SimpleAuthWebViewController.m index 38c5e0d..1cf0b71 100644 --- a/SimpleAuth/SimpleAuthWebViewController.m +++ b/SimpleAuth/SimpleAuthWebViewController.m @@ -51,7 +51,7 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self - action:@selector(dismiss)]; + action:@selector(cancel)]; } return self; } @@ -75,9 +75,9 @@ - (id)responseObjectFromRedirectURL:(NSURL *)URL { } -- (void)dismiss { - SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; - block(self); +- (void)cancel { + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorUserCancelled userInfo:nil]; + self.completion(self, nil, error); } From ac865719dcd08d9c91dfe9486865e6a0c6121148 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:33:49 -0800 Subject: [PATCH 048/139] Remove SimpleAuthSystemProvider. --- SimpleAuth.xcodeproj/project.pbxproj | 6 ---- SimpleAuth/SimpleAuth.m | 3 +- SimpleAuth/SimpleAuthSystemProvider.h | 24 ------------- SimpleAuth/SimpleAuthSystemProvider.m | 49 --------------------------- 4 files changed, 1 insertion(+), 81 deletions(-) delete mode 100644 SimpleAuth/SimpleAuthSystemProvider.h delete mode 100644 SimpleAuth/SimpleAuthSystemProvider.m diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 3c590c4..47568a9 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -25,7 +25,6 @@ 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; - 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */; }; 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */; }; @@ -91,8 +90,6 @@ 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebLoginViewController.m; sourceTree = ""; }; 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthProvider.h; sourceTree = ""; }; 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthProvider.m; sourceTree = ""; }; - 3B9AB06C182ACCBB0011FB9E /* SimpleAuthSystemProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSystemProvider.h; sourceTree = ""; }; - 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSystemProvider.m; sourceTree = ""; }; 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSimpleAuth.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuth-Prefix.pch"; sourceTree = ""; }; 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleAuth.h; sourceTree = ""; }; @@ -246,8 +243,6 @@ children = ( 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */, 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */, - 3B9AB06C182ACCBB0011FB9E /* SimpleAuthSystemProvider.h */, - 3B9AB06D182ACCBB0011FB9E /* SimpleAuthSystemProvider.m */, ); name = Providers; sourceTree = ""; @@ -501,7 +496,6 @@ F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, - 3B9AB06E182ACCBB0011FB9E /* SimpleAuthSystemProvider.m in Sources */, 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */, 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */, diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index bae4273..95d31c4 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -7,7 +7,6 @@ // #import "SimpleAuthProvider.h" -#import "SimpleAuthSystemProvider.h" #import "NSObject+SimpleAuthAdditions.h" @@ -96,7 +95,7 @@ + (NSMutableDictionary *)providers { + (void)loadProviders { NSSet *set = [NSSet setWithArray:@[ - [SimpleAuthProvider class], [SimpleAuthSystemProvider class] + [SimpleAuthProvider class] ]]; [SimpleAuthProvider SimpleAuth_enumerateSubclassesExcludingClasses:set withBlock:^(Class klass) { [self registerProviderClass:klass]; diff --git a/SimpleAuth/SimpleAuthSystemProvider.h b/SimpleAuth/SimpleAuthSystemProvider.h deleted file mode 100644 index 8fa2275..0000000 --- a/SimpleAuth/SimpleAuthSystemProvider.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// SimpleAuthSystemProvider.h -// SimpleAuth -// -// Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. -// - -#import "SimpleAuthProvider.h" - -@import Accounts; -@import Social; - -typedef void (^SimpleAuthSystemAccountHandler) (ACAccount *account, NSError *error); - -@interface SimpleAuthSystemProvider : SimpleAuthProvider - -+ (ACAccountStore *)accountStore; - -- (void)loadSystemAccount:(SimpleAuthSystemAccountHandler)completion; - -- (void)authorizeWithSystemAccount:(ACAccount *)account completion:(SimpleAuthRequestHandler)completion; - -@end diff --git a/SimpleAuth/SimpleAuthSystemProvider.m b/SimpleAuth/SimpleAuthSystemProvider.m deleted file mode 100644 index 818c9fe..0000000 --- a/SimpleAuth/SimpleAuthSystemProvider.m +++ /dev/null @@ -1,49 +0,0 @@ -// -// SimpleAuthSystemProvider.m -// SimpleAuth -// -// Created by Caleb Davenport on 11/6/13. -// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. -// - -#import "SimpleAuthSystemProvider.h" - -@import Accounts; - -@implementation SimpleAuthSystemProvider - -#pragma mark - SimpleAuthProvider - -- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - [self loadSystemAccount:^(ACAccount *account, NSError *error) { - if (!account) { - completion(nil, error); - return; - } - [self authorizeWithSystemAccount:account completion:completion]; - }]; -} - - -#pragma mark - Public - -+ (ACAccountStore *)accountStore { - static dispatch_once_t token; - static ACAccountStore *store; - dispatch_once(&token, ^{ - store = [[ACAccountStore alloc] init]; - }); - return store; -} - - -- (void)loadSystemAccount:(SimpleAuthSystemAccountHandler)completion { - [self doesNotRecognizeSelector:_cmd]; -} - - -- (void)authorizeWithSystemAccount:(ACAccount *)account completion:(SimpleAuthRequestHandler)completion { - [self doesNotRecognizeSelector:_cmd]; -} - -@end From 288c07985758e55901ee182a5258115139d7cc2d Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:34:00 -0800 Subject: [PATCH 049/139] Update Pods. --- Podfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 0f1ca40..86b53b7 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -3,12 +3,12 @@ PODS: - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.2): + - ReactiveCocoa (2.2.3): - ReactiveCocoa/Core - ReactiveCocoa/no-arc - - ReactiveCocoa/Core (2.2): + - ReactiveCocoa/Core (2.2.3): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.2) + - ReactiveCocoa/no-arc (2.2.3) DEPENDENCIES: - CMDQueryStringSerialization @@ -19,6 +19,6 @@ SPEC CHECKSUMS: CMDQueryStringSerialization: f6118185b92689188026e648c4eb5e2c87b5835b cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 - ReactiveCocoa: 5b340678dc3168d6c9a2ca70fb83df683c08ca02 + ReactiveCocoa: b3cb6ebd50f1a0f2e39c6fd7ce3c428b6efcb22b COCOAPODS: 0.29.0 From b93f7bd884381bd05a295379aba7e350549118e3 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 17:05:46 -0800 Subject: [PATCH 050/139] Minor cleanup. --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 1 - .../SimpleAuthFoursquareWebLoginViewController.m | 8 ++++---- Providers/Instagram/SimpleAuthInstagramProvider.m | 1 - Providers/Tumblr/SimpleAuthTumblrProvider.m | 1 - Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m | 1 - SimpleAuth/SimpleAuthProvider.h | 4 ++-- SimpleAuth/SimpleAuthWebViewController.h | 4 ++-- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 088577a..10d356d 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -10,7 +10,6 @@ #import "SimpleAuthFacebookWebLoginViewController.h" #import "UIViewController+SimpleAuthAdditions.h" - #import @implementation SimpleAuthFaceBookWebProvider diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m index a748f18..2d91121 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m @@ -22,10 +22,10 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona - (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ - @"client_id" : self.options[@"client_id"], - @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], - @"response_type" : @"token" - }; + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"token" + }; NSString *URLString = [NSString stringWithFormat: @"https://foursquare.com/oauth2/authenticate?%@", [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index baf9ec9..a89a259 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -10,7 +10,6 @@ #import "SimpleAuthInstagramLoginViewController.h" #import "UIViewController+SimpleAuthAdditions.h" - #import @implementation SimpleAuthInstagramProvider diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index 1b5b83e..ea1b006 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -10,7 +10,6 @@ #import "SimpleAuthTumblrLoginViewController.h" #import "UIViewController+SimpleAuthAdditions.h" - #import #import diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 08ce8dd..5848d35 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -10,7 +10,6 @@ #import "SimpleAuthTwitterWebLoginViewController.h" #import "UIViewController+SimpleAuthAdditions.h" - #import #import diff --git a/SimpleAuth/SimpleAuthProvider.h b/SimpleAuth/SimpleAuthProvider.h index 12bc9b5..a531d37 100644 --- a/SimpleAuth/SimpleAuthProvider.h +++ b/SimpleAuth/SimpleAuthProvider.h @@ -6,10 +6,10 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -#import - #import "SimpleAuth.h" +#import + @interface SimpleAuthProvider : NSObject @property (nonatomic, readonly, copy) NSDictionary *options; diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/SimpleAuthWebViewController.h index abceafd..d55e14e 100644 --- a/SimpleAuth/SimpleAuthWebViewController.h +++ b/SimpleAuth/SimpleAuthWebViewController.h @@ -6,10 +6,10 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -#import - #import "SimpleAuth.h" +#import + typedef void (^SimpleAuthWebViewControllerCompletionHandler) (UIViewController *controller, NSURL *URL, NSError *error); @interface SimpleAuthWebViewController : UIViewController From 51af6816f1a6dde5765aaa492764ec1d3b7fd3ae Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 17:06:13 -0800 Subject: [PATCH 051/139] Bump spec version. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 5a69312..e13043f 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.1' + s.version = '0.3.2' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 5e13fd44153841082553853c4719111826badedb Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 18:30:21 -0800 Subject: [PATCH 052/139] Simplified subclass loading. --- SimpleAuth/NSObject+SimpleAuthAdditions.h | 6 ++--- SimpleAuth/NSObject+SimpleAuthAdditions.m | 32 +++++++++-------------- SimpleAuth/SimpleAuth.m | 5 +--- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.h b/SimpleAuth/NSObject+SimpleAuthAdditions.h index a1261cf..e1bf5d8 100644 --- a/SimpleAuth/NSObject+SimpleAuthAdditions.h +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.h @@ -6,10 +6,10 @@ // Copyright (c) 2014 Byliner, Inc. All rights reserved. // +static inline BOOL SimpleAuthClassIsSubclassOfClass(Class classOne, Class classTwo); + @interface NSObject (SimpleAuthAdditions) -+ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass))block; -+ (void)SimpleAuth_enumerateSubclassesExcludingClasses:(NSSet *)set withBlock:(void (^) (Class klass))block; -+ (BOOL)SimpleAuth_isClass:(Class)klassOne subclassOfClass:(Class)klassTwo; ++ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass, BOOL *stop))block; @end diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.m b/SimpleAuth/NSObject+SimpleAuthAdditions.m index 0bb9c36..1a196ac 100644 --- a/SimpleAuth/NSObject+SimpleAuthAdditions.m +++ b/SimpleAuth/NSObject+SimpleAuthAdditions.m @@ -12,39 +12,33 @@ @implementation NSObject (SimpleAuthAdditions) -+ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass))block { ++ (void)SimpleAuth_enumerateSubclassesWithBlock:(void (^) (Class klass, BOOL *stop))block { int numberOfClasses = objc_getClassList(NULL, 0); Class allClasses[numberOfClasses]; objc_getClassList(allClasses, numberOfClasses); for (int i = 0; i < numberOfClasses; i++) { Class klass = allClasses[i]; - if ([self SimpleAuth_isClass:klass subclassOfClass:self]) { - block(klass); + if (SimpleAuthClassIsSubclassOfClass(klass, self)) { + BOOL stop = NO; + block(klass, &stop); + if (stop) { + return; + } } } } +@end -+ (void)SimpleAuth_enumerateSubclassesExcludingClasses:(NSSet *)set withBlock:(void (^) (Class klass))block { - [self SimpleAuth_enumerateSubclassesWithBlock:^(Class klass) { - if (![set containsObject:klass]) { - block(klass); - } - }]; -} - - -+ (BOOL)SimpleAuth_isClass:(Class)classOne subclassOfClass:(Class)classTwo { - if (classOne == classTwo) { +static inline BOOL SimpleAuthClassIsSubclassOfClass(Class classOne, Class classTwo) { + Class superclass = class_getSuperclass(classOne); + if (superclass == classTwo) { return YES; } - Class superclass = class_getSuperclass(classOne); - if (superclass == Nil) { + else if (superclass == Nil) { return NO; } else { - return [self SimpleAuth_isClass:superclass subclassOfClass:classTwo]; + return SimpleAuthClassIsSubclassOfClass(superclass, classTwo); } } - -@end diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index 95d31c4..f2922e4 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -94,10 +94,7 @@ + (NSMutableDictionary *)providers { + (void)loadProviders { - NSSet *set = [NSSet setWithArray:@[ - [SimpleAuthProvider class] - ]]; - [SimpleAuthProvider SimpleAuth_enumerateSubclassesExcludingClasses:set withBlock:^(Class klass) { + [SimpleAuthProvider SimpleAuth_enumerateSubclassesWithBlock:^(Class klass, BOOL *stop) { [self registerProviderClass:klass]; }]; } From 2403b365a87bd81065be9b4ee04d51492afeff97 Mon Sep 17 00:00:00 2001 From: iamabhiee Date: Fri, 24 Jan 2014 15:57:18 +0530 Subject: [PATCH 053/139] LinkedIn Integration LinkedIn Integration --- .../LinkedIn/SimpleAuthLinkedInProvider.h | 13 ++ .../LinkedIn/SimpleAuthLinkedInProvider.m | 205 ++++++++++++++++++ ...SimpleAuthLinkedInWebLoginViewController.h | 13 ++ ...SimpleAuthLinkedInWebLoginViewController.m | 45 ++++ SimpleAuth.xcodeproj/project.pbxproj | 20 ++ SimpleAuthDemo/SADAppDelegate.m | 3 + .../SADProviderListViewController.m | 3 +- 7 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 Providers/LinkedIn/SimpleAuthLinkedInProvider.h create mode 100644 Providers/LinkedIn/SimpleAuthLinkedInProvider.m create mode 100644 Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h create mode 100644 Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.h b/Providers/LinkedIn/SimpleAuthLinkedInProvider.h new file mode 100644 index 0000000..99a8fc7 --- /dev/null +++ b/Providers/LinkedIn/SimpleAuthLinkedInProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthLinkedInProvider.h +// SimpleAuth +// +// Created by Abhishek Sheth on 24/01/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthLinkedInProvider : SimpleAuthProvider + +@end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m new file mode 100644 index 0000000..e4eb639 --- /dev/null +++ b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m @@ -0,0 +1,205 @@ +// +// SimpleAuthLinkedInProvider.m +// SimpleAuth +// +// Created by Abhishek Sheth on 24/01/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthLinkedInProvider.h" +#import "SimpleAuthLinkedInWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthLinkedInProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"LinkedIn"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return options; +} + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^RACStream *(NSString *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + +#pragma mark - Private + +- (RACSignal *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthLinkedInWebLoginViewController *login = [[SimpleAuthLinkedInWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *code = dictionary[@"code"]; + + // Check for error + if (![code length]) { + [subscriber sendError:nil]; + return; + } + + NSMutableURLRequest *request = [self tokenURLRequestForCode:code]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; + + NSString *token = [json objectForKey:@"access_token"]; + + if (![token length]) { + [subscriber sendError:nil]; + return; + } + + // Send completion + [subscriber sendNext:token]; + [subscriber sendCompleted]; + }]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSString *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + + NSMutableDictionary *mutableParameters = [NSMutableDictionary dictionary]; + [mutableParameters setValue:accessToken forKey:@"oauth2_access_token"]; + [mutableParameters setValue:@"json" forKey:@"format"]; + + NSDictionary *parameters = [NSDictionary dictionaryWithDictionary:mutableParameters]; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSString *URLString = [NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~?%@", query]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSString *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken + }; + + // User ID + //dictionary[@"uid"] = account[@"id"]; + + // Raw response + dictionary[@"raw_info"] = account; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"first_name"] = account[@"firstName"]; + user[@"last_name"] = account[@"lastName"]; + user[@"headline"] = account[@"headline"]; + dictionary[@"user_info"] = user; + + return dictionary; +} + +- (NSDictionary*)parseURLParams:(NSString *)query { + NSArray *pairs = [query componentsSeparatedByString:@"&"]; + NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; + for (NSString *pair in pairs) { + NSArray *kv = [pair componentsSeparatedByString:@"="]; + NSString *val = [[kv objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + [params setObject:val forKey:[kv objectAtIndex:0]]; + } + return params; +} + +-(NSMutableURLRequest *)tokenURLRequestForCode:(NSString *)code +{ + NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:code, @"code", + self.options[@"client_id"], @"client_id", + self.options[@"client_secret"], @"client_secret", + self.options[@"redirect_uri"], @"redirect_uri", + @"authorization_code", @"grant_type",nil]; + + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + + NSString *URLString = [NSString stringWithFormat:@"https://api.linkedin.com/uas/oauth2/accessToken"]; + NSURL *cURL = [NSURL URLWithString:URLString]; + + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:cURL]; + [request setHTTPMethod:@"POST"]; + [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", @"utf-8"] forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[query dataUsingEncoding:4]]; + + return request; +} + +@end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h new file mode 100644 index 0000000..3574ba6 --- /dev/null +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthLinkedInWebLoginViewController.h +// SimpleAuth +// +// Created by Abhishek Sheth on 24/01/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthLinkedInWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m new file mode 100644 index 0000000..056c430 --- /dev/null +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m @@ -0,0 +1,45 @@ +// +// SimpleAuthLinkedInWebLoginViewController.m +// SimpleAuth +// +// Created by Abhishek Sheth on 24/01/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthLinkedInWebLoginViewController.h" + +@interface SimpleAuthLinkedInWebLoginViewController () + +@end + +@implementation SimpleAuthLinkedInWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"LinkedIn"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"code", + @"state" : self.options[@"state"] + }; + + NSString *URLString = [NSString stringWithFormat: + @"https://www.linkedin.com/uas/oauth2/authorization?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + + + +@end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 47568a9..51bba9c 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -34,6 +34,8 @@ 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; + 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */; }; + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; @@ -110,6 +112,10 @@ 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; + 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInProvider.h; sourceTree = ""; }; + 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInProvider.m; sourceTree = ""; }; + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; @@ -139,6 +145,7 @@ 3B52BB8D1887088400C73329 /* Providers */ = { isa = PBXGroup; children = ( + 81A50A461892645800D5D8AC /* LinkedIn */, F9BE4F32189120BE00AE303A /* FoursquareWeb */, 3B52BB9218871F6200C73329 /* Facebook */, 3B66656918903F4000F3BF58 /* FacebookWeb */, @@ -347,6 +354,17 @@ name = Meetup; sourceTree = ""; }; + 81A50A461892645800D5D8AC /* LinkedIn */ = { + isa = PBXGroup; + children = ( + 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */, + 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */, + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */, + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */, + ); + path = LinkedIn; + sourceTree = ""; + }; F9BE4F32189120BE00AE303A /* FoursquareWeb */ = { isa = PBXGroup; children = ( @@ -486,8 +504,10 @@ files = ( 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */, 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */, F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, + 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index a4d901b..1bd82e9 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -64,6 +64,9 @@ - (void)configureAuthorizaionProviders { // client_id and redirect_uri are required SimpleAuth.configuration[@"dropbox-web"] = @{}; + + // client_id, client_secret, state and and redirect_uri are required + SimpleAuth.configuration[@"LinkedIn"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index f396b3d..ff79b6c 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -51,7 +51,8 @@ + (NSArray *)providers { @"meetup", @"tumblr", @"foursquare-web", - @"dropbox-web" + @"dropbox-web", + @"LinkedIn" ]; }); return array; From 020ac16150ae430e5fb7a4322af74ff99c9cfff5 Mon Sep 17 00:00:00 2001 From: iamabhiee Date: Fri, 24 Jan 2014 16:00:20 +0530 Subject: [PATCH 054/139] LinkedIn --- ...ler.h => SimpleAuthLinkedInLoginViewController.h} | 2 +- ...ler.m => SimpleAuthLinkedInLoginViewController.m} | 6 +++--- Providers/LinkedIn/SimpleAuthLinkedInProvider.m | 4 ++-- SimpleAuth.xcodeproj/project.pbxproj | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) rename Providers/LinkedIn/{SimpleAuthLinkedInWebLoginViewController.h => SimpleAuthLinkedInLoginViewController.h} (72%) rename Providers/LinkedIn/{SimpleAuthLinkedInWebLoginViewController.m => SimpleAuthLinkedInLoginViewController.m} (87%) diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h similarity index 72% rename from Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h rename to Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h index 3574ba6..3f01935 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h +++ b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h @@ -8,6 +8,6 @@ #import "SimpleAuthWebViewController.h" -@interface SimpleAuthLinkedInWebLoginViewController : SimpleAuthWebViewController +@interface SimpleAuthLinkedInLoginViewController : SimpleAuthWebViewController @end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m similarity index 87% rename from Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m rename to Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m index 056c430..3fd5dff 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m @@ -6,13 +6,13 @@ // Copyright (c) 2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthLinkedInWebLoginViewController.h" +#import "SimpleAuthLinkedInLoginViewController.h" -@interface SimpleAuthLinkedInWebLoginViewController () +@interface SimpleAuthLinkedInLoginViewController () @end -@implementation SimpleAuthLinkedInWebLoginViewController +@implementation SimpleAuthLinkedInLoginViewController #pragma mark - SimpleAuthWebViewController diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m index e4eb639..9924f39 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m @@ -7,7 +7,7 @@ // #import "SimpleAuthLinkedInProvider.h" -#import "SimpleAuthLinkedInWebLoginViewController.h" +#import "SimpleAuthLinkedInLoginViewController.h" #import #import "UIViewController+SimpleAuthAdditions.h" @@ -64,7 +64,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { dispatch_async(dispatch_get_main_queue(), ^{ - SimpleAuthLinkedInWebLoginViewController *login = [[SimpleAuthLinkedInWebLoginViewController alloc] initWithOptions:self.options]; + SimpleAuthLinkedInLoginViewController *login = [[SimpleAuthLinkedInLoginViewController alloc] initWithOptions:self.options]; login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; dismissBlock(login); diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 51bba9c..5c8b4df 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */; }; - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; @@ -114,8 +114,8 @@ 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInProvider.h; sourceTree = ""; }; 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInProvider.m; sourceTree = ""; }; - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInLoginViewController.h; sourceTree = ""; }; + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInLoginViewController.m; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; @@ -359,8 +359,8 @@ children = ( 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */, 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */, - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */, - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */, + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.h */, + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */, ); path = LinkedIn; sourceTree = ""; @@ -504,7 +504,7 @@ files = ( 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */, 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */, + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m in Sources */, F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */, From f45982283bfe81be49e418774b62abe33e11c069 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 12:05:44 -0800 Subject: [PATCH 055/139] Refactor and reorganize linkedin provider. --- .../SimpleAuthLinkedInLoginViewController.m | 10 +- .../LinkedIn/SimpleAuthLinkedInProvider.m | 184 +++++++++--------- SimpleAuth.xcodeproj/project.pbxproj | 6 +- SimpleAuthDemo/SADAppDelegate.m | 4 +- .../SADProviderListViewController.m | 2 +- 5 files changed, 107 insertions(+), 99 deletions(-) diff --git a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m index 3fd5dff..6fb20b6 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m @@ -26,11 +26,11 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona - (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ - @"client_id" : self.options[@"client_id"], - @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], - @"response_type" : @"code", - @"state" : self.options[@"state"] - }; + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"code", + @"state" : [[NSProcessInfo processInfo] globallyUniqueString] + }; NSString *URLString = [NSString stringWithFormat: @"https://www.linkedin.com/uas/oauth2/authorization?%@", diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m index 9924f39..46eb43b 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInProvider.m @@ -17,7 +17,7 @@ @implementation SimpleAuthLinkedInProvider #pragma mark - SimpleAuthProvider + (NSString *)type { - return @"LinkedIn"; + return @"linkedin"; } @@ -42,17 +42,18 @@ + (NSDictionary *)defaultOptions { return options; } + - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { [[[self accessToken] - flattenMap:^RACStream *(NSString *response) { - NSArray *signals = @[ - [self accountWithAccessToken:response], - [RACSignal return:response] - ]; - return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; - }] - subscribeNext:^(NSDictionary *response) { - completion(response, nil); + flattenMap:^(id responseObject) { + NSArray *signals = @[ + [self accountWithAccessToken:responseObject], + [RACSignal return:responseObject] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(id responseObject) { + completion(responseObject, nil); } error:^(NSError *error) { completion(nil, error); @@ -61,7 +62,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { #pragma mark - Private -- (RACSignal *)accessToken { +- (RACSignal *)authorizationCode { return [RACSignal createSignal:^RACDisposable *(id subscriber) { dispatch_async(dispatch_get_main_queue(), ^{ SimpleAuthLinkedInLoginViewController *login = [[SimpleAuthLinkedInLoginViewController alloc] initWithOptions:self.options]; @@ -80,22 +81,9 @@ - (RACSignal *)accessToken { return; } - NSMutableURLRequest *request = [self tokenURLRequestForCode:code]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { - NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; - - NSString *token = [json objectForKey:@"access_token"]; - - if (![token length]) { - [subscriber sendError:nil]; - return; - } - - // Send completion - [subscriber sendNext:token]; - [subscriber sendCompleted]; - }]; + // Send completion + [subscriber sendNext:code]; + [subscriber sendCompleted]; }; SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; @@ -106,52 +94,105 @@ - (RACSignal *)accessToken { } -- (RACSignal *)accountWithAccessToken:(NSString *)accessToken { +- (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - NSMutableDictionary *mutableParameters = [NSMutableDictionary dictionary]; - [mutableParameters setValue:accessToken forKey:@"oauth2_access_token"]; - [mutableParameters setValue:@"json" forKey:@"format"]; - - NSDictionary *parameters = [NSDictionary dictionaryWithDictionary:mutableParameters]; + // Build request + NSDictionary *parameters = @{ + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : self.options[@"redirect_uri"], + @"grant_type" : @"authorization_code" + }; NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; - NSString *URLString = [NSString stringWithFormat:@"https://api.linkedin.com/v1/people/~?%@", query]; + NSURL *URL = [NSURL URLWithString:@"https://api.linkedin.com/uas/oauth2/accessToken"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + [request setHTTPMethod:@"POST"]; + [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]]; + + // Run request + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + + return nil; + }]; +} + + +- (RACSignal *)accessToken { + return [[self authorizationCode] flattenMap:^(id responseObject) { + return [self accessTokenWithAuthorizationCode:responseObject]; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ + @"oauth2_access_token" : accessToken[@"access_token"], + @"format" : @"json" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://api.linkedin.com/v1/people/~?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; - NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - if ([indexSet containsIndex:statusCode] && data) { - NSError *parseError = nil; - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; - if (dictionary) { - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; - } - else { - [subscriber sendError:parseError]; - } - } - else { - [subscriber sendError:connectionError]; - } - }]; + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; return nil; }]; } -- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSString *)accessToken { +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { NSMutableDictionary *dictionary = [NSMutableDictionary new]; // Provider dictionary[@"provider"] = [[self class] type]; // Credentials + NSTimeInterval expiresAtInterval = [accessToken[@"expires_in"] doubleValue]; + NSDate *expiresAtDate = [NSDate dateWithTimeIntervalSinceNow:expiresAtInterval]; dictionary[@"credentials"] = @{ - @"token" : accessToken - }; + @"token" : accessToken[@"access_token"], + @"expires_at" : expiresAtDate + }; // User ID //dictionary[@"uid"] = account[@"id"]; @@ -169,37 +210,4 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS return dictionary; } -- (NSDictionary*)parseURLParams:(NSString *)query { - NSArray *pairs = [query componentsSeparatedByString:@"&"]; - NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; - for (NSString *pair in pairs) { - NSArray *kv = [pair componentsSeparatedByString:@"="]; - NSString *val = [[kv objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - - [params setObject:val forKey:[kv objectAtIndex:0]]; - } - return params; -} - --(NSMutableURLRequest *)tokenURLRequestForCode:(NSString *)code -{ - NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:code, @"code", - self.options[@"client_id"], @"client_id", - self.options[@"client_secret"], @"client_secret", - self.options[@"redirect_uri"], @"redirect_uri", - @"authorization_code", @"grant_type",nil]; - - NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; - - NSString *URLString = [NSString stringWithFormat:@"https://api.linkedin.com/uas/oauth2/accessToken"]; - NSURL *cURL = [NSURL URLWithString:URLString]; - - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:cURL]; - [request setHTTPMethod:@"POST"]; - [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", @"utf-8"] forHTTPHeaderField:@"Content-Type"]; - [request setHTTPBody:[query dataUsingEncoding:4]]; - - return request; -} - @end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 5c8b4df..6aaae98 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -145,16 +145,16 @@ 3B52BB8D1887088400C73329 /* Providers */ = { isa = PBXGroup; children = ( - 81A50A461892645800D5D8AC /* LinkedIn */, - F9BE4F32189120BE00AE303A /* FoursquareWeb */, 3B52BB9218871F6200C73329 /* Facebook */, 3B66656918903F4000F3BF58 /* FacebookWeb */, 3B52BB8E1887088400C73329 /* Twitter */, 3B8C408B18879296007DC578 /* TwitterWeb */, 3B52BB96188731A300C73329 /* Instagram */, - 4D149A3E1889B38C0024639C /* Meetup */, 3B65845D1888A93200D59100 /* Tumblr */, 3BC5FC6D1891D80E00523166 /* DropboxWeb */, + F9BE4F32189120BE00AE303A /* FoursquareWeb */, + 4D149A3E1889B38C0024639C /* Meetup */, + 81A50A461892645800D5D8AC /* LinkedIn */, ); path = Providers; sourceTree = ""; diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index 1bd82e9..d919f92 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -65,8 +65,8 @@ - (void)configureAuthorizaionProviders { // client_id and redirect_uri are required SimpleAuth.configuration[@"dropbox-web"] = @{}; - // client_id, client_secret, state and and redirect_uri are required - SimpleAuth.configuration[@"LinkedIn"] = @{}; + // client_id, client_secret, and and redirect_uri are required + SimpleAuth.configuration[@"linkedin"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index ff79b6c..54b28ea 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -52,7 +52,7 @@ + (NSArray *)providers { @"tumblr", @"foursquare-web", @"dropbox-web", - @"LinkedIn" + @"linkedin" ]; }); return array; From 75a0c8bea2cb5684e5d4cb7ba5e5fddd98a42ad9 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 12:07:35 -0800 Subject: [PATCH 056/139] Rename LinkedIn provider. --- ...impleAuthLinkedInWebLoginViewController.h} | 2 +- ...impleAuthLinkedInWebLoginViewController.m} | 6 +-- ...ider.h => SimpleAuthLinkedInWebProvider.h} | 2 +- ...ider.m => SimpleAuthLinkedInWebProvider.m} | 10 ++-- SimpleAuth.xcodeproj/project.pbxproj | 49 ++++++++++--------- SimpleAuthDemo/SADAppDelegate.m | 2 +- .../SADProviderListViewController.m | 2 +- 7 files changed, 39 insertions(+), 34 deletions(-) rename Providers/LinkedIn/{SimpleAuthLinkedInLoginViewController.h => SimpleAuthLinkedInWebLoginViewController.h} (72%) rename Providers/LinkedIn/{SimpleAuthLinkedInLoginViewController.m => SimpleAuthLinkedInWebLoginViewController.m} (87%) rename Providers/LinkedIn/{SimpleAuthLinkedInProvider.h => SimpleAuthLinkedInWebProvider.h} (76%) rename Providers/LinkedIn/{SimpleAuthLinkedInProvider.m => SimpleAuthLinkedInWebProvider.m} (96%) diff --git a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h similarity index 72% rename from Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h rename to Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h index 3f01935..3574ba6 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.h +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h @@ -8,6 +8,6 @@ #import "SimpleAuthWebViewController.h" -@interface SimpleAuthLinkedInLoginViewController : SimpleAuthWebViewController +@interface SimpleAuthLinkedInWebLoginViewController : SimpleAuthWebViewController @end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m similarity index 87% rename from Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m rename to Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m index 6fb20b6..d32d061 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInLoginViewController.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m @@ -6,13 +6,13 @@ // Copyright (c) 2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthLinkedInLoginViewController.h" +#import "SimpleAuthLinkedInWebLoginViewController.h" -@interface SimpleAuthLinkedInLoginViewController () +@interface SimpleAuthLinkedInWebLoginViewController () @end -@implementation SimpleAuthLinkedInLoginViewController +@implementation SimpleAuthLinkedInWebLoginViewController #pragma mark - SimpleAuthWebViewController diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.h b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h similarity index 76% rename from Providers/LinkedIn/SimpleAuthLinkedInProvider.h rename to Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h index 99a8fc7..65e5f3a 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInProvider.h +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h @@ -8,6 +8,6 @@ #import "SimpleAuthProvider.h" -@interface SimpleAuthLinkedInProvider : SimpleAuthProvider +@interface SimpleAuthLinkedInWebProvider : SimpleAuthProvider @end diff --git a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m similarity index 96% rename from Providers/LinkedIn/SimpleAuthLinkedInProvider.m rename to Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m index 46eb43b..0e1de51 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInProvider.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m @@ -6,18 +6,18 @@ // Copyright (c) 2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthLinkedInProvider.h" -#import "SimpleAuthLinkedInLoginViewController.h" +#import "SimpleAuthLinkedInWebProvider.h" +#import "SimpleAuthLinkedInWebLoginViewController.h" #import #import "UIViewController+SimpleAuthAdditions.h" -@implementation SimpleAuthLinkedInProvider +@implementation SimpleAuthLinkedInWebProvider #pragma mark - SimpleAuthProvider + (NSString *)type { - return @"linkedin"; + return @"linkedin-web"; } @@ -65,7 +65,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)authorizationCode { return [RACSignal createSignal:^RACDisposable *(id subscriber) { dispatch_async(dispatch_get_main_queue(), ^{ - SimpleAuthLinkedInLoginViewController *login = [[SimpleAuthLinkedInLoginViewController alloc] initWithOptions:self.options]; + SimpleAuthLinkedInWebLoginViewController *login = [[SimpleAuthLinkedInWebLoginViewController alloc] initWithOptions:self.options]; login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; dismissBlock(login); diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 6aaae98..ac7fb23 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -34,8 +34,8 @@ 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; - 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */; }; - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */; }; + 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; @@ -112,10 +112,10 @@ 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; - 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInProvider.h; sourceTree = ""; }; - 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInProvider.m; sourceTree = ""; }; - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInLoginViewController.h; sourceTree = ""; }; - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInLoginViewController.m; sourceTree = ""; }; + 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebProvider.h; sourceTree = ""; }; + 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; @@ -146,15 +146,15 @@ isa = PBXGroup; children = ( 3B52BB9218871F6200C73329 /* Facebook */, - 3B66656918903F4000F3BF58 /* FacebookWeb */, + 3B66656918903F4000F3BF58 /* Facebook Web */, 3B52BB8E1887088400C73329 /* Twitter */, - 3B8C408B18879296007DC578 /* TwitterWeb */, + 3B8C408B18879296007DC578 /* Twitter Web */, 3B52BB96188731A300C73329 /* Instagram */, 3B65845D1888A93200D59100 /* Tumblr */, - 3BC5FC6D1891D80E00523166 /* DropboxWeb */, - F9BE4F32189120BE00AE303A /* FoursquareWeb */, + 3BC5FC6D1891D80E00523166 /* Dropbox Web */, + F9BE4F32189120BE00AE303A /* Foursquare Web */, 4D149A3E1889B38C0024639C /* Meetup */, - 81A50A461892645800D5D8AC /* LinkedIn */, + 81A50A461892645800D5D8AC /* LinkedIn Web */, ); path = Providers; sourceTree = ""; @@ -223,7 +223,7 @@ path = Tumblr; sourceTree = ""; }; - 3B66656918903F4000F3BF58 /* FacebookWeb */ = { + 3B66656918903F4000F3BF58 /* Facebook Web */ = { isa = PBXGroup; children = ( 3B66656A18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.h */, @@ -231,10 +231,11 @@ 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */, 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */, ); + name = "Facebook Web"; path = FacebookWeb; sourceTree = ""; }; - 3B8C408B18879296007DC578 /* TwitterWeb */ = { + 3B8C408B18879296007DC578 /* Twitter Web */ = { isa = PBXGroup; children = ( 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */, @@ -242,6 +243,7 @@ 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */, 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */, ); + name = "Twitter Web"; path = TwitterWeb; sourceTree = ""; }; @@ -308,7 +310,7 @@ name = "Supporting Files"; sourceTree = ""; }; - 3BC5FC6D1891D80E00523166 /* DropboxWeb */ = { + 3BC5FC6D1891D80E00523166 /* Dropbox Web */ = { isa = PBXGroup; children = ( 3BC5FC6E1891D86A00523166 /* SimpleAuthDropboxWebProvider.h */, @@ -316,6 +318,7 @@ 3BC5FC711891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.h */, 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */, ); + name = "Dropbox Web"; path = DropboxWeb; sourceTree = ""; }; @@ -354,18 +357,19 @@ name = Meetup; sourceTree = ""; }; - 81A50A461892645800D5D8AC /* LinkedIn */ = { + 81A50A461892645800D5D8AC /* LinkedIn Web */ = { isa = PBXGroup; children = ( - 81A50A471892649300D5D8AC /* SimpleAuthLinkedInProvider.h */, - 81A50A481892649300D5D8AC /* SimpleAuthLinkedInProvider.m */, - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.h */, - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m */, + 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */, + 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */, + 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */, + 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */, ); + name = "LinkedIn Web"; path = LinkedIn; sourceTree = ""; }; - F9BE4F32189120BE00AE303A /* FoursquareWeb */ = { + F9BE4F32189120BE00AE303A /* Foursquare Web */ = { isa = PBXGroup; children = ( F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */, @@ -373,6 +377,7 @@ F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */, F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */, ); + name = "Foursquare Web"; path = FoursquareWeb; sourceTree = ""; }; @@ -504,10 +509,10 @@ files = ( 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */, 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInLoginViewController.m in Sources */, + 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */, F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, - 81A50A491892649300D5D8AC /* SimpleAuthLinkedInProvider.m in Sources */, + 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index d919f92..b5d5b35 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -66,7 +66,7 @@ - (void)configureAuthorizaionProviders { SimpleAuth.configuration[@"dropbox-web"] = @{}; // client_id, client_secret, and and redirect_uri are required - SimpleAuth.configuration[@"linkedin"] = @{}; + SimpleAuth.configuration[@"linkedin-web"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 54b28ea..4f8c7d0 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -52,7 +52,7 @@ + (NSArray *)providers { @"tumblr", @"foursquare-web", @"dropbox-web", - @"linkedin" + @"linkedin-web" ]; }); return array; From 8730f8e394df41731201c6cb6fc5b726af42dd5d Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:27:49 -0800 Subject: [PATCH 057/139] Pass error out to caller. --- Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m index 0e1de51..607df05 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m @@ -77,7 +77,7 @@ - (RACSignal *)authorizationCode { // Check for error if (![code length]) { - [subscriber sendError:nil]; + [subscriber sendError:error]; return; } From d906b25f88a3083d4757b588e4de28a8042468f4 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 27 Jan 2014 16:45:55 -0800 Subject: [PATCH 058/139] Add LinkedIn to readme. --- Readme.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Readme.markdown b/Readme.markdown index a5b4523..c56b5bd 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -11,6 +11,7 @@ SimpleAuth currently has the following providers: - [Dropbox](https://github.com/calebd/SimpleAuth/wiki/Dropbox) - [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) +- [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/Meetup) ## Installing @@ -90,3 +91,4 @@ Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising o - [kornifex](https://github.com/kornifex): Foursquare provider - [mouhcine](https://github.com/mouhcine): Meetup provider +- [iamabhiee](https://github.com/iamabhiee): LinkedIn provider From fee2318839fb2fd4c2ded1f78bae5c7162eb3f4c Mon Sep 17 00:00:00 2001 From: Gerson Alexander Pardo Gamez Date: Wed, 29 Jan 2014 23:01:31 -0500 Subject: [PATCH 059/139] Fix permissions error error in the parameter name of the permissions for the web login with facebook --- .../FacebookWeb/SimpleAuthFacebookWebLoginViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m index d6b937c..fe3dc35 100644 --- a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m +++ b/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m @@ -25,7 +25,7 @@ - (NSURLRequest *)initialRequest { @"client_id" : self.options[@"app_id"], @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], @"response_type" : @"token", - @"permissions" : [self.options[@"permissions"] componentsJoinedByString:@","] + @"scope" : [self.options[@"permissions"] componentsJoinedByString:@","] }; NSString *URLString = [NSString stringWithFormat: @"https://www.facebook.com/dialog/oauth?%@", From c098919bbb50c05cfcf3cdbfaf7fa8b1b570d282 Mon Sep 17 00:00:00 2001 From: Paul Young Date: Mon, 3 Feb 2014 13:06:24 -0500 Subject: [PATCH 060/139] Fixed typo in Podspec --- SimpleAuth.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index e13043f..77043fe 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |ss| ss.source_files = 'SimpleAuth/**/*.{h,m}' - ss.public_header_files = 'SimpleAuth/SipmleAuth.h' + ss.public_header_files = 'SimpleAuth/SimpleAuth.h' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' end @@ -84,4 +84,4 @@ Pod::Spec.new do |s| ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' ss.frameworks = 'UIKit' end -end \ No newline at end of file +end From f06140b4333c5e53ba398a4d4d828adf2a24af63 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Tue, 4 Feb 2014 09:04:29 +0100 Subject: [PATCH 061/139] Added LinkedInWeb to the potspec --- SimpleAuth.podspec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 77043fe..5522c5e 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -84,4 +84,11 @@ Pod::Spec.new do |s| ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' ss.frameworks = 'UIKit' end + + s.subspec 'LinkedInWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/LinkedIn/**/*.{h,m}' + ss.frameworks = 'UIKit' + end end From aaed4a78d0c8621feab252430529bc09da34e5c1 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 4 Feb 2014 12:46:20 -0800 Subject: [PATCH 062/139] Fix default constructor loop bug. Fixes #39. --- Providers/Tumblr/SimpleAuthTumblrLoginViewController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m index e79e8a9..74e5fc9 100644 --- a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m +++ b/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m @@ -13,7 +13,7 @@ @implementation SimpleAuthTumblrLoginViewController #pragma mark - SimpleAuthWebViewController - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - if ((self = [super initWithOptions:options])) { + if ((self = [super initWithOptions:options requestToken:requestToken])) { self.title = @"tumblr"; } return self; From ee2307f0426cc832abf709374fb625061249e210 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 4 Feb 2014 15:39:01 -0800 Subject: [PATCH 063/139] Call the completion block in tumblr provider. --- Providers/Tumblr/SimpleAuthTumblrProvider.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Providers/Tumblr/SimpleAuthTumblrProvider.m index ea1b006..fee76f2 100644 --- a/Providers/Tumblr/SimpleAuthTumblrProvider.m +++ b/Providers/Tumblr/SimpleAuthTumblrProvider.m @@ -64,11 +64,11 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { ]; return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; }] - subscribeNext:^(id x) { - NSLog(@"%@", x); + subscribeNext:^(NSDictionary *response) { + completion(response, nil); } error:^(NSError *error) { - NSLog(@"%@", error); + completion(nil, error); }]; } From 846cbd9d9f9f42372cf91fb48c4c494cea7e5e21 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Mon, 10 Feb 2014 12:57:41 +0100 Subject: [PATCH 064/139] fixes Foursquare versioning bug --- Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index 189f8df..7bdfd40 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -98,7 +98,7 @@ - (RACSignal *)accountWithAccessToken:(NSString *)accessToken { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSDictionary *parameters = @{ @"oauth_token" : accessToken }; NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; - NSString *URLString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/users/self?%@", query]; + NSString *URLString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/users/self?v=20140210&%@", query]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue From c3eca2e749d4e762267f6fb8a381a09f8e9c53e8 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Mon, 10 Feb 2014 15:53:18 +0100 Subject: [PATCH 065/139] Add the ACFacebookAudienceKey in the native facebook provider --- Providers/Facebook/SimpleAuthFacebookProvider.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 820da52..15bddbe 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -24,7 +24,8 @@ + (NSString *)type { + (NSDictionary *)defaultOptions { return @{ - @"permissions" : @[ @"email" ] + @"permissions" : @[ @"email" ], + @"audience" : @[ACFacebookAudienceOnlyMe] }; } @@ -52,7 +53,8 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)allSystemAccounts { NSDictionary *options = @{ ACFacebookAppIdKey : self.options[@"app_id"], - ACFacebookPermissionsKey : self.options[@"permissions"] + ACFacebookPermissionsKey : self.options[@"permissions"], + ACFacebookAudienceKey: self.options[@"audience"] }; return [ACAccountStore SimpleAuth_accountsWithTypeIdentifier:ACAccountTypeIdentifierFacebook options:options]; } From 5f8b3fcc6ba57c9397f759a25bdcbe7dfa54fe85 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Fri, 14 Feb 2014 15:22:27 +0100 Subject: [PATCH 066/139] added SimpleAuthSingleSignOnProvider --- SimpleAuth.xcodeproj/project.pbxproj | 6 +++ SimpleAuth/SimpleAuth.h | 9 ++++ SimpleAuth/SimpleAuth.m | 52 +++++++++++++++------ SimpleAuth/SimpleAuthSingleSignOnProvider.h | 15 ++++++ SimpleAuth/SimpleAuthSingleSignOnProvider.m | 19 ++++++++ 5 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 SimpleAuth/SimpleAuthSingleSignOnProvider.h create mode 100644 SimpleAuth/SimpleAuthSingleSignOnProvider.m diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index ac7fb23..b62c264 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; + F978D08018AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; /* End PBXBuildFile section */ @@ -116,6 +117,8 @@ 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; + F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSingleSignOnProvider.h; sourceTree = ""; }; + F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSingleSignOnProvider.m; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; @@ -252,6 +255,8 @@ children = ( 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */, 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */, + F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */, + F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */, ); name = Providers; sourceTree = ""; @@ -531,6 +536,7 @@ 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, + F978D08018AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m in Sources */, 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SimpleAuth/SimpleAuth.h b/SimpleAuth/SimpleAuth.h index 14042d3..603f02b 100644 --- a/SimpleAuth/SimpleAuth.h +++ b/SimpleAuth/SimpleAuth.h @@ -92,4 +92,13 @@ extern NSString * const SimpleAuthEndActivityBlockKey; */ + (void)authorize:(NSString *)provider options:(NSDictionary *)options completion:(SimpleAuthRequestHandler)completion; +/** + Determine whether the provider can handle the callback URL or not. + + @return A boolean specifying if the provider handles the specified URL. + + @param url The callback URL. + */ ++ (BOOL)handleCallback:(NSURL *)url; + @end diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index f2922e4..c751939 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -6,7 +6,10 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // +#import "SimpleAuth.h" + #import "SimpleAuthProvider.h" +#import "SimpleAuthSingleSignOnProvider.h" #import "NSObject+SimpleAuthAdditions.h" @@ -17,18 +20,22 @@ NSString * const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; NSString * const SimpleAuthRedirectURIKey = @"redirect_uri"; +static SimpleAuthProvider *__currentProvider = nil; + @implementation SimpleAuth #pragma mark - NSObject -+ (void)initialize { ++ (void)initialize +{ [self loadProviders]; } #pragma mark - Public -+ (NSMutableDictionary *)configuration { ++ (NSMutableDictionary *)configuration +{ static dispatch_once_t token; static NSMutableDictionary *configuration; dispatch_once(&token, ^{ @@ -37,14 +44,13 @@ + (NSMutableDictionary *)configuration { return configuration; } - -+ (void)authorize:(NSString *)type completion:(SimpleAuthRequestHandler)completion { ++ (void)authorize:(NSString *)type completion:(SimpleAuthRequestHandler)completion +{ [self authorize:type options:nil completion:completion]; } - -+ (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(SimpleAuthRequestHandler)completion { - ++ (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(SimpleAuthRequestHandler)completion +{ // Load the provider class Class klass = [self providers][type]; NSAssert(klass, @"There is no class registered to handle %@ requests.", type); @@ -58,23 +64,39 @@ + (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(S [resolvedOptions addEntriesFromDictionary:options]; // Create the provider and run authorization - SimpleAuthProvider *provider = [(SimpleAuthProvider *)[klass alloc] initWithOptions:resolvedOptions]; - [provider authorizeWithCompletion:^(id responseObject, NSError *error) { + __currentProvider = [(SimpleAuthProvider *)[klass alloc] initWithOptions:resolvedOptions]; + [__currentProvider authorizeWithCompletion:^(id responseObject, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ completion(responseObject, error); }); - [provider class]; // Kepp the provider around until the callback is complete }]; } ++ (BOOL)handleCallback:(NSURL *)url +{ + NSParameterAssert(url != nil); + + NSAssert(__currentProvider != nil, @"There is no provider waiting for single sign on callback"); + NSAssert([__currentProvider isKindOfClass:[SimpleAuthSingleSignOnProvider class]], @"Current provider does not handle single sign on"); + + return [(SimpleAuthSingleSignOnProvider *)__currentProvider handleCallback:url]; +} + #pragma mark - Internal -+ (void)registerProviderClass:(Class)klass { ++ (void)registerProviderClass:(Class)klass +{ + if (klass == [SimpleAuthSingleSignOnProvider class]) { + return; + } + + NSLog(@"registerProviderClass: %@", NSStringFromClass(klass)); NSMutableDictionary *providers = [self providers]; + NSString *type = [klass type]; if (providers[type]) { - NSLog(@"[SimpleAuth] Warning: multiple attempts to register profider: %@", type); + NSLog(@"[SimpleAuth] Warning: multiple attempts to register provider for type: %@", type); return; } providers[type] = klass; @@ -83,7 +105,8 @@ + (void)registerProviderClass:(Class)klass { #pragma mark - Private -+ (NSMutableDictionary *)providers { ++ (NSMutableDictionary *)providers +{ static dispatch_once_t token; static NSMutableDictionary *providers; dispatch_once(&token, ^{ @@ -93,7 +116,8 @@ + (NSMutableDictionary *)providers { } -+ (void)loadProviders { ++ (void)loadProviders +{ [SimpleAuthProvider SimpleAuth_enumerateSubclassesWithBlock:^(Class klass, BOOL *stop) { [self registerProviderClass:klass]; }]; diff --git a/SimpleAuth/SimpleAuthSingleSignOnProvider.h b/SimpleAuth/SimpleAuthSingleSignOnProvider.h new file mode 100644 index 0000000..d118175 --- /dev/null +++ b/SimpleAuth/SimpleAuthSingleSignOnProvider.h @@ -0,0 +1,15 @@ +// +// SimpleAuthSingleSignOnProvider.h +// SimpleAuth +// +// Created by Julien Seren-Rosso on 14/02/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthSingleSignOnProvider : SimpleAuthProvider + +- (BOOL)handleCallback:(NSURL *)url; + +@end diff --git a/SimpleAuth/SimpleAuthSingleSignOnProvider.m b/SimpleAuth/SimpleAuthSingleSignOnProvider.m new file mode 100644 index 0000000..1d0a482 --- /dev/null +++ b/SimpleAuth/SimpleAuthSingleSignOnProvider.m @@ -0,0 +1,19 @@ +// +// SimpleAuthSingleSignOnProvider.m +// SimpleAuth +// +// Created by Julien Seren-Rosso on 14/02/2014. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthSingleSignOnProvider.h" + +@implementation SimpleAuthSingleSignOnProvider + +- (BOOL)handleCallback:(NSURL *)url +{ + [self doesNotRecognizeSelector:_cmd]; + return NO; +} + +@end From 6218a05c859e8e705a112514c0b47806b49565ee Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 16 Feb 2014 12:11:04 -0800 Subject: [PATCH 067/139] Change single sign on provider to protocol instead of class. --- SimpleAuth.xcodeproj/project.pbxproj | 4 -- SimpleAuth/SimpleAuth.m | 42 ++++++++------------- SimpleAuth/SimpleAuthSingleSignOnProvider.h | 6 +-- SimpleAuth/SimpleAuthSingleSignOnProvider.m | 19 ---------- 4 files changed, 18 insertions(+), 53 deletions(-) delete mode 100644 SimpleAuth/SimpleAuthSingleSignOnProvider.m diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index b62c264..a002561 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -37,7 +37,6 @@ 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; - F978D08018AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; /* End PBXBuildFile section */ @@ -118,7 +117,6 @@ 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSingleSignOnProvider.h; sourceTree = ""; }; - F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSingleSignOnProvider.m; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; @@ -256,7 +254,6 @@ 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */, 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */, F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */, - F978D07F18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m */, ); name = Providers; sourceTree = ""; @@ -536,7 +533,6 @@ 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, - F978D08018AE382600017ED5 /* SimpleAuthSingleSignOnProvider.m in Sources */, 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index c751939..a952aa2 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -26,16 +26,14 @@ @implementation SimpleAuth #pragma mark - NSObject -+ (void)initialize -{ ++ (void)initialize { [self loadProviders]; } #pragma mark - Public -+ (NSMutableDictionary *)configuration -{ ++ (NSMutableDictionary *)configuration { static dispatch_once_t token; static NSMutableDictionary *configuration; dispatch_once(&token, ^{ @@ -44,13 +42,14 @@ + (NSMutableDictionary *)configuration return configuration; } -+ (void)authorize:(NSString *)type completion:(SimpleAuthRequestHandler)completion -{ + ++ (void)authorize:(NSString *)type completion:(SimpleAuthRequestHandler)completion { [self authorize:type options:nil completion:completion]; } -+ (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(SimpleAuthRequestHandler)completion -{ + ++ (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(SimpleAuthRequestHandler)completion { + // Load the provider class Class klass = [self providers][type]; NSAssert(klass, @"There is no class registered to handle %@ requests.", type); @@ -72,28 +71,21 @@ + (void)authorize:(NSString *)type options:(NSDictionary *)options completion:(S }]; } -+ (BOOL)handleCallback:(NSURL *)url -{ - NSParameterAssert(url != nil); - NSAssert(__currentProvider != nil, @"There is no provider waiting for single sign on callback"); - NSAssert([__currentProvider isKindOfClass:[SimpleAuthSingleSignOnProvider class]], @"Current provider does not handle single sign on"); ++ (BOOL)handleCallback:(NSURL *)URL { + NSParameterAssert(URL != nil); + + NSAssert(__currentProvider != nil, @"There is no provider waiting for single sign on callback."); + NSAssert([__currentProvider conformsToProtocol:@protocol(SimpleAuthSingleSignOnProvider)], @"The current provider does not handle single sign on."); - return [(SimpleAuthSingleSignOnProvider *)__currentProvider handleCallback:url]; + return [(id)__currentProvider handleCallback:URL]; } #pragma mark - Internal -+ (void)registerProviderClass:(Class)klass -{ - if (klass == [SimpleAuthSingleSignOnProvider class]) { - return; - } - - NSLog(@"registerProviderClass: %@", NSStringFromClass(klass)); ++ (void)registerProviderClass:(Class)klass { NSMutableDictionary *providers = [self providers]; - NSString *type = [klass type]; if (providers[type]) { NSLog(@"[SimpleAuth] Warning: multiple attempts to register provider for type: %@", type); @@ -105,8 +97,7 @@ + (void)registerProviderClass:(Class)klass #pragma mark - Private -+ (NSMutableDictionary *)providers -{ ++ (NSMutableDictionary *)providers { static dispatch_once_t token; static NSMutableDictionary *providers; dispatch_once(&token, ^{ @@ -116,8 +107,7 @@ + (NSMutableDictionary *)providers } -+ (void)loadProviders -{ ++ (void)loadProviders { [SimpleAuthProvider SimpleAuth_enumerateSubclassesWithBlock:^(Class klass, BOOL *stop) { [self registerProviderClass:klass]; }]; diff --git a/SimpleAuth/SimpleAuthSingleSignOnProvider.h b/SimpleAuth/SimpleAuthSingleSignOnProvider.h index d118175..6ec2aed 100644 --- a/SimpleAuth/SimpleAuthSingleSignOnProvider.h +++ b/SimpleAuth/SimpleAuthSingleSignOnProvider.h @@ -6,10 +6,8 @@ // Copyright (c) 2014 Byliner, Inc. All rights reserved. // -#import "SimpleAuthProvider.h" +@protocol SimpleAuthSingleSignOnProvider -@interface SimpleAuthSingleSignOnProvider : SimpleAuthProvider - -- (BOOL)handleCallback:(NSURL *)url; +- (BOOL)handleCallback:(NSURL *)URL; @end diff --git a/SimpleAuth/SimpleAuthSingleSignOnProvider.m b/SimpleAuth/SimpleAuthSingleSignOnProvider.m deleted file mode 100644 index 1d0a482..0000000 --- a/SimpleAuth/SimpleAuthSingleSignOnProvider.m +++ /dev/null @@ -1,19 +0,0 @@ -// -// SimpleAuthSingleSignOnProvider.m -// SimpleAuth -// -// Created by Julien Seren-Rosso on 14/02/2014. -// Copyright (c) 2014 Byliner, Inc. All rights reserved. -// - -#import "SimpleAuthSingleSignOnProvider.h" - -@implementation SimpleAuthSingleSignOnProvider - -- (BOOL)handleCallback:(NSURL *)url -{ - [self doesNotRecognizeSelector:_cmd]; - return NO; -} - -@end From 490e1880c9c4a2435c735b5aabfb87c1f52ffee6 Mon Sep 17 00:00:00 2001 From: Alexander Schuch Date: Mon, 17 Feb 2014 12:34:51 +0100 Subject: [PATCH 068/139] Add Sina Weibo web provider --- ...impleAuthSinaWeiboWebLoginViewController.h | 13 ++ ...impleAuthSinaWeiboWebLoginViewController.m | 45 ++++ .../SimpleAuthSinaWeiboWebProvider.h | 13 ++ .../SimpleAuthSinaWeiboWebProvider.m | 215 ++++++++++++++++++ SimpleAuth.xcodeproj/project.pbxproj | 21 ++ 5 files changed, 307 insertions(+) create mode 100644 Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h create mode 100644 Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m create mode 100644 Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h create mode 100644 Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h new file mode 100644 index 0000000..42b168d --- /dev/null +++ b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthSinaWeiboWebLoginViewController.h +// SimpleAuth +// +// Created by Alexander Schuch on 17/02/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthSinaWeiboWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m new file mode 100644 index 0000000..8159473 --- /dev/null +++ b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m @@ -0,0 +1,45 @@ +// +// SimpleAuthSinaWeiboWebLoginViewController.m +// SimpleAuth +// +// Created by Alexander Schuch on 17/02/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthSinaWeiboWebLoginViewController.h" + +@interface SimpleAuthSinaWeiboWebLoginViewController () + +@end + +@implementation SimpleAuthSinaWeiboWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Sina Weibo"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; + + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"state" : [[NSProcessInfo processInfo] globallyUniqueString], + @"display": @"mobile", + @"language": language + }; + + NSString *parameterString = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSString *URLString = [NSString stringWithFormat:@"https://api.weibo.com/oauth2/authorize?%@", parameterString]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h new file mode 100644 index 0000000..b01bf08 --- /dev/null +++ b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthSinaWeiboWebProvider.h +// SimpleAuth +// +// Created by Alexander Schuch on 17/02/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthSinaWeiboWebProvider : SimpleAuthProvider + +@end diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m new file mode 100644 index 0000000..fe9f963 --- /dev/null +++ b/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m @@ -0,0 +1,215 @@ +// +// SimpleAuthSinaWeiboWebProvider.m +// SimpleAuth +// +// Created by Alexander Schuch on 17/02/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthSinaWeiboWebProvider.h" +#import "SimpleAuthSinaWeiboWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthSinaWeiboWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"sinaweibo-web"; +} + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + options[SimpleAuthRedirectURIKey] = @"http://"; + + return options; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(id responseObject) { + NSArray *signals = @[ + [self accountWithAccessToken:responseObject], + [RACSignal return:responseObject] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(id responseObject) { + completion(responseObject, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + +#pragma mark - Private + +- (RACSignal *)authorizationCode { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthSinaWeiboWebLoginViewController *login = [[SimpleAuthSinaWeiboWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *code = dictionary[@"code"]; + + // Check for error + if (![code length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:code]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + + // Build request + NSDictionary *parameters = @{ + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"grant_type" : @"authorization_code" + }; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSURL *URL = [NSURL URLWithString:@"https://api.weibo.com/oauth2/access_token"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + request.HTTPMethod = @"POST"; + request.HTTPBody = [query dataUsingEncoding:NSUTF8StringEncoding]; + + // Run request + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + + return nil; + }]; +} + + +- (RACSignal *)accessToken { + return [[self authorizationCode] flattenMap:^(id responseObject) { + return [self accessTokenWithAuthorizationCode:responseObject]; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ + @"access_token" : accessToken[@"access_token"], + @"uid": accessToken[@"uid"] + }; + NSString *URLString = [NSString stringWithFormat:@"https://api.weibo.com/2/users/show.json?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + NSTimeInterval expiresAtInterval = [accessToken[@"expires_in"] doubleValue]; + NSDate *expiresAtDate = [NSDate dateWithTimeIntervalSinceNow:expiresAtInterval]; + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"access_token"], + @"expires_at" : expiresAtDate + }; + + // User ID + dictionary[@"uid"] = account[@"id"]; + + // Raw response + dictionary[@"raw_info"] = account; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"screen_name"] = account[@"screen_name"]; + user[@"name"] = account[@"name"]; + user[@"location"] = account[@"location"]; + user[@"description"] = account[@"description"]; + user[@"gender"] = account[@"gender"]; + user[@"image"] = account[@"avatar_large"]; + dictionary[@"user_info"] = user; + + return dictionary; +} + +@end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index a002561..9d24989 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -34,6 +34,8 @@ 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; + 4DD68DF418B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */; }; + 4DD68DF718B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */; }; 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; @@ -112,6 +114,10 @@ 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; + 4DD68DF218B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebProvider.h; sourceTree = ""; }; + 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebProvider.m; sourceTree = ""; }; + 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebLoginViewController.h; sourceTree = ""; }; + 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebLoginViewController.m; sourceTree = ""; }; 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebProvider.h; sourceTree = ""; }; 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; @@ -156,6 +162,7 @@ F9BE4F32189120BE00AE303A /* Foursquare Web */, 4D149A3E1889B38C0024639C /* Meetup */, 81A50A461892645800D5D8AC /* LinkedIn Web */, + 4DD68DF118B21A0F009B3767 /* SinaWeibo Web */, ); path = Providers; sourceTree = ""; @@ -359,6 +366,18 @@ name = Meetup; sourceTree = ""; }; + 4DD68DF118B21A0F009B3767 /* SinaWeibo Web */ = { + isa = PBXGroup; + children = ( + 4DD68DF218B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.h */, + 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */, + 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */, + 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */, + ); + name = "SinaWeibo Web"; + path = SinaWeiboWeb; + sourceTree = ""; + }; 81A50A461892645800D5D8AC /* LinkedIn Web */ = { isa = PBXGroup; children = ( @@ -501,6 +520,8 @@ files = ( 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, 3B658437188892FE00D59100 /* main.m in Sources */, + 4DD68DF718B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m in Sources */, + 4DD68DF418B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m in Sources */, 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From c7e589c494c7048c06574ea3f83816d1eb67fe88 Mon Sep 17 00:00:00 2001 From: Alexander Schuch Date: Mon, 17 Feb 2014 12:36:12 +0100 Subject: [PATCH 069/139] update sample project with Sina Weibo web provider --- SimpleAuthDemo/SADAppDelegate.m | 5 ++++- SimpleAuthDemo/SADProviderListViewController.m | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/SimpleAuthDemo/SADAppDelegate.m b/SimpleAuthDemo/SADAppDelegate.m index b5d5b35..8b4c39a 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/SimpleAuthDemo/SADAppDelegate.m @@ -65,8 +65,11 @@ - (void)configureAuthorizaionProviders { // client_id and redirect_uri are required SimpleAuth.configuration[@"dropbox-web"] = @{}; - // client_id, client_secret, and and redirect_uri are required + // client_id, client_secret, and redirect_uri are required SimpleAuth.configuration[@"linkedin-web"] = @{}; + + // client_id and client_secret are required + SimpleAuth.configuration[@"sinaweibo-web"] = @{}; } diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/SimpleAuthDemo/SADProviderListViewController.m index 4f8c7d0..604ec1d 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/SimpleAuthDemo/SADProviderListViewController.m @@ -52,7 +52,8 @@ + (NSArray *)providers { @"tumblr", @"foursquare-web", @"dropbox-web", - @"linkedin-web" + @"linkedin-web", + @"sinaweibo-web" ]; }); return array; From 1de169ae0ed93993cb550499d577774767547b2e Mon Sep 17 00:00:00 2001 From: Alexander Schuch Date: Tue, 18 Feb 2014 09:17:50 +0100 Subject: [PATCH 070/139] Added Sina Weibo web to podspec --- SimpleAuth.podspec | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 5522c5e..ea6016f 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -91,4 +91,11 @@ Pod::Spec.new do |s| ss.source_files = 'Providers/LinkedIn/**/*.{h,m}' ss.frameworks = 'UIKit' end + + s.subspec 'SinaWeiboWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + + ss.source_files = 'Providers/SinaWeiboWeb/**/*.{h,m}' + ss.frameworks = 'UIKit' + end end From 2d993756642b86bcb225abc2339ee4982e3464f2 Mon Sep 17 00:00:00 2001 From: Alexander Schuch Date: Tue, 18 Feb 2014 09:19:20 +0100 Subject: [PATCH 071/139] Updated Readme with Sina Weibo provider --- Readme.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Readme.markdown b/Readme.markdown index c56b5bd..c048591 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -12,6 +12,7 @@ SimpleAuth currently has the following providers: - [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) - [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/Meetup) +- [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) ## Installing @@ -92,3 +93,4 @@ Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising o - [kornifex](https://github.com/kornifex): Foursquare provider - [mouhcine](https://github.com/mouhcine): Meetup provider - [iamabhiee](https://github.com/iamabhiee): LinkedIn provider +- [aschuch](https://github.com/aschuch): Sina Weibo provider From 4ebe86241482de13590ee8bdf038cc72a1b8e531 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 27 Feb 2014 19:14:57 -0800 Subject: [PATCH 072/139] Move UI into platform-specific location to make way for OS X. #26. --- Podfile.lock | 8 +- SimpleAuth.podspec | 75 +++++++++++-------- SimpleAuth.xcodeproj/project.pbxproj | 57 ++++++++------ .../ios}/SimpleAuthWebViewController.h | 0 .../ios}/SimpleAuthWebViewController.m | 0 .../UIViewController+SimpleAuthAdditions.h | 0 .../UIViewController+SimpleAuthAdditions.m | 0 .../ios}/UIWindow+SimpleAuthAdditions.h | 0 .../ios}/UIWindow+SimpleAuthAdditions.m | 0 9 files changed, 81 insertions(+), 59 deletions(-) rename SimpleAuth/{ => UI/ios}/SimpleAuthWebViewController.h (100%) rename SimpleAuth/{ => UI/ios}/SimpleAuthWebViewController.m (100%) rename SimpleAuth/{ => UI/ios}/UIViewController+SimpleAuthAdditions.h (100%) rename SimpleAuth/{ => UI/ios}/UIViewController+SimpleAuthAdditions.m (100%) rename SimpleAuth/{ => UI/ios}/UIWindow+SimpleAuthAdditions.h (100%) rename SimpleAuth/{ => UI/ios}/UIWindow+SimpleAuthAdditions.m (100%) diff --git a/Podfile.lock b/Podfile.lock index 86b53b7..7855ef6 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -3,12 +3,12 @@ PODS: - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.2.3): + - ReactiveCocoa (2.2.4): - ReactiveCocoa/Core - ReactiveCocoa/no-arc - - ReactiveCocoa/Core (2.2.3): + - ReactiveCocoa/Core (2.2.4): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.2.3) + - ReactiveCocoa/no-arc (2.2.4) DEPENDENCIES: - CMDQueryStringSerialization @@ -19,6 +19,6 @@ SPEC CHECKSUMS: CMDQueryStringSerialization: f6118185b92689188026e648c4eb5e2c87b5835b cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 - ReactiveCocoa: b3cb6ebd50f1a0f2e39c6fd7ce3c428b6efcb22b + ReactiveCocoa: 953a45dda30674fe704d1d9c77cc874141742f47 COCOAPODS: 0.29.0 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 5522c5e..473f8f7 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -8,87 +8,96 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/calebd/SimpleAuth.git', :tag => "v#{s.version}" } s.requires_arc = true s.platform = :ios, '6.0' - + s.subspec 'Core' do |ss| ss.source_files = 'SimpleAuth/**/*.{h,m}' ss.public_header_files = 'SimpleAuth/SimpleAuth.h' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' end - + + s.subspec 'UI' do |ss| + ss.ios.source_files = 'SimpleAuth/UI/ios/**/*.{h,m}' + ss.ios.frameworks = 'UIKit' + + # ss.osx.source_files = 'SimpleAuth/UI/mac/**/*.{h,m}' + # ss.osx.frameworks = 'AppKit' + end + s.subspec 'Twitter' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/Twitter/**/*.{h,m}' - ss.frameworks = 'Accounts', 'Social', 'UIKit' - + ss.frameworks = 'Accounts', 'Social' + ss.dependency 'cocoa-oauth' end - + s.subspec 'Facebook' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.source_files = 'Providers/Facebook/**/*.{h,m}' ss.frameworks = 'Accounts', 'Social' end - + s.subspec 'FacebookWeb' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/FacebookWeb/**/*.{h,m}' - ss.frameworks = 'UIKit' end - + s.subspec 'Instagram' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/Instagram/**/*.{h,m}' - ss.frameworks = 'UIKit' end - + s.subspec 'TwitterWeb' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/TwitterWeb/**/*.{h,m}' - ss.frameworks = 'UIKit' - + ss.dependency 'cocoa-oauth' end - + s.subspec 'Meetup' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/Meetup/**/*.{h,m}' - ss.frameworks = 'UIKit' end - + s.subspec 'Tumblr' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/Tumblr/**/*.{h,m}' - ss.frameworks = 'UIKit' - + ss.dependency 'cocoa-oauth' end - + s.subspec 'FoursquareWeb' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' - ss.frameworks = 'UIKit' end - + s.subspec 'DropboxWeb' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' - ss.frameworks = 'UIKit' end - + s.subspec 'LinkedInWeb' do |ss| ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Providers/LinkedIn/**/*.{h,m}' - ss.frameworks = 'UIKit' end end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index a002561..9d43664 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -22,6 +22,10 @@ 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */; }; 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */; }; 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */; }; + 3B69D1F818C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */; }; + 3B69D1F918C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */; }; + 3B69D1FA18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */; }; + 3B69D1FB18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */; }; 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; @@ -30,8 +34,6 @@ 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */; }; 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */; }; 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; - 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */; }; - 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */; }; 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; @@ -86,6 +88,10 @@ 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFaceBookWebProvider.m; sourceTree = ""; }; 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFacebookWebLoginViewController.h; sourceTree = ""; }; 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFacebookWebLoginViewController.m; sourceTree = ""; }; + 3B69D1F418C0340200E3D415 /* UIViewController+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+SimpleAuthAdditions.h"; sourceTree = ""; }; + 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+SimpleAuthAdditions.m"; sourceTree = ""; }; + 3B69D1F618C0340200E3D415 /* UIWindow+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+SimpleAuthAdditions.h"; sourceTree = ""; }; + 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+SimpleAuthAdditions.m"; sourceTree = ""; }; 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebProvider.h; sourceTree = ""; }; 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebProvider.m; sourceTree = ""; }; 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebLoginViewController.h; sourceTree = ""; }; @@ -104,10 +110,6 @@ 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthDropboxWebLoginViewController.m; sourceTree = ""; }; 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthWebViewController.h; sourceTree = ""; }; 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthWebViewController.m; sourceTree = ""; }; - 3C611F431835352200D87E45 /* UIWindow+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+SimpleAuthAdditions.h"; sourceTree = ""; }; - 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+SimpleAuthAdditions.m"; sourceTree = ""; }; - 3C611F46183535A400D87E45 /* UIViewController+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+SimpleAuthAdditions.h"; sourceTree = ""; }; - 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+SimpleAuthAdditions.m"; sourceTree = ""; }; 4D149A3F1889B3DF0024639C /* SimpleAuthMeetupProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupProvider.h; path = Meetup/SimpleAuthMeetupProvider.h; sourceTree = ""; }; 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; @@ -236,6 +238,28 @@ path = FacebookWeb; sourceTree = ""; }; + 3B69D1F218C0340200E3D415 /* UI */ = { + isa = PBXGroup; + children = ( + 3B69D1F318C0340200E3D415 /* ios */, + ); + path = UI; + sourceTree = ""; + }; + 3B69D1F318C0340200E3D415 /* ios */ = { + isa = PBXGroup; + children = ( + 3B69D1F418C0340200E3D415 /* UIViewController+SimpleAuthAdditions.h */, + 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */, + 3B69D1F618C0340200E3D415 /* UIWindow+SimpleAuthAdditions.h */, + 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */, + 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */, + 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */, + ); + name = ios; + path = iOS; + sourceTree = ""; + }; 3B8C408B18879296007DC578 /* Twitter Web */ = { isa = PBXGroup; children = ( @@ -296,8 +320,8 @@ children = ( 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */, 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */, + 3B69D1F218C0340200E3D415 /* UI */, 3B8F11B8182AC0E50035C4EA /* Providers */, - 3C0A5390182C4206002C050C /* View Controllers */, 3C611F421835350800D87E45 /* Categories */, 3BB3250A182ABC8B00ACB555 /* Supporting Files */, ); @@ -324,22 +348,9 @@ path = DropboxWeb; sourceTree = ""; }; - 3C0A5390182C4206002C050C /* View Controllers */ = { - isa = PBXGroup; - children = ( - 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */, - 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */, - ); - name = "View Controllers"; - sourceTree = ""; - }; 3C611F421835350800D87E45 /* Categories */ = { isa = PBXGroup; children = ( - 3C611F431835352200D87E45 /* UIWindow+SimpleAuthAdditions.h */, - 3C611F441835352200D87E45 /* UIWindow+SimpleAuthAdditions.m */, - 3C611F46183535A400D87E45 /* UIViewController+SimpleAuthAdditions.h */, - 3C611F47183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m */, 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */, 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */, 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */, @@ -499,7 +510,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3B69D1F918C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, + 3B69D1FB18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3B658437188892FE00D59100 /* main.m in Sources */, 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, ); @@ -516,20 +529,20 @@ 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */, 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, + 3B69D1FA18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */, + 3B69D1F818C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */, 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */, - 3C611F48183535A400D87E45 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */, 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, - 3C611F451835352200D87E45 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */, 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, diff --git a/SimpleAuth/SimpleAuthWebViewController.h b/SimpleAuth/UI/ios/SimpleAuthWebViewController.h similarity index 100% rename from SimpleAuth/SimpleAuthWebViewController.h rename to SimpleAuth/UI/ios/SimpleAuthWebViewController.h diff --git a/SimpleAuth/SimpleAuthWebViewController.m b/SimpleAuth/UI/ios/SimpleAuthWebViewController.m similarity index 100% rename from SimpleAuth/SimpleAuthWebViewController.m rename to SimpleAuth/UI/ios/SimpleAuthWebViewController.m diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.h b/SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.h similarity index 100% rename from SimpleAuth/UIViewController+SimpleAuthAdditions.h rename to SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.h diff --git a/SimpleAuth/UIViewController+SimpleAuthAdditions.m b/SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.m similarity index 100% rename from SimpleAuth/UIViewController+SimpleAuthAdditions.m rename to SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.m diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.h b/SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.h similarity index 100% rename from SimpleAuth/UIWindow+SimpleAuthAdditions.h rename to SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.h diff --git a/SimpleAuth/UIWindow+SimpleAuthAdditions.m b/SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.m similarity index 100% rename from SimpleAuth/UIWindow+SimpleAuthAdditions.m rename to SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.m From df34a7c47750d5f394da7ab6fbf0475a88e82c61 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 27 Feb 2014 19:19:33 -0800 Subject: [PATCH 073/139] Bump version. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index fd2fbb5..cc57058 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.2' + s.version = '0.3.3' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 0b35a55cd9a234b89c7bcefbde769f1a1cd44e79 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 27 Feb 2014 19:29:44 -0800 Subject: [PATCH 074/139] Exclude UI directory from Core sub spec. --- SimpleAuth.podspec | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index cc57058..c792b95 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -12,11 +12,14 @@ Pod::Spec.new do |s| s.subspec 'Core' do |ss| ss.source_files = 'SimpleAuth/**/*.{h,m}' ss.public_header_files = 'SimpleAuth/SimpleAuth.h' + ss.exclude_files = 'SimpleAuth/UI' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' end s.subspec 'UI' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.ios.source_files = 'SimpleAuth/UI/ios/**/*.{h,m}' ss.ios.frameworks = 'UIKit' @@ -25,7 +28,6 @@ Pod::Spec.new do |s| end s.subspec 'Twitter' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' ss.source_files = 'Providers/Twitter/**/*.{h,m}' @@ -42,16 +44,12 @@ Pod::Spec.new do |s| end s.subspec 'FacebookWeb' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/FacebookWeb/**/*.{h,m}' end s.subspec 'Instagram' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/Instagram/**/*.{h,m}' end @@ -65,9 +63,7 @@ Pod::Spec.new do |s| end s.subspec 'Meetup' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/Meetup/**/*.{h,m}' end @@ -81,30 +77,22 @@ Pod::Spec.new do |s| end s.subspec 'FoursquareWeb' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' end s.subspec 'DropboxWeb' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' end s.subspec 'LinkedInWeb' do |ss| - ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/LinkedIn/**/*.{h,m}' end s.subspec 'SinaWeiboWeb' do |ss| - ss.dependency 'SimpleAuth/Core' - + ss.dependency 'SimpleAuth/UI' ss.source_files = 'Providers/SinaWeiboWeb/**/*.{h,m}' - ss.frameworks = 'UIKit' end end From 911228347565998cfe7960dced422a237d2802cb Mon Sep 17 00:00:00 2001 From: Gerson Alexander Pardo Gamez Date: Sun, 23 Mar 2014 07:21:31 -0500 Subject: [PATCH 075/139] optional information I tried login with test accounts and sometimes users can not have certain fields like username, email or verified not having these fields cause an error in the application --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 10d356d..731272c 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -161,8 +161,8 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"nickname"] = account[@"username"]; - user[@"email"] = account[@"email"]; + user[@"nickname"] = account[@"username"] ? account[@"username"] : @""; + user[@"email"] = account[@"email"] ? account[@"email"] : @""; user[@"name"] = account[@"name"]; user[@"first_name"] = account[@"first_name"]; user[@"last_name"] = account[@"last_name"]; @@ -170,7 +170,7 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD if (location) { user[@"location"] = location; } - user[@"verified"] = account[@"verified"]; + user[@"verified"] = account[@"verified"] ? account[@"verified"] : @"" ; user[@"urls"] = @{ @"Facebook" : account[@"link"], }; From 423327711881c285601d4a2acb8e4d11e55879c4 Mon Sep 17 00:00:00 2001 From: Gerson Alexander Pardo Gamez Date: Sun, 23 Mar 2014 08:07:52 -0500 Subject: [PATCH 076/139] Update SimpleAuthFaceBookWebProvider.m From Facebook: On the web, basic_info is implied with every request and isn't required, although the best practice is to include it. Passing basic_info is required on iOS and Android with every permission request. A person's public profile refers to the following properties on the user object by default: id name first_name last_name link username gender locale age_range Other public information https://developers.facebook.com/docs/facebook-login/permissions/ --- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 731272c..a159c9d 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -40,7 +40,7 @@ + (NSDictionary *)defaultOptions { dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; dictionary[SimpleAuthRedirectURIKey] = @"https://www.facebook.com/connect/login_success.html"; - dictionary[@"permissions"] = @[ @"email" ]; + dictionary[@"permissions"] = @[ @"email", @"basic_info" ]; return dictionary; } @@ -157,11 +157,11 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", account[@"id"]]; // Location - NSString *location = account[@"location"][@"name"]; + NSString *location = account[@"location"] && account[@"location"][@"name"] ? account[@"location"][@"name"] : @""; // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"nickname"] = account[@"username"] ? account[@"username"] : @""; + user[@"nickname"] = account[@"username"]; user[@"email"] = account[@"email"] ? account[@"email"] : @""; user[@"name"] = account[@"name"]; user[@"first_name"] = account[@"first_name"]; From 620e4446138fd89c1d27f40bd10de62fa7953ae5 Mon Sep 17 00:00:00 2001 From: Antoine Marcadet Date: Thu, 10 Apr 2014 21:01:42 +0200 Subject: [PATCH 077/139] Fix for nil values that cause a crash --- Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index 7bdfd40..8b16899 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -145,9 +145,9 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"first_name"] = userData[@"firstName"]; - user[@"last_name"] = userData[@"lastName"]; - user[@"photo"] = userData[@"photo"]; + user[@"first_name"] = userData[@"firstName"] ?: [NSNull null]; + user[@"last_name"] = userData[@"lastName"] ?: [NSNull null]; + user[@"photo"] = userData[@"photo"] ?: [NSNull null]; dictionary[@"user_info"] = user; return dictionary; From 521e3b7d9acec5873e0dff95c3c1367751173e16 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Mon, 21 Apr 2014 14:41:01 -0700 Subject: [PATCH 078/139] Update pods. --- Podfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 7855ef6..4025121 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,14 +1,14 @@ PODS: - - CMDQueryStringSerialization (0.1.0) + - CMDQueryStringSerialization (0.2.0) - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.2.4): + - ReactiveCocoa (2.3): - ReactiveCocoa/Core - ReactiveCocoa/no-arc - - ReactiveCocoa/Core (2.2.4): + - ReactiveCocoa/Core (2.3): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.2.4) + - ReactiveCocoa/no-arc (2.3) DEPENDENCIES: - CMDQueryStringSerialization @@ -16,9 +16,9 @@ DEPENDENCIES: - ReactiveCocoa SPEC CHECKSUMS: - CMDQueryStringSerialization: f6118185b92689188026e648c4eb5e2c87b5835b + CMDQueryStringSerialization: 6e9b97d0e4d9547419b6f9b428adc423a6e6e511 cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 - ReactiveCocoa: 953a45dda30674fe704d1d9c77cc874141742f47 + ReactiveCocoa: 1f6265f9d521923d3efcc37b00722cefc16df269 -COCOAPODS: 0.29.0 +COCOAPODS: 0.32.1 From 8ba749bfcdaacdc7330385d4dddb80a0004b0120 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 25 Apr 2014 10:47:17 -0700 Subject: [PATCH 079/139] Cleanup and simplify logic. --- Providers/Facebook/SimpleAuthFacebookProvider.m | 8 +++++--- Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index 15bddbe..eb5d85d 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -25,7 +25,7 @@ + (NSString *)type { + (NSDictionary *)defaultOptions { return @{ @"permissions" : @[ @"email" ], - @"audience" : @[ACFacebookAudienceOnlyMe] + @"audience" : @[ ACFacebookAudienceOnlyMe ] }; } @@ -124,7 +124,9 @@ - (NSDictionary *)dictionaryWithRemoteAccount:(NSDictionary *)remoteAccount syst // User info NSMutableDictionary *user = [NSMutableDictionary new]; user[@"nickname"] = remoteAccount[@"username"]; - user[@"email"] = remoteAccount[@"email"]; + if (remoteAccount[@"email"]) { + user[@"email"] = remoteAccount[@"email"]; + } user[@"name"] = remoteAccount[@"name"]; user[@"first_name"] = remoteAccount[@"first_name"]; user[@"last_name"] = remoteAccount[@"last_name"]; @@ -132,7 +134,7 @@ - (NSDictionary *)dictionaryWithRemoteAccount:(NSDictionary *)remoteAccount syst if (location) { user[@"location"] = location; } - user[@"verified"] = remoteAccount[@"verified"]; + user[@"verified"] = remoteAccount[@"verified"] ?: @NO; user[@"urls"] = @{ @"Facebook" : remoteAccount[@"link"], }; diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index a159c9d..63d3e6d 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -40,7 +40,7 @@ + (NSDictionary *)defaultOptions { dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; dictionary[SimpleAuthRedirectURIKey] = @"https://www.facebook.com/connect/login_success.html"; - dictionary[@"permissions"] = @[ @"email", @"basic_info" ]; + dictionary[@"permissions"] = @[ @"email" ]; return dictionary; } @@ -157,12 +157,14 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", account[@"id"]]; // Location - NSString *location = account[@"location"] && account[@"location"][@"name"] ? account[@"location"][@"name"] : @""; + NSString *location = account[@"location"][@"name"]; // User info NSMutableDictionary *user = [NSMutableDictionary new]; user[@"nickname"] = account[@"username"]; - user[@"email"] = account[@"email"] ? account[@"email"] : @""; + if (account[@"email"]) { + user[@"email"] = account[@"email"]; + } user[@"name"] = account[@"name"]; user[@"first_name"] = account[@"first_name"]; user[@"last_name"] = account[@"last_name"]; @@ -170,7 +172,7 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD if (location) { user[@"location"] = location; } - user[@"verified"] = account[@"verified"] ? account[@"verified"] : @"" ; + user[@"verified"] = account[@"verified"] ?: @NO; user[@"urls"] = @{ @"Facebook" : account[@"link"], }; From e9e8b6908529eb9602585d251852b2912139accb Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 25 Apr 2014 11:41:38 -0700 Subject: [PATCH 080/139] Who needs frameworks? --- SimpleAuth.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 49d25fd..89e548b 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -69,9 +69,6 @@ 3B52BB99188731A300C73329 /* SimpleAuthInstagramProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthInstagramProvider.h; sourceTree = ""; }; 3B52BB9A188731A300C73329 /* SimpleAuthInstagramProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthInstagramProvider.m; sourceTree = ""; }; 3B658429188892FD00D59100 /* SimpleAuthDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleAuthDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B65842A188892FE00D59100 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 3B65842C188892FE00D59100 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 3B65842E188892FE00D59100 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 3B658432188892FE00D59100 /* SimpleAuthDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SimpleAuthDemo-Info.plist"; sourceTree = ""; }; 3B658434188892FE00D59100 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 3B658436188892FE00D59100 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -79,7 +76,6 @@ 3B658439188892FE00D59100 /* SADAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADAppDelegate.h; sourceTree = ""; }; 3B65843A188892FE00D59100 /* SADAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SADAppDelegate.m; sourceTree = ""; }; 3B65843C188892FE00D59100 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 3B658443188892FE00D59100 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 3B6584571888931F00D59100 /* SADProviderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SADProviderListViewController.m; sourceTree = ""; }; 3B6584591888933200D59100 /* SADProviderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADProviderListViewController.h; sourceTree = ""; }; 3B65845E1888A94200D59100 /* SimpleAuthTumblrProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrProvider.h; sourceTree = ""; }; @@ -314,10 +310,6 @@ isa = PBXGroup; children = ( 0D4998CFA03844FB99EE78AA /* libPods.a */, - 3B65842A188892FE00D59100 /* Foundation.framework */, - 3B65842C188892FE00D59100 /* CoreGraphics.framework */, - 3B65842E188892FE00D59100 /* UIKit.framework */, - 3B658443188892FE00D59100 /* XCTest.framework */, ); name = Frameworks; sourceTree = ""; From 09d03f10265e5b41005fe022139e32859c46eb0a Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 25 Apr 2014 11:47:15 -0700 Subject: [PATCH 081/139] Minor cleanup. --- .../SimpleAuthFoursquareWebProvider.m | 18 +++++++++++++----- .../Instagram/SimpleAuthInstagramProvider.m | 6 ++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index 8b16899..1ca91c7 100644 --- a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -141,14 +141,22 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS dictionary[@"uid"] = userData[@"id"]; // Raw response - dictionary[@"raw_info"] = account; + dictionary[@"extra"] = @{ + @"raw_info" : userData + }; // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"first_name"] = userData[@"firstName"] ?: [NSNull null]; - user[@"last_name"] = userData[@"lastName"] ?: [NSNull null]; - user[@"photo"] = userData[@"photo"] ?: [NSNull null]; - dictionary[@"user_info"] = user; + if (userData[@"firstName"]) { + user[@"first_name"] = userData[@"firstName"]; + } + if (userData[@"lastName"]) { + user[@"last_name"] = userData[@"lastName"]; + } + if (userData[@"photo"]) { + user[@"photo"] = userData[@"photo"]; + } + dictionary[@"info"] = user; return dictionary; } diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Providers/Instagram/SimpleAuthInstagramProvider.m index a89a259..d8c1227 100644 --- a/Providers/Instagram/SimpleAuthInstagramProvider.m +++ b/Providers/Instagram/SimpleAuthInstagramProvider.m @@ -143,8 +143,10 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS // User ID dictionary[@"uid"] = data[@"id"]; - // Raw response - dictionary[@"raw_info"] = account; + // Extra + dictionary[@"extra"] = @{ + @"raw_info" : account + }; // User info NSMutableDictionary *user = [NSMutableDictionary new]; From 2404bbf6fef2c9340531c6e41ccd49d8f0001717 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 25 Apr 2014 11:59:24 -0700 Subject: [PATCH 082/139] Ignore cache data and cookies on all web view authentication requests. Fixes #56. --- SimpleAuth/UI/ios/SimpleAuthWebViewController.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/SimpleAuth/UI/ios/SimpleAuthWebViewController.m b/SimpleAuth/UI/ios/SimpleAuthWebViewController.m index 1cf0b71..2717e06 100644 --- a/SimpleAuth/UI/ios/SimpleAuthWebViewController.m +++ b/SimpleAuth/UI/ios/SimpleAuthWebViewController.m @@ -37,6 +37,7 @@ - (void)viewDidAppear:(BOOL)animated { if (!_hasInitialLoad) { _hasInitialLoad = YES; NSURLRequest *request = [self initialRequest]; + request = [[self class] canonicalRequestForRequest:request]; [self.webView loadRequest:request]; } } @@ -87,6 +88,16 @@ - (NSURLRequest *)initialRequest { } +#pragma mark - Private + ++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + [mutableRequest setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; + [mutableRequest setHTTPShouldHandleCookies:NO]; + return mutableRequest; +} + + #pragma mark - Accessors - (UIWebView *)webView { From 47fe911292e50444f098c2cb88bd59d0016867ab Mon Sep 17 00:00:00 2001 From: Mark Krenek Date: Mon, 14 Jul 2014 15:45:34 -0500 Subject: [PATCH 083/139] Re-enable cookies Fixes #63 by undoing the disabling of cookies that happening in commit 2404bbf. --- SimpleAuth/UI/ios/SimpleAuthWebViewController.m | 1 - 1 file changed, 1 deletion(-) diff --git a/SimpleAuth/UI/ios/SimpleAuthWebViewController.m b/SimpleAuth/UI/ios/SimpleAuthWebViewController.m index 2717e06..33f0ec9 100644 --- a/SimpleAuth/UI/ios/SimpleAuthWebViewController.m +++ b/SimpleAuth/UI/ios/SimpleAuthWebViewController.m @@ -93,7 +93,6 @@ - (NSURLRequest *)initialRequest { + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { NSMutableURLRequest *mutableRequest = [request mutableCopy]; [mutableRequest setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; - [mutableRequest setHTTPShouldHandleCookies:NO]; return mutableRequest; } From 66397312f325a1134bdba35ee307b49702cd8543 Mon Sep 17 00:00:00 2001 From: Mark Krenek Date: Thu, 17 Jul 2014 18:04:40 -0500 Subject: [PATCH 084/139] Fix #65 LinkedIn field selectors Adds ability to specify the field selectors passed to LinkedIn when fetching the user profile. --- Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m index 607df05..ad889c6 100644 --- a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m +++ b/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m @@ -151,9 +151,21 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { @"oauth2_access_token" : accessToken[@"access_token"], @"format" : @"json" }; - NSString *URLString = [NSString stringWithFormat: + // field_selectors control the fields that LinkedIn returns for the user object. If none specified, LinkedIn returns a minimal set. + NSString *URLString; + if (self.options[@"field_selectors"]) + { + URLString = [NSString stringWithFormat: + @"https://api.linkedin.com/v1/people/~:(%@)?%@", + [self.options[@"field_selectors"] componentsJoinedByString:@","], + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + } + else + { + URLString = [NSString stringWithFormat: @"https://api.linkedin.com/v1/people/~?%@", [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + } NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue From 331a08a7ca73f4e4f8f0e45796db6156db7b79b9 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 4 Sep 2014 16:59:16 -0700 Subject: [PATCH 085/139] Remove facebook username. Fixes #59. --- Providers/Facebook/SimpleAuthFacebookProvider.m | 1 - Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m | 1 - 2 files changed, 2 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index eb5d85d..b41a02c 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -123,7 +123,6 @@ - (NSDictionary *)dictionaryWithRemoteAccount:(NSDictionary *)remoteAccount syst // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"nickname"] = remoteAccount[@"username"]; if (remoteAccount[@"email"]) { user[@"email"] = remoteAccount[@"email"]; } diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 63d3e6d..61e6c55 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -161,7 +161,6 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSD // User info NSMutableDictionary *user = [NSMutableDictionary new]; - user[@"nickname"] = account[@"username"]; if (account[@"email"]) { user[@"email"] = account[@"email"]; } From 7d3bb68d70cbca7d53c0212b579f319087c1c803 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 4 Sep 2014 17:00:00 -0700 Subject: [PATCH 086/139] Update pods. --- Podfile.lock | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Podfile.lock b/Podfile.lock index 4025121..003d290 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,14 +1,17 @@ PODS: - - CMDQueryStringSerialization (0.2.0) + - CMDQueryStringSerialization (0.3.1): + - ISO8601 - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) + - ISO8601 (0.1.1) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.3): - - ReactiveCocoa/Core - - ReactiveCocoa/no-arc - - ReactiveCocoa/Core (2.3): + - ReactiveCocoa (2.3.1): + - ReactiveCocoa/UI + - ReactiveCocoa/Core (2.3.1): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.3) + - ReactiveCocoa/no-arc (2.3.1) + - ReactiveCocoa/UI (2.3.1): + - ReactiveCocoa/Core DEPENDENCIES: - CMDQueryStringSerialization @@ -16,9 +19,10 @@ DEPENDENCIES: - ReactiveCocoa SPEC CHECKSUMS: - CMDQueryStringSerialization: 6e9b97d0e4d9547419b6f9b428adc423a6e6e511 - cocoa-oauth: 8f4c8b77c77ac660de37f8125557c4ec09b0118a - NSData+Base64: 4819562faee4544e3cf5703f2139820b09732b28 - ReactiveCocoa: 1f6265f9d521923d3efcc37b00722cefc16df269 + CMDQueryStringSerialization: 96f05d3225b6a0f6b7445a308c9e50bf84a5ba13 + cocoa-oauth: 418c70e6ce4130fa7ebdf05232018c8f391030d8 + ISO8601: a6afce5fbe854024802367c814fac4aa8d3586f9 + NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 + ReactiveCocoa: dca75777b9d18990c8714a3a6f2149f29b4d1462 -COCOAPODS: 0.32.1 +COCOAPODS: 0.33.1 From 426e6906704db79066183297cb938c4a9b02a5f2 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 4 Sep 2014 17:00:36 -0700 Subject: [PATCH 087/139] Version bump. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index c792b95..8d636b1 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.3' + s.version = '0.3.4' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 5a485ec1d7cb7de3136ad353b957ec2998a4b932 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 23 Sep 2014 19:22:12 -0700 Subject: [PATCH 088/139] Add better handling for Twitter provider. --- Providers/Twitter/SimpleAuthTwitterProvider.m | 31 ++++++++++++++++--- SimpleAuth/ACAccountStore+SimpleAuth.m | 15 +++++++-- SimpleAuth/SimpleAuth.h | 24 ++++++++++++-- SimpleAuth/SimpleAuth.m | 1 + 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index 930aaca..e3ab24b 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -134,7 +134,13 @@ - (RACSignal *)reverseAuthRequestToken { [subscriber sendCompleted]; } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; @@ -165,11 +171,22 @@ - (RACSignal *)remoteAccountWithSystemAccount:(ACAccount *)account { [subscriber sendCompleted]; } else { - [subscriber sendNext:parseError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (parseError) { + dictionary[NSUnderlyingErrorKey] = parseError; + } + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorInvalidData userInfo:dictionary]; + [subscriber sendNext:error]; } } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; @@ -196,7 +213,13 @@ - (RACSignal *)accessTokenWithReverseAuthRequestToken:(NSString *)token account: [subscriber sendCompleted]; } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; diff --git a/SimpleAuth/ACAccountStore+SimpleAuth.m b/SimpleAuth/ACAccountStore+SimpleAuth.m index 211853e..dc7e3f6 100644 --- a/SimpleAuth/ACAccountStore+SimpleAuth.m +++ b/SimpleAuth/ACAccountStore+SimpleAuth.m @@ -6,6 +6,7 @@ // Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. // +#import "SimpleAuth.h" #import "ACAccountStore+SimpleAuth.h" #import @@ -25,12 +26,16 @@ + (RACSignal *)SimpleAuth_accountsWithTypeIdentifier:(NSString *)typeIdentifier return [RACSignal createSignal:^RACDisposable *(id subscriber) { ACAccountStore *store = [self SimpleAuth_sharedAccountStore]; ACAccountType *type = [store accountTypeWithAccountTypeIdentifier:typeIdentifier]; - [store requestAccessToAccountsWithType:type options:options completion:^(BOOL granted, NSError *error) { + [store requestAccessToAccountsWithType:type options:options completion:^(BOOL granted, NSError *accountsError) { if (granted) { NSArray *accounts = [store accountsWithAccountType:type]; NSUInteger numberOfAccounts = [accounts count]; if (numberOfAccounts == 0) { - [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorAccountNotFound userInfo:nil])]; + NSDictionary *dictionary = @{ + NSUnderlyingErrorKey: accountsError ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorAccountNotFound userInfo:nil] + }; + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorAccounts userInfo:dictionary]; + [subscriber sendError:error]; } else { [subscriber sendNext:accounts]; @@ -38,7 +43,11 @@ + (RACSignal *)SimpleAuth_accountsWithTypeIdentifier:(NSString *)typeIdentifier } } else { - [subscriber sendError:(error ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorPermissionDenied userInfo:nil])]; + NSDictionary *dictionary = @{ + NSUnderlyingErrorKey: accountsError ?: [[NSError alloc] initWithDomain:ACErrorDomain code:ACErrorPermissionDenied userInfo:nil] + }; + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorAccounts userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; diff --git a/SimpleAuth/SimpleAuth.h b/SimpleAuth/SimpleAuth.h index 603f02b..8d60b76 100644 --- a/SimpleAuth/SimpleAuth.h +++ b/SimpleAuth/SimpleAuth.h @@ -7,8 +7,28 @@ // extern NSString * const SimpleAuthErrorDomain; -enum { - SimpleAuthErrorUserCancelled +extern NSString * const SimpleAuthErrorStatusCodeKey; +typedef NS_ENUM(NSUInteger, SimpleAuthError) { + + /** + The user cancelled authentication. + */ + SimpleAuthErrorUserCancelled, + + /* + An error that occurred as the result of a failed network operation. + */ + SimpleAuthErrorNetwork, + + /** + An error that originated in Accounts.framework. + */ + SimpleAuthErrorAccounts, + + /** + Returned if SimpleAuth was able to parse response data. + */ + SimpleAuthErrorInvalidData }; /** diff --git a/SimpleAuth/SimpleAuth.m b/SimpleAuth/SimpleAuth.m index a952aa2..afbde62 100644 --- a/SimpleAuth/SimpleAuth.m +++ b/SimpleAuth/SimpleAuth.m @@ -19,6 +19,7 @@ NSString * const SimpleAuthPresentInterfaceBlockKey = @"present_interface_block"; NSString * const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; NSString * const SimpleAuthRedirectURIKey = @"redirect_uri"; +NSString * const SimpleAuthErrorStatusCodeKey = @"SimpleAuthErrorStatusCode"; static SimpleAuthProvider *__currentProvider = nil; From f14e0edd6f4aeaec839196e6e1181f942b386804 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 23 Sep 2014 19:38:30 -0700 Subject: [PATCH 089/139] Version bump. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 8d636b1..9ef197e 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.4' + s.version = '0.3.5' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 179b95fc51c8c183c88ed46c3acf88e6e3618d7f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 14:54:46 -0700 Subject: [PATCH 090/139] Update CocoaPods and build settings. --- Podfile | 3 +- Podfile.lock | 2 +- SimpleAuth.xcodeproj/project.pbxproj | 24 ++++-- .../xcschemes/SimpleAuth.xcscheme | 77 +++++++++++++++++ .../xcschemes/SimpleAuthDemo.xcscheme | 86 +++++++++++++++++++ .../contents.xcworkspacedata | 10 +++ 6 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme create mode 100644 SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme create mode 100644 SimpleAuth.xcworkspace/contents.xcworkspacedata diff --git a/Podfile b/Podfile index 636556f..2999707 100644 --- a/Podfile +++ b/Podfile @@ -1,3 +1,4 @@ +source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' -podspec :name => 'SimpleAuth' \ No newline at end of file +podspec :name => 'SimpleAuth' diff --git a/Podfile.lock b/Podfile.lock index 003d290..6c1c7b4 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -25,4 +25,4 @@ SPEC CHECKSUMS: NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: dca75777b9d18990c8714a3a6f2149f29b4d1462 -COCOAPODS: 0.33.1 +COCOAPODS: 0.34.1 diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 89e548b..01132a0 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -57,7 +57,7 @@ /* Begin PBXFileReference section */ 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; + 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ACAccountStore+SimpleAuth.h"; sourceTree = ""; }; 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ACAccountStore+SimpleAuth.m"; sourceTree = ""; }; 3B52BB8F1887088400C73329 /* SimpleAuthTwitterProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterProvider.h; sourceTree = ""; }; @@ -116,6 +116,7 @@ 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebProvider.m; sourceTree = ""; }; 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebLoginViewController.h; sourceTree = ""; }; 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebLoginViewController.m; sourceTree = ""; }; + 55342A24817A3976616170C2 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebProvider.h; sourceTree = ""; }; 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; @@ -293,7 +294,7 @@ 3B658430188892FE00D59100 /* SimpleAuthDemo */, 3BB32506182ABC8B00ACB555 /* Frameworks */, 3BB32505182ABC8B00ACB555 /* Products */, - 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */, + E41F3FB2B4E976B36518620C /* Pods */, ); sourceTree = ""; }; @@ -393,6 +394,15 @@ path = LinkedIn; sourceTree = ""; }; + E41F3FB2B4E976B36518620C /* Pods */ = { + isa = PBXGroup; + children = ( + 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */, + 55342A24817A3976616170C2 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; F9BE4F32189120BE00AE303A /* Foursquare Web */ = { isa = PBXGroup; children = ( @@ -511,7 +521,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -587,7 +597,6 @@ /* Begin XCBuildConfiguration section */ 3B658451188892FE00D59100 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -610,7 +619,6 @@ }; 3B658452188892FE00D59100 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -699,12 +707,11 @@ }; 3BB32528182ABC8C00ACB555 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; + baseConfigurationReference = 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */; buildSettings = { DSTROOT = /tmp/SimpleAuth.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimpleAuth/SimpleAuth-Prefix.pch"; - OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; @@ -712,12 +719,11 @@ }; 3BB32529182ABC8C00ACB555 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FCEF85A832046CDB0CCBF25 /* Pods.xcconfig */; + baseConfigurationReference = 55342A24817A3976616170C2 /* Pods.release.xcconfig */; buildSettings = { DSTROOT = /tmp/SimpleAuth.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimpleAuth/SimpleAuth-Prefix.pch"; - OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; }; diff --git a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme b/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme new file mode 100644 index 0000000..bf67556 --- /dev/null +++ b/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme b/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme new file mode 100644 index 0000000..84faccf --- /dev/null +++ b/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SimpleAuth.xcworkspace/contents.xcworkspacedata b/SimpleAuth.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..aea7705 --- /dev/null +++ b/SimpleAuth.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + From 04e99aa0cf047edf5b3da682885bf8fe56169e67 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 15:03:31 -0700 Subject: [PATCH 091/139] Add new error reporting to Twitter web provider. --- Providers/Twitter/SimpleAuthTwitterProvider.m | 3 +- .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 38 ++++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Providers/Twitter/SimpleAuthTwitterProvider.m index e3ab24b..9c4ce7d 100644 --- a/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -124,8 +124,7 @@ - (RACSignal *)reverseAuthRequestToken { consumerSecret:self.options[@"consumer_secret"] accessToken:nil tokenSecret:nil]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m index 5848d35..4171caa 100644 --- a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m +++ b/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m @@ -83,8 +83,7 @@ - (RACSignal *)requestToken { consumerSecret:self.options[@"consumer_secret"] accessToken:nil tokenSecret:nil]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { @@ -94,6 +93,12 @@ - (RACSignal *)requestToken { [subscriber sendCompleted]; } else { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; [subscriber sendError:error]; } }]; @@ -148,8 +153,7 @@ - (RACSignal *)accessTokenWithAuthenticationResponse:(NSDictionary *)authenticat consumerSecret:self.options[@"consumer_secret"] accessToken:authenticationResponse[@"oauth_token"] tokenSecret:nil]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { @@ -159,7 +163,13 @@ - (RACSignal *)accessTokenWithAuthenticationResponse:(NSDictionary *)authenticat [subscriber sendCompleted]; } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; @@ -178,8 +188,7 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { consumerSecret:self.options[@"consumer_secret"] accessToken:accessToken[@"oauth_token"] tokenSecret:accessToken[@"oauth_token_secret"]]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { @@ -190,11 +199,22 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { [subscriber sendCompleted]; } else { - [subscriber sendError:parseError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (parseError) { + dictionary[NSUnderlyingErrorKey] = parseError; + } + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorInvalidData userInfo:dictionary]; + [subscriber sendNext:error]; } } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; From 9af954c6cc2077c109170702dc1d37874ebfb939 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 15:04:35 -0700 Subject: [PATCH 092/139] Better error handling in Facebook providers. --- .../Facebook/SimpleAuthFacebookProvider.m | 15 +++++++++++++-- .../SimpleAuthFaceBookWebProvider.m | 18 ++++++++++++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Providers/Facebook/SimpleAuthFacebookProvider.m index b41a02c..224731d 100644 --- a/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -83,11 +83,22 @@ - (RACSignal *)remoteAccountWithSystemAccount:(ACAccount *)account { [subscriber sendCompleted]; } else { - [subscriber sendError:parseError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (parseError) { + dictionary[NSUnderlyingErrorKey] = parseError; + } + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorInvalidData userInfo:dictionary]; + [subscriber sendNext:error]; } } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m index 61e6c55..411cfdf 100644 --- a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m +++ b/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m @@ -107,8 +107,7 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; - [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if ([indexSet containsIndex:statusCode] && data) { @@ -119,11 +118,22 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { [subscriber sendCompleted]; } else { - [subscriber sendError:parseError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (parseError) { + dictionary[NSUnderlyingErrorKey] = parseError; + } + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorInvalidData userInfo:dictionary]; + [subscriber sendNext:error]; } } else { - [subscriber sendError:connectionError]; + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + if (connectionError) { + dictionary[NSUnderlyingErrorKey] = connectionError; + } + dictionary[SimpleAuthErrorStatusCodeKey] = @(statusCode); + NSError *error = [NSError errorWithDomain:SimpleAuthErrorDomain code:SimpleAuthErrorNetwork userInfo:dictionary]; + [subscriber sendError:error]; } }]; return nil; From 2f9a18f25de8bef7177332aef9e9398d41fe5a34 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 15:33:32 -0700 Subject: [PATCH 093/139] Fix demo app build config. --- Podfile | 4 +- SimpleAuth.xcodeproj/project.pbxproj | 63 +++++++--------------------- 2 files changed, 18 insertions(+), 49 deletions(-) diff --git a/Podfile b/Podfile index 2999707..b0623f9 100644 --- a/Podfile +++ b/Podfile @@ -1,4 +1,6 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' -podspec :name => 'SimpleAuth' +target 'SimpleAuth' do + podspec :name => 'SimpleAuth' +end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj index 01132a0..5c1e8cb 100644 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ b/SimpleAuth.xcodeproj/project.pbxproj @@ -23,9 +23,7 @@ 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */; }; 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */; }; 3B69D1F818C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */; }; - 3B69D1F918C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */; }; 3B69D1FA18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */; }; - 3B69D1FB18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */; }; 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; @@ -36,25 +34,14 @@ 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; - 4DD68DF418B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */; }; - 4DD68DF718B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */; }; 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; + 88DE19F4744D675DF308A530 /* libPods-SimpleAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */; }; F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 3B65845A1888947500D59100 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3BB324FC182ABC8B00ACB555 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3BB32503182ABC8B00ACB555; - remoteInfo = SimpleAuth; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; @@ -117,10 +104,13 @@ 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebLoginViewController.h; sourceTree = ""; }; 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebLoginViewController.m; sourceTree = ""; }; 55342A24817A3976616170C2 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SimpleAuth.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebProvider.h; sourceTree = ""; }; 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; + B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleAuth.release.xcconfig"; path = "Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth.release.xcconfig"; sourceTree = ""; }; + F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleAuth.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth.debug.xcconfig"; sourceTree = ""; }; F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSingleSignOnProvider.h; sourceTree = ""; }; F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; @@ -142,6 +132,7 @@ buildActionMask = 2147483647; files = ( F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */, + 88DE19F4744D675DF308A530 /* libPods-SimpleAuth.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -311,6 +302,7 @@ isa = PBXGroup; children = ( 0D4998CFA03844FB99EE78AA /* libPods.a */, + 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */, ); name = Frameworks; sourceTree = ""; @@ -399,6 +391,8 @@ children = ( 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */, 55342A24817A3976616170C2 /* Pods.release.xcconfig */, + F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */, + B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -429,7 +423,6 @@ buildRules = ( ); dependencies = ( - 3B65845B1888947500D59100 /* PBXTargetDependency */, ); name = SimpleAuthDemo; productName = SimpleAuthDemo; @@ -521,7 +514,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -531,12 +524,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3B69D1F918C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */, 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, - 3B69D1FB18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */, 3B658437188892FE00D59100 /* main.m in Sources */, - 4DD68DF718B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m in Sources */, - 4DD68DF418B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m in Sources */, 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -575,14 +564,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 3B65845B1888947500D59100 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3BB32503182ABC8B00ACB555 /* SimpleAuth */; - targetProxy = 3B65845A1888947500D59100 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 3B658433188892FE00D59100 /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -600,18 +581,9 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimpleAuthDemo/SimpleAuthDemo-Prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); INFOPLIST_FILE = "SimpleAuthDemo/SimpleAuthDemo-Info.plist"; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -622,14 +594,9 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimpleAuthDemo/SimpleAuthDemo-Prefix.pch"; INFOPLIST_FILE = "SimpleAuthDemo/SimpleAuthDemo-Info.plist"; - OTHER_LDFLAGS = ( - "-ObjC", - "-all_load", - ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -639,7 +606,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -667,7 +634,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; @@ -677,7 +644,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -699,7 +666,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -707,7 +674,7 @@ }; 3BB32528182ABC8C00ACB555 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */; + baseConfigurationReference = F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */; buildSettings = { DSTROOT = /tmp/SimpleAuth.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; @@ -719,7 +686,7 @@ }; 3BB32529182ABC8C00ACB555 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 55342A24817A3976616170C2 /* Pods.release.xcconfig */; + baseConfigurationReference = B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */; buildSettings = { DSTROOT = /tmp/SimpleAuth.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; From b7df02c99b8e03460f5a7d2178599a6b9f7f4e0f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 17:09:42 -0700 Subject: [PATCH 094/139] Refactor project layout. --- Podfile => Example/Podfile | 5 +- Example/Podfile.lock | 84 ++ Example/SimpleAuth.xcodeproj/project.pbxproj | 361 +++++++++ .../xcschemes/SimpleAuth.xcscheme | 29 +- .../SimpleAuth/Info.plist | 4 +- Example/SimpleAuth/LaunchScreen.xib | 28 + .../SimpleAuth/Prefix.pch | 0 .../SimpleAuth}/SADAppDelegate.h | 0 .../SimpleAuth}/SADAppDelegate.m | 2 +- .../SADProviderListViewController.h | 0 .../SADProviderListViewController.m | 2 +- .../SimpleAuth}/en.lproj/InfoPlist.strings | 0 {SimpleAuthDemo => Example/SimpleAuth}/main.m | 0 .../Core}/ACAccountStore+SimpleAuth.h | 0 .../Core}/ACAccountStore+SimpleAuth.m | 0 .../Core}/NSObject+SimpleAuthAdditions.h | 0 .../Core}/NSObject+SimpleAuthAdditions.m | 0 .../Core}/SimpleAuth-Prefix.pch | 0 {SimpleAuth => Pod/Core}/SimpleAuth.h | 0 {SimpleAuth => Pod/Core}/SimpleAuth.m | 0 {SimpleAuth => Pod/Core}/SimpleAuthProvider.h | 0 {SimpleAuth => Pod/Core}/SimpleAuthProvider.m | 0 .../Core}/SimpleAuthSingleSignOnProvider.h | 0 .../Core}/SimpleAuthTwitterUtilities.h | 0 .../Core}/SimpleAuthTwitterUtilities.m | 0 .../SimpleAuthDropboxWebLoginViewController.h | 0 .../SimpleAuthDropboxWebLoginViewController.m | 0 .../DropboxWeb/SimpleAuthDropboxWebProvider.h | 0 .../DropboxWeb/SimpleAuthDropboxWebProvider.m | 0 .../Facebook/SimpleAuthFacebookProvider.h | 0 .../Facebook/SimpleAuthFacebookProvider.m | 0 .../SimpleAuthFaceBookWebProvider.h | 0 .../SimpleAuthFaceBookWebProvider.m | 0 ...SimpleAuthFacebookWebLoginViewController.h | 0 ...SimpleAuthFacebookWebLoginViewController.m | 0 ...mpleAuthFoursquareWebLoginViewController.h | 0 ...mpleAuthFoursquareWebLoginViewController.m | 0 .../SimpleAuthFoursquareWebProvider.h | 0 .../SimpleAuthFoursquareWebProvider.m | 0 .../SimpleAuthInstagramLoginViewController.h | 0 .../SimpleAuthInstagramLoginViewController.m | 0 .../Instagram/SimpleAuthInstagramProvider.h | 0 .../Instagram/SimpleAuthInstagramProvider.m | 0 ...SimpleAuthLinkedInWebLoginViewController.h | 0 ...SimpleAuthLinkedInWebLoginViewController.m | 0 .../LinkedIn/SimpleAuthLinkedInWebProvider.h | 0 .../LinkedIn/SimpleAuthLinkedInWebProvider.m | 0 .../SimpleAuthMeetupLoginViewController.h | 0 .../SimpleAuthMeetupLoginViewController.m | 0 .../Meetup/SimpleAuthMeetupProvider.h | 0 .../Meetup/SimpleAuthMeetupProvider.m | 0 ...impleAuthSinaWeiboWebLoginViewController.h | 0 ...impleAuthSinaWeiboWebLoginViewController.m | 0 .../SimpleAuthSinaWeiboWebProvider.h | 0 .../SimpleAuthSinaWeiboWebProvider.m | 0 .../SimpleAuthTumblrLoginViewController.h | 0 .../SimpleAuthTumblrLoginViewController.m | 0 .../Tumblr/SimpleAuthTumblrProvider.h | 0 .../Tumblr/SimpleAuthTumblrProvider.m | 0 .../Twitter/SimpleAuthTwitterProvider.h | 0 .../Twitter/SimpleAuthTwitterProvider.m | 0 .../SimpleAuthTwitterWebLoginViewController.h | 0 .../SimpleAuthTwitterWebLoginViewController.m | 0 .../TwitterWeb/SimpleAuthTwitterWebProvider.h | 0 .../TwitterWeb/SimpleAuthTwitterWebProvider.m | 0 .../UI/ios/SimpleAuthWebViewController.h | 0 .../UI/ios/SimpleAuthWebViewController.m | 0 .../UIViewController+SimpleAuthAdditions.h | 0 .../UIViewController+SimpleAuthAdditions.m | 0 .../UI/ios/UIWindow+SimpleAuthAdditions.h | 0 .../UI/ios/UIWindow+SimpleAuthAdditions.m | 0 Podfile.lock | 28 - SimpleAuth.podspec | 49 +- SimpleAuth.xcodeproj/project.pbxproj | 732 ------------------ .../xcschemes/SimpleAuthDemo.xcscheme | 86 -- .../contents.xcworkspacedata | 10 - .../AppIcon.appiconset/Contents.json | 23 - .../LaunchImage.launchimage/Contents.json | 23 - 78 files changed, 519 insertions(+), 947 deletions(-) rename Podfile => Example/Podfile (53%) create mode 100644 Example/Podfile.lock create mode 100644 Example/SimpleAuth.xcodeproj/project.pbxproj rename {SimpleAuth.xcodeproj => Example/SimpleAuth.xcodeproj}/xcshareddata/xcschemes/SimpleAuth.xcscheme (75%) rename SimpleAuthDemo/SimpleAuthDemo-Info.plist => Example/SimpleAuth/Info.plist (90%) create mode 100644 Example/SimpleAuth/LaunchScreen.xib rename SimpleAuthDemo/SimpleAuthDemo-Prefix.pch => Example/SimpleAuth/Prefix.pch (100%) rename {SimpleAuthDemo => Example/SimpleAuth}/SADAppDelegate.h (100%) rename {SimpleAuthDemo => Example/SimpleAuth}/SADAppDelegate.m (98%) rename {SimpleAuthDemo => Example/SimpleAuth}/SADProviderListViewController.h (100%) rename {SimpleAuthDemo => Example/SimpleAuth}/SADProviderListViewController.m (98%) rename {SimpleAuthDemo => Example/SimpleAuth}/en.lproj/InfoPlist.strings (100%) rename {SimpleAuthDemo => Example/SimpleAuth}/main.m (100%) rename {SimpleAuth => Pod/Core}/ACAccountStore+SimpleAuth.h (100%) rename {SimpleAuth => Pod/Core}/ACAccountStore+SimpleAuth.m (100%) rename {SimpleAuth => Pod/Core}/NSObject+SimpleAuthAdditions.h (100%) rename {SimpleAuth => Pod/Core}/NSObject+SimpleAuthAdditions.m (100%) rename {SimpleAuth => Pod/Core}/SimpleAuth-Prefix.pch (100%) rename {SimpleAuth => Pod/Core}/SimpleAuth.h (100%) rename {SimpleAuth => Pod/Core}/SimpleAuth.m (100%) rename {SimpleAuth => Pod/Core}/SimpleAuthProvider.h (100%) rename {SimpleAuth => Pod/Core}/SimpleAuthProvider.m (100%) rename {SimpleAuth => Pod/Core}/SimpleAuthSingleSignOnProvider.h (100%) rename {SimpleAuth => Pod/Core}/SimpleAuthTwitterUtilities.h (100%) rename {SimpleAuth => Pod/Core}/SimpleAuthTwitterUtilities.m (100%) rename {Providers => Pod/Providers}/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/DropboxWeb/SimpleAuthDropboxWebProvider.h (100%) rename {Providers => Pod/Providers}/DropboxWeb/SimpleAuthDropboxWebProvider.m (100%) rename {Providers => Pod/Providers}/Facebook/SimpleAuthFacebookProvider.h (100%) rename {Providers => Pod/Providers}/Facebook/SimpleAuthFacebookProvider.m (100%) rename {Providers => Pod/Providers}/FacebookWeb/SimpleAuthFaceBookWebProvider.h (100%) rename {Providers => Pod/Providers}/FacebookWeb/SimpleAuthFaceBookWebProvider.m (100%) rename {Providers => Pod/Providers}/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/FoursquareWeb/SimpleAuthFoursquareWebProvider.h (100%) rename {Providers => Pod/Providers}/FoursquareWeb/SimpleAuthFoursquareWebProvider.m (100%) rename {Providers => Pod/Providers}/Instagram/SimpleAuthInstagramLoginViewController.h (100%) rename {Providers => Pod/Providers}/Instagram/SimpleAuthInstagramLoginViewController.m (100%) rename {Providers => Pod/Providers}/Instagram/SimpleAuthInstagramProvider.h (100%) rename {Providers => Pod/Providers}/Instagram/SimpleAuthInstagramProvider.m (100%) rename {Providers => Pod/Providers}/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/LinkedIn/SimpleAuthLinkedInWebProvider.h (100%) rename {Providers => Pod/Providers}/LinkedIn/SimpleAuthLinkedInWebProvider.m (100%) rename {Providers => Pod/Providers}/Meetup/SimpleAuthMeetupLoginViewController.h (100%) rename {Providers => Pod/Providers}/Meetup/SimpleAuthMeetupLoginViewController.m (100%) rename {Providers => Pod/Providers}/Meetup/SimpleAuthMeetupProvider.h (100%) rename {Providers => Pod/Providers}/Meetup/SimpleAuthMeetupProvider.m (100%) rename {Providers => Pod/Providers}/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h (100%) rename {Providers => Pod/Providers}/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m (100%) rename {Providers => Pod/Providers}/Tumblr/SimpleAuthTumblrLoginViewController.h (100%) rename {Providers => Pod/Providers}/Tumblr/SimpleAuthTumblrLoginViewController.m (100%) rename {Providers => Pod/Providers}/Tumblr/SimpleAuthTumblrProvider.h (100%) rename {Providers => Pod/Providers}/Tumblr/SimpleAuthTumblrProvider.m (100%) rename {Providers => Pod/Providers}/Twitter/SimpleAuthTwitterProvider.h (100%) rename {Providers => Pod/Providers}/Twitter/SimpleAuthTwitterProvider.m (100%) rename {Providers => Pod/Providers}/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h (100%) rename {Providers => Pod/Providers}/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m (100%) rename {Providers => Pod/Providers}/TwitterWeb/SimpleAuthTwitterWebProvider.h (100%) rename {Providers => Pod/Providers}/TwitterWeb/SimpleAuthTwitterWebProvider.m (100%) rename {SimpleAuth => Pod}/UI/ios/SimpleAuthWebViewController.h (100%) rename {SimpleAuth => Pod}/UI/ios/SimpleAuthWebViewController.m (100%) rename {SimpleAuth => Pod}/UI/ios/UIViewController+SimpleAuthAdditions.h (100%) rename {SimpleAuth => Pod}/UI/ios/UIViewController+SimpleAuthAdditions.m (100%) rename {SimpleAuth => Pod}/UI/ios/UIWindow+SimpleAuthAdditions.h (100%) rename {SimpleAuth => Pod}/UI/ios/UIWindow+SimpleAuthAdditions.m (100%) delete mode 100644 Podfile.lock delete mode 100644 SimpleAuth.xcodeproj/project.pbxproj delete mode 100644 SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme delete mode 100644 SimpleAuth.xcworkspace/contents.xcworkspacedata delete mode 100644 SimpleAuthDemo/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 SimpleAuthDemo/Images.xcassets/LaunchImage.launchimage/Contents.json diff --git a/Podfile b/Example/Podfile similarity index 53% rename from Podfile rename to Example/Podfile index b0623f9..a38d6fc 100644 --- a/Podfile +++ b/Example/Podfile @@ -1,6 +1,3 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' - -target 'SimpleAuth' do - podspec :name => 'SimpleAuth' -end +pod 'SimpleAuth', :path => '../' diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..7cbe589 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,84 @@ +PODS: + - CMDQueryStringSerialization (0.3.1): + - ISO8601 + - cocoa-oauth (0.0.1): + - NSData+Base64 (~> 1.0) + - ISO8601 (0.1.1) + - NSData+Base64 (1.0.0) + - ReactiveCocoa (2.3.1): + - ReactiveCocoa/UI + - ReactiveCocoa/Core (2.3.1): + - ReactiveCocoa/no-arc + - ReactiveCocoa/no-arc (2.3.1) + - ReactiveCocoa/UI (2.3.1): + - ReactiveCocoa/Core + - SimpleAuth (0.3.5): + - SimpleAuth/Core + - SimpleAuth/DropboxWeb + - SimpleAuth/Facebook + - SimpleAuth/FacebookWeb + - SimpleAuth/FoursquareWeb + - SimpleAuth/Instagram + - SimpleAuth/LinkedInWeb + - SimpleAuth/Meetup + - SimpleAuth/SinaWeiboWeb + - SimpleAuth/Tumblr + - SimpleAuth/Twitter + - SimpleAuth/TwitterWeb + - SimpleAuth/UI + - SimpleAuth/Core (0.3.5): + - CMDQueryStringSerialization + - ReactiveCocoa + - SimpleAuth/DropboxWeb (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/Facebook (0.3.5): + - SimpleAuth/Core + - SimpleAuth/FacebookWeb (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/FoursquareWeb (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/Instagram (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/LinkedInWeb (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/Meetup (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/SinaWeiboWeb (0.3.5): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/Tumblr (0.3.5): + - cocoa-oauth + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/Twitter (0.3.5): + - cocoa-oauth + - SimpleAuth/UI + - SimpleAuth/TwitterWeb (0.3.5): + - cocoa-oauth + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/UI (0.3.5): + - SimpleAuth/Core + +DEPENDENCIES: + - SimpleAuth (from `../`) + +EXTERNAL SOURCES: + SimpleAuth: + :path: ../ + +SPEC CHECKSUMS: + CMDQueryStringSerialization: 96f05d3225b6a0f6b7445a308c9e50bf84a5ba13 + cocoa-oauth: 418c70e6ce4130fa7ebdf05232018c8f391030d8 + ISO8601: a6afce5fbe854024802367c814fac4aa8d3586f9 + NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 + ReactiveCocoa: dca75777b9d18990c8714a3a6f2149f29b4d1462 + SimpleAuth: 918b62221b5faa06a178076b25647cf88d84c5e3 + +COCOAPODS: 0.34.1 diff --git a/Example/SimpleAuth.xcodeproj/project.pbxproj b/Example/SimpleAuth.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1b76408 --- /dev/null +++ b/Example/SimpleAuth.xcodeproj/project.pbxproj @@ -0,0 +1,361 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3B629D9A19DE1F2500BDF072 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9719DE1F2500BDF072 /* LICENSE */; }; + 3B629D9B19DE1F2500BDF072 /* Readme.markdown in Sources */ = {isa = PBXBuildFile; fileRef = 3B629D9819DE1F2500BDF072 /* Readme.markdown */; }; + 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */; }; + 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */; }; + 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B658433188892FE00D59100 /* InfoPlist.strings */; }; + 3B658437188892FE00D59100 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B658436188892FE00D59100 /* main.m */; }; + 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65843A188892FE00D59100 /* SADAppDelegate.m */; }; + 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584571888931F00D59100 /* SADProviderListViewController.m */; }; + 49A81211250784928A11669C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0A3609D93D7B90B3BBADBC21 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B629D9719DE1F2500BDF072 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 3B629D9819DE1F2500BDF072 /* Readme.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = Readme.markdown; path = ../Readme.markdown; sourceTree = ""; }; + 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SimpleAuth.podspec; path = ../SimpleAuth.podspec; sourceTree = ""; }; + 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; + 3B658429188892FD00D59100 /* SimpleAuth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleAuth.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B658432188892FE00D59100 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3B658434188892FE00D59100 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 3B658436188892FE00D59100 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 3B658438188892FE00D59100 /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = ""; }; + 3B658439188892FE00D59100 /* SADAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADAppDelegate.h; sourceTree = ""; }; + 3B65843A188892FE00D59100 /* SADAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SADAppDelegate.m; sourceTree = ""; }; + 3B6584571888931F00D59100 /* SADProviderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SADProviderListViewController.m; sourceTree = ""; }; + 3B6584591888933200D59100 /* SADProviderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADProviderListViewController.h; sourceTree = ""; }; + DB25F6FCDF8BA7A12A786310 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3B658426188892FD00D59100 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 49A81211250784928A11669C /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3B629D9619DE1F1100BDF072 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + 3B629D9819DE1F2500BDF072 /* Readme.markdown */, + 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */, + 3B629D9719DE1F2500BDF072 /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + 3B658430188892FE00D59100 /* SimpleAuth */ = { + isa = PBXGroup; + children = ( + 3B658439188892FE00D59100 /* SADAppDelegate.h */, + 3B65843A188892FE00D59100 /* SADAppDelegate.m */, + 3B6584591888933200D59100 /* SADProviderListViewController.h */, + 3B6584571888931F00D59100 /* SADProviderListViewController.m */, + 3B658432188892FE00D59100 /* Info.plist */, + 3B658433188892FE00D59100 /* InfoPlist.strings */, + 3B658436188892FE00D59100 /* main.m */, + 3B658438188892FE00D59100 /* Prefix.pch */, + 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */, + ); + path = SimpleAuth; + sourceTree = ""; + }; + 3BB324FB182ABC8B00ACB555 = { + isa = PBXGroup; + children = ( + 3B629D9619DE1F1100BDF072 /* Podspec Metadata */, + 3B658430188892FE00D59100 /* SimpleAuth */, + 3BB32506182ABC8B00ACB555 /* Frameworks */, + 3BB32505182ABC8B00ACB555 /* Products */, + E41F3FB2B4E976B36518620C /* Pods */, + ); + sourceTree = ""; + }; + 3BB32505182ABC8B00ACB555 /* Products */ = { + isa = PBXGroup; + children = ( + 3B658429188892FD00D59100 /* SimpleAuth.app */, + ); + name = Products; + sourceTree = ""; + }; + 3BB32506182ABC8B00ACB555 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0D4998CFA03844FB99EE78AA /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + E41F3FB2B4E976B36518620C /* Pods */ = { + isa = PBXGroup; + children = ( + DB25F6FCDF8BA7A12A786310 /* Pods.debug.xcconfig */, + 0A3609D93D7B90B3BBADBC21 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3B658428188892FD00D59100 /* SimpleAuth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3B658455188892FE00D59100 /* Build configuration list for PBXNativeTarget "SimpleAuth" */; + buildPhases = ( + 5058F26A0CF747BBE0A2CFCD /* Check Pods Manifest.lock */, + 3B658425188892FD00D59100 /* Sources */, + 3B658426188892FD00D59100 /* Frameworks */, + 3B658427188892FD00D59100 /* Resources */, + 2BC7B9E1175D6A6215258514 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SimpleAuth; + productName = SimpleAuthDemo; + productReference = 3B658429188892FD00D59100 /* SimpleAuth.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3BB324FC182ABC8B00ACB555 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "Byliner, Inc"; + }; + buildConfigurationList = 3BB324FF182ABC8B00ACB555 /* Build configuration list for PBXProject "SimpleAuth" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 3BB324FB182ABC8B00ACB555; + productRefGroup = 3BB32505182ABC8B00ACB555 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 3B658428188892FD00D59100 /* SimpleAuth */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 3B658427188892FD00D59100 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */, + 3B629D9A19DE1F2500BDF072 /* LICENSE in Resources */, + 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */, + 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2BC7B9E1175D6A6215258514 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 5058F26A0CF747BBE0A2CFCD /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3B658425188892FD00D59100 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, + 3B658437188892FE00D59100 /* main.m in Sources */, + 3B629D9B19DE1F2500BDF072 /* Readme.markdown in Sources */, + 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 3B658433188892FE00D59100 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 3B658434188892FE00D59100 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3B658451188892FE00D59100 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DB25F6FCDF8BA7A12A786310 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = SimpleAuth/Prefix.pch; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_ROOT}/Headers/Public/SimpleAuth", + ); + INFOPLIST_FILE = SimpleAuth/Info.plist; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 3B658452188892FE00D59100 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0A3609D93D7B90B3BBADBC21 /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = SimpleAuth/Prefix.pch; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_ROOT}/Headers/Public/SimpleAuth", + ); + INFOPLIST_FILE = SimpleAuth/Info.plist; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 3BB32525182ABC8C00ACB555 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 3BB32526182ABC8C00ACB555 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3B658455188892FE00D59100 /* Build configuration list for PBXNativeTarget "SimpleAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3B658451188892FE00D59100 /* Debug */, + 3B658452188892FE00D59100 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3BB324FF182ABC8B00ACB555 /* Build configuration list for PBXProject "SimpleAuth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3BB32525182ABC8C00ACB555 /* Debug */, + 3BB32526182ABC8C00ACB555 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3BB324FC182ABC8B00ACB555 /* Project object */; +} diff --git a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme b/Example/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme similarity index 75% rename from SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme rename to Example/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme index bf67556..a4d3dc4 100644 --- a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme +++ b/Example/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuth.xcscheme @@ -14,8 +14,8 @@ buildForAnalyzing = "YES"> @@ -29,6 +29,15 @@ buildConfiguration = "Debug"> + + + + - + - + @@ -57,15 +66,15 @@ useCustomWorkingDirectory = "NO" buildConfiguration = "Release" debugDocumentVersioning = "YES"> - + - + diff --git a/SimpleAuthDemo/SimpleAuthDemo-Info.plist b/Example/SimpleAuth/Info.plist similarity index 90% rename from SimpleAuthDemo/SimpleAuthDemo-Info.plist rename to Example/SimpleAuth/Info.plist index cea3f85..f48f6a5 100644 --- a/SimpleAuthDemo/SimpleAuthDemo-Info.plist +++ b/Example/SimpleAuth/Info.plist @@ -24,6 +24,8 @@ 1.0 LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIRequiredDeviceCapabilities armv7 @@ -31,8 +33,6 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight diff --git a/Example/SimpleAuth/LaunchScreen.xib b/Example/SimpleAuth/LaunchScreen.xib new file mode 100644 index 0000000..0309b81 --- /dev/null +++ b/Example/SimpleAuth/LaunchScreen.xib @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SimpleAuthDemo/SimpleAuthDemo-Prefix.pch b/Example/SimpleAuth/Prefix.pch similarity index 100% rename from SimpleAuthDemo/SimpleAuthDemo-Prefix.pch rename to Example/SimpleAuth/Prefix.pch diff --git a/SimpleAuthDemo/SADAppDelegate.h b/Example/SimpleAuth/SADAppDelegate.h similarity index 100% rename from SimpleAuthDemo/SADAppDelegate.h rename to Example/SimpleAuth/SADAppDelegate.h diff --git a/SimpleAuthDemo/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m similarity index 98% rename from SimpleAuthDemo/SADAppDelegate.m rename to Example/SimpleAuth/SADAppDelegate.m index 8b4c39a..240caa1 100644 --- a/SimpleAuthDemo/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -9,7 +9,7 @@ #import "SADAppDelegate.h" #import "SADProviderListViewController.h" -#import "SimpleAuth.h" +#import @implementation SADAppDelegate diff --git a/SimpleAuthDemo/SADProviderListViewController.h b/Example/SimpleAuth/SADProviderListViewController.h similarity index 100% rename from SimpleAuthDemo/SADProviderListViewController.h rename to Example/SimpleAuth/SADProviderListViewController.h diff --git a/SimpleAuthDemo/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m similarity index 98% rename from SimpleAuthDemo/SADProviderListViewController.m rename to Example/SimpleAuth/SADProviderListViewController.m index 604ec1d..1dd59e6 100644 --- a/SimpleAuthDemo/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -8,7 +8,7 @@ #import "SADProviderListViewController.h" -#import "SimpleAuth.h" +#import @interface SADProviderListViewController () diff --git a/SimpleAuthDemo/en.lproj/InfoPlist.strings b/Example/SimpleAuth/en.lproj/InfoPlist.strings similarity index 100% rename from SimpleAuthDemo/en.lproj/InfoPlist.strings rename to Example/SimpleAuth/en.lproj/InfoPlist.strings diff --git a/SimpleAuthDemo/main.m b/Example/SimpleAuth/main.m similarity index 100% rename from SimpleAuthDemo/main.m rename to Example/SimpleAuth/main.m diff --git a/SimpleAuth/ACAccountStore+SimpleAuth.h b/Pod/Core/ACAccountStore+SimpleAuth.h similarity index 100% rename from SimpleAuth/ACAccountStore+SimpleAuth.h rename to Pod/Core/ACAccountStore+SimpleAuth.h diff --git a/SimpleAuth/ACAccountStore+SimpleAuth.m b/Pod/Core/ACAccountStore+SimpleAuth.m similarity index 100% rename from SimpleAuth/ACAccountStore+SimpleAuth.m rename to Pod/Core/ACAccountStore+SimpleAuth.m diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.h b/Pod/Core/NSObject+SimpleAuthAdditions.h similarity index 100% rename from SimpleAuth/NSObject+SimpleAuthAdditions.h rename to Pod/Core/NSObject+SimpleAuthAdditions.h diff --git a/SimpleAuth/NSObject+SimpleAuthAdditions.m b/Pod/Core/NSObject+SimpleAuthAdditions.m similarity index 100% rename from SimpleAuth/NSObject+SimpleAuthAdditions.m rename to Pod/Core/NSObject+SimpleAuthAdditions.m diff --git a/SimpleAuth/SimpleAuth-Prefix.pch b/Pod/Core/SimpleAuth-Prefix.pch similarity index 100% rename from SimpleAuth/SimpleAuth-Prefix.pch rename to Pod/Core/SimpleAuth-Prefix.pch diff --git a/SimpleAuth/SimpleAuth.h b/Pod/Core/SimpleAuth.h similarity index 100% rename from SimpleAuth/SimpleAuth.h rename to Pod/Core/SimpleAuth.h diff --git a/SimpleAuth/SimpleAuth.m b/Pod/Core/SimpleAuth.m similarity index 100% rename from SimpleAuth/SimpleAuth.m rename to Pod/Core/SimpleAuth.m diff --git a/SimpleAuth/SimpleAuthProvider.h b/Pod/Core/SimpleAuthProvider.h similarity index 100% rename from SimpleAuth/SimpleAuthProvider.h rename to Pod/Core/SimpleAuthProvider.h diff --git a/SimpleAuth/SimpleAuthProvider.m b/Pod/Core/SimpleAuthProvider.m similarity index 100% rename from SimpleAuth/SimpleAuthProvider.m rename to Pod/Core/SimpleAuthProvider.m diff --git a/SimpleAuth/SimpleAuthSingleSignOnProvider.h b/Pod/Core/SimpleAuthSingleSignOnProvider.h similarity index 100% rename from SimpleAuth/SimpleAuthSingleSignOnProvider.h rename to Pod/Core/SimpleAuthSingleSignOnProvider.h diff --git a/SimpleAuth/SimpleAuthTwitterUtilities.h b/Pod/Core/SimpleAuthTwitterUtilities.h similarity index 100% rename from SimpleAuth/SimpleAuthTwitterUtilities.h rename to Pod/Core/SimpleAuthTwitterUtilities.h diff --git a/SimpleAuth/SimpleAuthTwitterUtilities.m b/Pod/Core/SimpleAuthTwitterUtilities.m similarity index 100% rename from SimpleAuth/SimpleAuthTwitterUtilities.m rename to Pod/Core/SimpleAuthTwitterUtilities.m diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h b/Pod/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h similarity index 100% rename from Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h rename to Pod/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.h diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m b/Pod/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m similarity index 100% rename from Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m rename to Pod/Providers/DropboxWeb/SimpleAuthDropboxWebLoginViewController.m diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h b/Pod/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h similarity index 100% rename from Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h rename to Pod/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.h diff --git a/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m b/Pod/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m similarity index 100% rename from Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m rename to Pod/Providers/DropboxWeb/SimpleAuthDropboxWebProvider.m diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.h b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.h similarity index 100% rename from Providers/Facebook/SimpleAuthFacebookProvider.h rename to Pod/Providers/Facebook/SimpleAuthFacebookProvider.h diff --git a/Providers/Facebook/SimpleAuthFacebookProvider.m b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m similarity index 100% rename from Providers/Facebook/SimpleAuthFacebookProvider.m rename to Pod/Providers/Facebook/SimpleAuthFacebookProvider.m diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h b/Pod/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h similarity index 100% rename from Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h rename to Pod/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.h diff --git a/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m b/Pod/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m similarity index 100% rename from Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m rename to Pod/Providers/FacebookWeb/SimpleAuthFaceBookWebProvider.m diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h b/Pod/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h similarity index 100% rename from Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h rename to Pod/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.h diff --git a/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m b/Pod/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m similarity index 100% rename from Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m rename to Pod/Providers/FacebookWeb/SimpleAuthFacebookWebLoginViewController.m diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h similarity index 100% rename from Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h rename to Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.h diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m similarity index 100% rename from Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m rename to Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebLoginViewController.m diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h similarity index 100% rename from Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h rename to Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.h diff --git a/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m similarity index 100% rename from Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m rename to Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.h b/Pod/Providers/Instagram/SimpleAuthInstagramLoginViewController.h similarity index 100% rename from Providers/Instagram/SimpleAuthInstagramLoginViewController.h rename to Pod/Providers/Instagram/SimpleAuthInstagramLoginViewController.h diff --git a/Providers/Instagram/SimpleAuthInstagramLoginViewController.m b/Pod/Providers/Instagram/SimpleAuthInstagramLoginViewController.m similarity index 100% rename from Providers/Instagram/SimpleAuthInstagramLoginViewController.m rename to Pod/Providers/Instagram/SimpleAuthInstagramLoginViewController.m diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.h b/Pod/Providers/Instagram/SimpleAuthInstagramProvider.h similarity index 100% rename from Providers/Instagram/SimpleAuthInstagramProvider.h rename to Pod/Providers/Instagram/SimpleAuthInstagramProvider.h diff --git a/Providers/Instagram/SimpleAuthInstagramProvider.m b/Pod/Providers/Instagram/SimpleAuthInstagramProvider.m similarity index 100% rename from Providers/Instagram/SimpleAuthInstagramProvider.m rename to Pod/Providers/Instagram/SimpleAuthInstagramProvider.m diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h b/Pod/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h similarity index 100% rename from Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h rename to Pod/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.h diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m b/Pod/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m similarity index 100% rename from Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m rename to Pod/Providers/LinkedIn/SimpleAuthLinkedInWebLoginViewController.m diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h b/Pod/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h similarity index 100% rename from Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h rename to Pod/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.h diff --git a/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m b/Pod/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m similarity index 100% rename from Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m rename to Pod/Providers/LinkedIn/SimpleAuthLinkedInWebProvider.m diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.h b/Pod/Providers/Meetup/SimpleAuthMeetupLoginViewController.h similarity index 100% rename from Providers/Meetup/SimpleAuthMeetupLoginViewController.h rename to Pod/Providers/Meetup/SimpleAuthMeetupLoginViewController.h diff --git a/Providers/Meetup/SimpleAuthMeetupLoginViewController.m b/Pod/Providers/Meetup/SimpleAuthMeetupLoginViewController.m similarity index 100% rename from Providers/Meetup/SimpleAuthMeetupLoginViewController.m rename to Pod/Providers/Meetup/SimpleAuthMeetupLoginViewController.m diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.h b/Pod/Providers/Meetup/SimpleAuthMeetupProvider.h similarity index 100% rename from Providers/Meetup/SimpleAuthMeetupProvider.h rename to Pod/Providers/Meetup/SimpleAuthMeetupProvider.h diff --git a/Providers/Meetup/SimpleAuthMeetupProvider.m b/Pod/Providers/Meetup/SimpleAuthMeetupProvider.m similarity index 100% rename from Providers/Meetup/SimpleAuthMeetupProvider.m rename to Pod/Providers/Meetup/SimpleAuthMeetupProvider.m diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h b/Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h similarity index 100% rename from Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h rename to Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.h diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m b/Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m similarity index 100% rename from Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m rename to Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebLoginViewController.m diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h b/Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h similarity index 100% rename from Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h rename to Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.h diff --git a/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m b/Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m similarity index 100% rename from Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m rename to Pod/Providers/SinaWeiboWeb/SimpleAuthSinaWeiboWebProvider.m diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h b/Pod/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h similarity index 100% rename from Providers/Tumblr/SimpleAuthTumblrLoginViewController.h rename to Pod/Providers/Tumblr/SimpleAuthTumblrLoginViewController.h diff --git a/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m b/Pod/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m similarity index 100% rename from Providers/Tumblr/SimpleAuthTumblrLoginViewController.m rename to Pod/Providers/Tumblr/SimpleAuthTumblrLoginViewController.m diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.h b/Pod/Providers/Tumblr/SimpleAuthTumblrProvider.h similarity index 100% rename from Providers/Tumblr/SimpleAuthTumblrProvider.h rename to Pod/Providers/Tumblr/SimpleAuthTumblrProvider.h diff --git a/Providers/Tumblr/SimpleAuthTumblrProvider.m b/Pod/Providers/Tumblr/SimpleAuthTumblrProvider.m similarity index 100% rename from Providers/Tumblr/SimpleAuthTumblrProvider.m rename to Pod/Providers/Tumblr/SimpleAuthTumblrProvider.m diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.h b/Pod/Providers/Twitter/SimpleAuthTwitterProvider.h similarity index 100% rename from Providers/Twitter/SimpleAuthTwitterProvider.h rename to Pod/Providers/Twitter/SimpleAuthTwitterProvider.h diff --git a/Providers/Twitter/SimpleAuthTwitterProvider.m b/Pod/Providers/Twitter/SimpleAuthTwitterProvider.m similarity index 100% rename from Providers/Twitter/SimpleAuthTwitterProvider.m rename to Pod/Providers/Twitter/SimpleAuthTwitterProvider.m diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h similarity index 100% rename from Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h rename to Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.h diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m similarity index 100% rename from Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m rename to Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h similarity index 100% rename from Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h rename to Pod/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.h diff --git a/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m similarity index 100% rename from Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m rename to Pod/Providers/TwitterWeb/SimpleAuthTwitterWebProvider.m diff --git a/SimpleAuth/UI/ios/SimpleAuthWebViewController.h b/Pod/UI/ios/SimpleAuthWebViewController.h similarity index 100% rename from SimpleAuth/UI/ios/SimpleAuthWebViewController.h rename to Pod/UI/ios/SimpleAuthWebViewController.h diff --git a/SimpleAuth/UI/ios/SimpleAuthWebViewController.m b/Pod/UI/ios/SimpleAuthWebViewController.m similarity index 100% rename from SimpleAuth/UI/ios/SimpleAuthWebViewController.m rename to Pod/UI/ios/SimpleAuthWebViewController.m diff --git a/SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.h b/Pod/UI/ios/UIViewController+SimpleAuthAdditions.h similarity index 100% rename from SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.h rename to Pod/UI/ios/UIViewController+SimpleAuthAdditions.h diff --git a/SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.m b/Pod/UI/ios/UIViewController+SimpleAuthAdditions.m similarity index 100% rename from SimpleAuth/UI/ios/UIViewController+SimpleAuthAdditions.m rename to Pod/UI/ios/UIViewController+SimpleAuthAdditions.m diff --git a/SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.h b/Pod/UI/ios/UIWindow+SimpleAuthAdditions.h similarity index 100% rename from SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.h rename to Pod/UI/ios/UIWindow+SimpleAuthAdditions.h diff --git a/SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.m b/Pod/UI/ios/UIWindow+SimpleAuthAdditions.m similarity index 100% rename from SimpleAuth/UI/ios/UIWindow+SimpleAuthAdditions.m rename to Pod/UI/ios/UIWindow+SimpleAuthAdditions.m diff --git a/Podfile.lock b/Podfile.lock deleted file mode 100644 index 6c1c7b4..0000000 --- a/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - CMDQueryStringSerialization (0.3.1): - - ISO8601 - - cocoa-oauth (0.0.1): - - NSData+Base64 (~> 1.0) - - ISO8601 (0.1.1) - - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.3.1): - - ReactiveCocoa/UI - - ReactiveCocoa/Core (2.3.1): - - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.3.1) - - ReactiveCocoa/UI (2.3.1): - - ReactiveCocoa/Core - -DEPENDENCIES: - - CMDQueryStringSerialization - - cocoa-oauth - - ReactiveCocoa - -SPEC CHECKSUMS: - CMDQueryStringSerialization: 96f05d3225b6a0f6b7445a308c9e50bf84a5ba13 - cocoa-oauth: 418c70e6ce4130fa7ebdf05232018c8f391030d8 - ISO8601: a6afce5fbe854024802367c814fac4aa8d3586f9 - NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 - ReactiveCocoa: dca75777b9d18990c8714a3a6f2149f29b4d1462 - -COCOAPODS: 0.34.1 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 9ef197e..a2a53ee 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -10,89 +10,84 @@ Pod::Spec.new do |s| s.platform = :ios, '6.0' s.subspec 'Core' do |ss| - ss.source_files = 'SimpleAuth/**/*.{h,m}' - ss.public_header_files = 'SimpleAuth/SimpleAuth.h' - ss.exclude_files = 'SimpleAuth/UI' + ss.source_files = 'Pod/Core/*.{h,m}' + ss.public_header_files = 'Pod/Core/SimpleAuth.h' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' end s.subspec 'UI' do |ss| ss.dependency 'SimpleAuth/Core' - - ss.ios.source_files = 'SimpleAuth/UI/ios/**/*.{h,m}' + ss.ios.source_files = 'Pod/UI/ios/*.{h,m}' ss.ios.frameworks = 'UIKit' - - # ss.osx.source_files = 'SimpleAuth/UI/mac/**/*.{h,m}' - # ss.osx.frameworks = 'AppKit' end s.subspec 'Twitter' do |ss| ss.dependency 'SimpleAuth/UI' - - ss.source_files = 'Providers/Twitter/**/*.{h,m}' - ss.frameworks = 'Accounts', 'Social' - ss.dependency 'cocoa-oauth' + ss.frameworks = 'Accounts', 'Social' + ss.source_files = 'Pod/Providers/Twitter/*.{h,m}' end s.subspec 'Facebook' do |ss| ss.dependency 'SimpleAuth/Core' - - ss.source_files = 'Providers/Facebook/**/*.{h,m}' ss.frameworks = 'Accounts', 'Social' + ss.source_files = 'Pod/Providers/Facebook/*.{h,m}' end s.subspec 'FacebookWeb' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/FacebookWeb/**/*.{h,m}' + ss.source_files = 'Pod/Providers/FacebookWeb/*.{h,m}' end s.subspec 'Instagram' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/Instagram/**/*.{h,m}' + ss.source_files = 'Pod/Providers/Instagram/*.{h,m}' end s.subspec 'TwitterWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - - ss.source_files = 'Providers/TwitterWeb/**/*.{h,m}' - ss.dependency 'cocoa-oauth' + ss.source_files = 'Pod/Providers/TwitterWeb/*.{h,m}' end s.subspec 'Meetup' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/Meetup/**/*.{h,m}' + ss.source_files = 'Pod/Providers/Meetup/*.{h,m}' end s.subspec 'Tumblr' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - - ss.source_files = 'Providers/Tumblr/**/*.{h,m}' - ss.dependency 'cocoa-oauth' + ss.source_files = 'Pod/Providers/Tumblr/*.{h,m}' end s.subspec 'FoursquareWeb' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/FoursquareWeb/**/*.{h,m}' + ss.source_files = 'Pod/Providers/FoursquareWeb/*.{h,m}' end s.subspec 'DropboxWeb' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/DropboxWeb/**/*.{h,m}' + ss.source_files = 'Pod/Providers/DropboxWeb/*.{h,m}' end s.subspec 'LinkedInWeb' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/LinkedIn/**/*.{h,m}' + ss.source_files = 'Pod/Providers/LinkedIn/*.{h,m}' end s.subspec 'SinaWeiboWeb' do |ss| + ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Providers/SinaWeiboWeb/**/*.{h,m}' + ss.source_files = 'Pod/Providers/SinaWeiboWeb/*.{h,m}' end end diff --git a/SimpleAuth.xcodeproj/project.pbxproj b/SimpleAuth.xcodeproj/project.pbxproj deleted file mode 100644 index 5c1e8cb..0000000 --- a/SimpleAuth.xcodeproj/project.pbxproj +++ /dev/null @@ -1,732 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */; }; - 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB901887088400C73329 /* SimpleAuthTwitterProvider.m */; }; - 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB9418871F6200C73329 /* SimpleAuthFacebookProvider.m */; }; - 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB98188731A300C73329 /* SimpleAuthInstagramLoginViewController.m */; }; - 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B52BB9A188731A300C73329 /* SimpleAuthInstagramProvider.m */; }; - 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B658433188892FE00D59100 /* InfoPlist.strings */; }; - 3B658437188892FE00D59100 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B658436188892FE00D59100 /* main.m */; }; - 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65843A188892FE00D59100 /* SADAppDelegate.m */; }; - 3B65843D188892FE00D59100 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3B65843C188892FE00D59100 /* Images.xcassets */; }; - 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584571888931F00D59100 /* SADProviderListViewController.m */; }; - 3B65845C188895E400D59100 /* libSimpleAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */; }; - 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */; }; - 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */; }; - 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */; }; - 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */; }; - 3B69D1F818C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */; }; - 3B69D1FA18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */; }; - 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */; }; - 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */; }; - 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */; }; - 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */; }; - 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */; }; - 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */; }; - 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */; }; - 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */; }; - 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */; }; - 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */; }; - 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */; }; - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */; }; - 88DE19F4744D675DF308A530 /* libPods-SimpleAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */; }; - F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D4998CFA03844FB99EE78AA /* libPods.a */; }; - F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */; }; - F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; - 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ACAccountStore+SimpleAuth.h"; sourceTree = ""; }; - 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ACAccountStore+SimpleAuth.m"; sourceTree = ""; }; - 3B52BB8F1887088400C73329 /* SimpleAuthTwitterProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterProvider.h; sourceTree = ""; }; - 3B52BB901887088400C73329 /* SimpleAuthTwitterProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterProvider.m; sourceTree = ""; }; - 3B52BB9318871F6200C73329 /* SimpleAuthFacebookProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFacebookProvider.h; sourceTree = ""; }; - 3B52BB9418871F6200C73329 /* SimpleAuthFacebookProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFacebookProvider.m; sourceTree = ""; }; - 3B52BB97188731A300C73329 /* SimpleAuthInstagramLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthInstagramLoginViewController.h; sourceTree = ""; }; - 3B52BB98188731A300C73329 /* SimpleAuthInstagramLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthInstagramLoginViewController.m; sourceTree = ""; }; - 3B52BB99188731A300C73329 /* SimpleAuthInstagramProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthInstagramProvider.h; sourceTree = ""; }; - 3B52BB9A188731A300C73329 /* SimpleAuthInstagramProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthInstagramProvider.m; sourceTree = ""; }; - 3B658429188892FD00D59100 /* SimpleAuthDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleAuthDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B658432188892FE00D59100 /* SimpleAuthDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SimpleAuthDemo-Info.plist"; sourceTree = ""; }; - 3B658434188892FE00D59100 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 3B658436188892FE00D59100 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 3B658438188892FE00D59100 /* SimpleAuthDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuthDemo-Prefix.pch"; sourceTree = ""; }; - 3B658439188892FE00D59100 /* SADAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADAppDelegate.h; sourceTree = ""; }; - 3B65843A188892FE00D59100 /* SADAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SADAppDelegate.m; sourceTree = ""; }; - 3B65843C188892FE00D59100 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 3B6584571888931F00D59100 /* SADProviderListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SADProviderListViewController.m; sourceTree = ""; }; - 3B6584591888933200D59100 /* SADProviderListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SADProviderListViewController.h; sourceTree = ""; }; - 3B65845E1888A94200D59100 /* SimpleAuthTumblrProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrProvider.h; sourceTree = ""; }; - 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrProvider.m; sourceTree = ""; }; - 3B6584611888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTumblrLoginViewController.h; sourceTree = ""; }; - 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTumblrLoginViewController.m; sourceTree = ""; }; - 3B66656A18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFaceBookWebProvider.h; sourceTree = ""; }; - 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFaceBookWebProvider.m; sourceTree = ""; }; - 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFacebookWebLoginViewController.h; sourceTree = ""; }; - 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFacebookWebLoginViewController.m; sourceTree = ""; }; - 3B69D1F418C0340200E3D415 /* UIViewController+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+SimpleAuthAdditions.h"; sourceTree = ""; }; - 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+SimpleAuthAdditions.m"; sourceTree = ""; }; - 3B69D1F618C0340200E3D415 /* UIWindow+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+SimpleAuthAdditions.h"; sourceTree = ""; }; - 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+SimpleAuthAdditions.m"; sourceTree = ""; }; - 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebProvider.h; sourceTree = ""; }; - 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebProvider.m; sourceTree = ""; }; - 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthTwitterWebLoginViewController.h; sourceTree = ""; }; - 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthTwitterWebLoginViewController.m; sourceTree = ""; }; - 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthProvider.h; sourceTree = ""; }; - 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthProvider.m; sourceTree = ""; }; - 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSimpleAuth.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleAuth-Prefix.pch"; sourceTree = ""; }; - 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleAuth.h; sourceTree = ""; }; - 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleAuth.m; sourceTree = ""; }; - 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SimpleAuthAdditions.h"; sourceTree = ""; }; - 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SimpleAuthAdditions.m"; sourceTree = ""; }; - 3BC5FC6E1891D86A00523166 /* SimpleAuthDropboxWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthDropboxWebProvider.h; sourceTree = ""; }; - 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthDropboxWebProvider.m; sourceTree = ""; }; - 3BC5FC711891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthDropboxWebLoginViewController.h; sourceTree = ""; }; - 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthDropboxWebLoginViewController.m; sourceTree = ""; }; - 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthWebViewController.h; sourceTree = ""; }; - 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthWebViewController.m; sourceTree = ""; }; - 4D149A3F1889B3DF0024639C /* SimpleAuthMeetupProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupProvider.h; path = Meetup/SimpleAuthMeetupProvider.h; sourceTree = ""; }; - 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupProvider.m; path = Meetup/SimpleAuthMeetupProvider.m; sourceTree = ""; }; - 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleAuthMeetupLoginViewController.h; path = Meetup/SimpleAuthMeetupLoginViewController.h; sourceTree = ""; }; - 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SimpleAuthMeetupLoginViewController.m; path = Meetup/SimpleAuthMeetupLoginViewController.m; sourceTree = ""; }; - 4DD68DF218B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebProvider.h; sourceTree = ""; }; - 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebProvider.m; sourceTree = ""; }; - 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSinaWeiboWebLoginViewController.h; sourceTree = ""; }; - 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthSinaWeiboWebLoginViewController.m; sourceTree = ""; }; - 55342A24817A3976616170C2 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; - 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SimpleAuth.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebProvider.h; sourceTree = ""; }; - 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebProvider.m; sourceTree = ""; }; - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthLinkedInWebLoginViewController.h; sourceTree = ""; }; - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthLinkedInWebLoginViewController.m; sourceTree = ""; }; - B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleAuth.release.xcconfig"; path = "Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth.release.xcconfig"; sourceTree = ""; }; - F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleAuth.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth.debug.xcconfig"; sourceTree = ""; }; - F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthSingleSignOnProvider.h; sourceTree = ""; }; - F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebProvider.h; sourceTree = ""; }; - F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebProvider.m; sourceTree = ""; }; - F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleAuthFoursquareWebLoginViewController.h; sourceTree = ""; }; - F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimpleAuthFoursquareWebLoginViewController.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3B658426188892FD00D59100 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B65845C188895E400D59100 /* libSimpleAuth.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 681A563A05114C23AD83043F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F435E27FC62B4584BF9DBF2C /* libPods.a in Frameworks */, - 88DE19F4744D675DF308A530 /* libPods-SimpleAuth.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3B52BB8D1887088400C73329 /* Providers */ = { - isa = PBXGroup; - children = ( - 3B52BB9218871F6200C73329 /* Facebook */, - 3B66656918903F4000F3BF58 /* Facebook Web */, - 3B52BB8E1887088400C73329 /* Twitter */, - 3B8C408B18879296007DC578 /* Twitter Web */, - 3B52BB96188731A300C73329 /* Instagram */, - 3B65845D1888A93200D59100 /* Tumblr */, - 3BC5FC6D1891D80E00523166 /* Dropbox Web */, - F9BE4F32189120BE00AE303A /* Foursquare Web */, - 4D149A3E1889B38C0024639C /* Meetup */, - 81A50A461892645800D5D8AC /* LinkedIn Web */, - 4DD68DF118B21A0F009B3767 /* SinaWeibo Web */, - ); - path = Providers; - sourceTree = ""; - }; - 3B52BB8E1887088400C73329 /* Twitter */ = { - isa = PBXGroup; - children = ( - 3B52BB8F1887088400C73329 /* SimpleAuthTwitterProvider.h */, - 3B52BB901887088400C73329 /* SimpleAuthTwitterProvider.m */, - ); - path = Twitter; - sourceTree = ""; - }; - 3B52BB9218871F6200C73329 /* Facebook */ = { - isa = PBXGroup; - children = ( - 3B52BB9318871F6200C73329 /* SimpleAuthFacebookProvider.h */, - 3B52BB9418871F6200C73329 /* SimpleAuthFacebookProvider.m */, - ); - path = Facebook; - sourceTree = ""; - }; - 3B52BB96188731A300C73329 /* Instagram */ = { - isa = PBXGroup; - children = ( - 3B52BB99188731A300C73329 /* SimpleAuthInstagramProvider.h */, - 3B52BB9A188731A300C73329 /* SimpleAuthInstagramProvider.m */, - 3B52BB97188731A300C73329 /* SimpleAuthInstagramLoginViewController.h */, - 3B52BB98188731A300C73329 /* SimpleAuthInstagramLoginViewController.m */, - ); - path = Instagram; - sourceTree = ""; - }; - 3B658430188892FE00D59100 /* SimpleAuthDemo */ = { - isa = PBXGroup; - children = ( - 3B658439188892FE00D59100 /* SADAppDelegate.h */, - 3B65843A188892FE00D59100 /* SADAppDelegate.m */, - 3B6584591888933200D59100 /* SADProviderListViewController.h */, - 3B6584571888931F00D59100 /* SADProviderListViewController.m */, - 3B65843C188892FE00D59100 /* Images.xcassets */, - 3B658431188892FE00D59100 /* Supporting Files */, - ); - path = SimpleAuthDemo; - sourceTree = ""; - }; - 3B658431188892FE00D59100 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3B658432188892FE00D59100 /* SimpleAuthDemo-Info.plist */, - 3B658433188892FE00D59100 /* InfoPlist.strings */, - 3B658436188892FE00D59100 /* main.m */, - 3B658438188892FE00D59100 /* SimpleAuthDemo-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 3B65845D1888A93200D59100 /* Tumblr */ = { - isa = PBXGroup; - children = ( - 3B65845E1888A94200D59100 /* SimpleAuthTumblrProvider.h */, - 3B65845F1888A94200D59100 /* SimpleAuthTumblrProvider.m */, - 3B6584611888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.h */, - 3B6584621888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m */, - ); - path = Tumblr; - sourceTree = ""; - }; - 3B66656918903F4000F3BF58 /* Facebook Web */ = { - isa = PBXGroup; - children = ( - 3B66656A18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.h */, - 3B66656B18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m */, - 3B66656D18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.h */, - 3B66656E18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m */, - ); - name = "Facebook Web"; - path = FacebookWeb; - sourceTree = ""; - }; - 3B69D1F218C0340200E3D415 /* UI */ = { - isa = PBXGroup; - children = ( - 3B69D1F318C0340200E3D415 /* ios */, - ); - path = UI; - sourceTree = ""; - }; - 3B69D1F318C0340200E3D415 /* ios */ = { - isa = PBXGroup; - children = ( - 3B69D1F418C0340200E3D415 /* UIViewController+SimpleAuthAdditions.h */, - 3B69D1F518C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m */, - 3B69D1F618C0340200E3D415 /* UIWindow+SimpleAuthAdditions.h */, - 3B69D1F718C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m */, - 3C0A5391182C4217002C050C /* SimpleAuthWebViewController.h */, - 3C0A5392182C4217002C050C /* SimpleAuthWebViewController.m */, - ); - name = ios; - path = iOS; - sourceTree = ""; - }; - 3B8C408B18879296007DC578 /* Twitter Web */ = { - isa = PBXGroup; - children = ( - 3B8C408C188792A9007DC578 /* SimpleAuthTwitterWebProvider.h */, - 3B8C408D188792A9007DC578 /* SimpleAuthTwitterWebProvider.m */, - 3B8C408F18879347007DC578 /* SimpleAuthTwitterWebLoginViewController.h */, - 3B8C409018879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m */, - ); - name = "Twitter Web"; - path = TwitterWeb; - sourceTree = ""; - }; - 3B8F11B8182AC0E50035C4EA /* Providers */ = { - isa = PBXGroup; - children = ( - 3B9AB062182AC2710011FB9E /* SimpleAuthProvider.h */, - 3B9AB063182AC2710011FB9E /* SimpleAuthProvider.m */, - F978D07E18AE382600017ED5 /* SimpleAuthSingleSignOnProvider.h */, - ); - name = Providers; - sourceTree = ""; - }; - 3BB324FB182ABC8B00ACB555 = { - isa = PBXGroup; - children = ( - 3BB32509182ABC8B00ACB555 /* SimpleAuth */, - 3B52BB8D1887088400C73329 /* Providers */, - 3B658430188892FE00D59100 /* SimpleAuthDemo */, - 3BB32506182ABC8B00ACB555 /* Frameworks */, - 3BB32505182ABC8B00ACB555 /* Products */, - E41F3FB2B4E976B36518620C /* Pods */, - ); - sourceTree = ""; - }; - 3BB32505182ABC8B00ACB555 /* Products */ = { - isa = PBXGroup; - children = ( - 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */, - 3B658429188892FD00D59100 /* SimpleAuthDemo.app */, - ); - name = Products; - sourceTree = ""; - }; - 3BB32506182ABC8B00ACB555 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 0D4998CFA03844FB99EE78AA /* libPods.a */, - 7CD421025E01A139B987346B /* libPods-SimpleAuth.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3BB32509182ABC8B00ACB555 /* SimpleAuth */ = { - isa = PBXGroup; - children = ( - 3BB3250C182ABC8B00ACB555 /* SimpleAuth.h */, - 3BB3250E182ABC8B00ACB555 /* SimpleAuth.m */, - 3B69D1F218C0340200E3D415 /* UI */, - 3B8F11B8182AC0E50035C4EA /* Providers */, - 3C611F421835350800D87E45 /* Categories */, - 3BB3250A182ABC8B00ACB555 /* Supporting Files */, - ); - path = SimpleAuth; - sourceTree = ""; - }; - 3BB3250A182ABC8B00ACB555 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 3BB3250B182ABC8B00ACB555 /* SimpleAuth-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 3BC5FC6D1891D80E00523166 /* Dropbox Web */ = { - isa = PBXGroup; - children = ( - 3BC5FC6E1891D86A00523166 /* SimpleAuthDropboxWebProvider.h */, - 3BC5FC6F1891D86A00523166 /* SimpleAuthDropboxWebProvider.m */, - 3BC5FC711891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.h */, - 3BC5FC721891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m */, - ); - name = "Dropbox Web"; - path = DropboxWeb; - sourceTree = ""; - }; - 3C611F421835350800D87E45 /* Categories */ = { - isa = PBXGroup; - children = ( - 3BBDA066188E02A70045D1EA /* NSObject+SimpleAuthAdditions.h */, - 3BBDA067188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m */, - 3B3536981894C5710044EA0E /* ACAccountStore+SimpleAuth.h */, - 3B3536991894C5710044EA0E /* ACAccountStore+SimpleAuth.m */, - ); - name = Categories; - sourceTree = ""; - }; - 4D149A3E1889B38C0024639C /* Meetup */ = { - isa = PBXGroup; - children = ( - 4D149A3F1889B3DF0024639C /* SimpleAuthMeetupProvider.h */, - 4D149A401889B3DF0024639C /* SimpleAuthMeetupProvider.m */, - 4D149A421889B4390024639C /* SimpleAuthMeetupLoginViewController.h */, - 4D149A431889B4390024639C /* SimpleAuthMeetupLoginViewController.m */, - ); - name = Meetup; - sourceTree = ""; - }; - 4DD68DF118B21A0F009B3767 /* SinaWeibo Web */ = { - isa = PBXGroup; - children = ( - 4DD68DF218B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.h */, - 4DD68DF318B21A3C009B3767 /* SimpleAuthSinaWeiboWebProvider.m */, - 4DD68DF518B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.h */, - 4DD68DF618B21A55009B3767 /* SimpleAuthSinaWeiboWebLoginViewController.m */, - ); - name = "SinaWeibo Web"; - path = SinaWeiboWeb; - sourceTree = ""; - }; - 81A50A461892645800D5D8AC /* LinkedIn Web */ = { - isa = PBXGroup; - children = ( - 81A50A471892649300D5D8AC /* SimpleAuthLinkedInWebProvider.h */, - 81A50A481892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m */, - 81A50A4A189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.h */, - 81A50A4B189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m */, - ); - name = "LinkedIn Web"; - path = LinkedIn; - sourceTree = ""; - }; - E41F3FB2B4E976B36518620C /* Pods */ = { - isa = PBXGroup; - children = ( - 0EED20F73F4C80108F0AB226 /* Pods.debug.xcconfig */, - 55342A24817A3976616170C2 /* Pods.release.xcconfig */, - F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */, - B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - F9BE4F32189120BE00AE303A /* Foursquare Web */ = { - isa = PBXGroup; - children = ( - F9BE4F33189120DE00AE303A /* SimpleAuthFoursquareWebProvider.h */, - F9BE4F34189120DE00AE303A /* SimpleAuthFoursquareWebProvider.m */, - F9BE4F391891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.h */, - F9BE4F3A1891308200AE303A /* SimpleAuthFoursquareWebLoginViewController.m */, - ); - name = "Foursquare Web"; - path = FoursquareWeb; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 3B658428188892FD00D59100 /* SimpleAuthDemo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3B658455188892FE00D59100 /* Build configuration list for PBXNativeTarget "SimpleAuthDemo" */; - buildPhases = ( - 3B658425188892FD00D59100 /* Sources */, - 3B658426188892FD00D59100 /* Frameworks */, - 3B658427188892FD00D59100 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SimpleAuthDemo; - productName = SimpleAuthDemo; - productReference = 3B658429188892FD00D59100 /* SimpleAuthDemo.app */; - productType = "com.apple.product-type.application"; - }; - 3BB32503182ABC8B00ACB555 /* SimpleAuth */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3BB32527182ABC8C00ACB555 /* Build configuration list for PBXNativeTarget "SimpleAuth" */; - buildPhases = ( - 5220918F16EE4E09993F918E /* Check Pods Manifest.lock */, - 3BB32500182ABC8B00ACB555 /* Sources */, - 681A563A05114C23AD83043F /* Frameworks */, - 7F931EDAAC5648DA9D804C83 /* Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SimpleAuth; - productName = SimpleAuth; - productReference = 3BB32504182ABC8B00ACB555 /* libSimpleAuth.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3BB324FC182ABC8B00ACB555 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0500; - ORGANIZATIONNAME = "Byliner, Inc"; - }; - buildConfigurationList = 3BB324FF182ABC8B00ACB555 /* Build configuration list for PBXProject "SimpleAuth" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 3BB324FB182ABC8B00ACB555; - productRefGroup = 3BB32505182ABC8B00ACB555 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 3BB32503182ABC8B00ACB555 /* SimpleAuth */, - 3B658428188892FD00D59100 /* SimpleAuthDemo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 3B658427188892FD00D59100 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */, - 3B65843D188892FE00D59100 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 5220918F16EE4E09993F918E /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 7F931EDAAC5648DA9D804C83 /* Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SimpleAuth/Pods-SimpleAuth-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 3B658425188892FD00D59100 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, - 3B658437188892FE00D59100 /* main.m in Sources */, - 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3BB32500182ABC8B00ACB555 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3BC5FC701891D86A00523166 /* SimpleAuthDropboxWebProvider.m in Sources */, - 3B8C408E188792A9007DC578 /* SimpleAuthTwitterWebProvider.m in Sources */, - 81A50A4C189264C500D5D8AC /* SimpleAuthLinkedInWebLoginViewController.m in Sources */, - F9BE4F3E189139E900AE303A /* SimpleAuthFoursquareWebProvider.m in Sources */, - 4D149A411889B3DF0024639C /* SimpleAuthMeetupProvider.m in Sources */, - 81A50A491892649300D5D8AC /* SimpleAuthLinkedInWebProvider.m in Sources */, - 3B8C409118879347007DC578 /* SimpleAuthTwitterWebLoginViewController.m in Sources */, - 3B69D1FA18C0340200E3D415 /* UIWindow+SimpleAuthAdditions.m in Sources */, - 3B6584631888ABFB00D59100 /* SimpleAuthTumblrLoginViewController.m in Sources */, - 3B52BB9518871F6200C73329 /* SimpleAuthFacebookProvider.m in Sources */, - 3B9AB064182AC2710011FB9E /* SimpleAuthProvider.m in Sources */, - 3B52BB9B188731A300C73329 /* SimpleAuthInstagramLoginViewController.m in Sources */, - F9BE4F3F189139F200AE303A /* SimpleAuthFoursquareWebLoginViewController.m in Sources */, - 3B69D1F818C0340200E3D415 /* UIViewController+SimpleAuthAdditions.m in Sources */, - 3C0A5393182C4217002C050C /* SimpleAuthWebViewController.m in Sources */, - 3B6584601888A94200D59100 /* SimpleAuthTumblrProvider.m in Sources */, - 4D149A441889B4390024639C /* SimpleAuthMeetupLoginViewController.m in Sources */, - 3B66656F18903F8400F3BF58 /* SimpleAuthFacebookWebLoginViewController.m in Sources */, - 3BC5FC731891D87B00523166 /* SimpleAuthDropboxWebLoginViewController.m in Sources */, - 3B52BB911887088400C73329 /* SimpleAuthTwitterProvider.m in Sources */, - 3B52BB9C188731A300C73329 /* SimpleAuthInstagramProvider.m in Sources */, - 3B66656C18903F5400F3BF58 /* SimpleAuthFaceBookWebProvider.m in Sources */, - 3B35369A1894C5710044EA0E /* ACAccountStore+SimpleAuth.m in Sources */, - 3BB3250F182ABC8B00ACB555 /* SimpleAuth.m in Sources */, - 3BBDA068188E02A70045D1EA /* NSObject+SimpleAuthAdditions.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 3B658433188892FE00D59100 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 3B658434188892FE00D59100 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 3B658451188892FE00D59100 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SimpleAuthDemo/SimpleAuthDemo-Prefix.pch"; - INFOPLIST_FILE = "SimpleAuthDemo/SimpleAuthDemo-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 3B658452188892FE00D59100 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SimpleAuthDemo/SimpleAuthDemo-Prefix.pch"; - INFOPLIST_FILE = "SimpleAuthDemo/SimpleAuthDemo-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - 3BB32525182ABC8C00ACB555 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 3BB32526182ABC8C00ACB555 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 3BB32528182ABC8C00ACB555 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F5740F0760E6968AEA94D273 /* Pods-SimpleAuth.debug.xcconfig */; - buildSettings = { - DSTROOT = /tmp/SimpleAuth.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SimpleAuth/SimpleAuth-Prefix.pch"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 3BB32529182ABC8C00ACB555 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B7FC32E2FE6DDAF5548E0897 /* Pods-SimpleAuth.release.xcconfig */; - buildSettings = { - DSTROOT = /tmp/SimpleAuth.dst; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "SimpleAuth/SimpleAuth-Prefix.pch"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3B658455188892FE00D59100 /* Build configuration list for PBXNativeTarget "SimpleAuthDemo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B658451188892FE00D59100 /* Debug */, - 3B658452188892FE00D59100 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3BB324FF182ABC8B00ACB555 /* Build configuration list for PBXProject "SimpleAuth" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3BB32525182ABC8C00ACB555 /* Debug */, - 3BB32526182ABC8C00ACB555 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3BB32527182ABC8C00ACB555 /* Build configuration list for PBXNativeTarget "SimpleAuth" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3BB32528182ABC8C00ACB555 /* Debug */, - 3BB32529182ABC8C00ACB555 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3BB324FC182ABC8B00ACB555 /* Project object */; -} diff --git a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme b/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme deleted file mode 100644 index 84faccf..0000000 --- a/SimpleAuth.xcodeproj/xcshareddata/xcschemes/SimpleAuthDemo.xcscheme +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SimpleAuth.xcworkspace/contents.xcworkspacedata b/SimpleAuth.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index aea7705..0000000 --- a/SimpleAuth.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/SimpleAuthDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/SimpleAuthDemo/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index a396706..0000000 --- a/SimpleAuthDemo/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/SimpleAuthDemo/Images.xcassets/LaunchImage.launchimage/Contents.json b/SimpleAuthDemo/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index c79ebd3..0000000 --- a/SimpleAuthDemo/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file From c795651256b48dd252e066199e9c1d48e6db16e1 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 17:12:33 -0700 Subject: [PATCH 095/139] Add workspace. --- .../SimpleAuth.xcworkspace/contents.xcworkspacedata | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Example/SimpleAuth.xcworkspace/contents.xcworkspacedata diff --git a/Example/SimpleAuth.xcworkspace/contents.xcworkspacedata b/Example/SimpleAuth.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..aea7705 --- /dev/null +++ b/Example/SimpleAuth.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + From 8fdcba9ce5ff8653a09bcc48193e107b07b774b7 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 17:15:36 -0700 Subject: [PATCH 096/139] Version bump. --- SimpleAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index a2a53ee..88b72fa 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.5' + s.version = '0.3.6' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 467c7243f8b7598411f78369b76de38442ff572c Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 17:31:51 -0700 Subject: [PATCH 097/139] Add demo app icon. --- Example/SimpleAuth.xcodeproj/project.pbxproj | 4 ++ .../AppIcon.appiconset/Artboard 1.png | Bin 0 -> 3996 bytes .../AppIcon.appiconset/Artboard 2.png | Bin 0 -> 11653 bytes .../AppIcon.appiconset/Artboard 3.png | Bin 0 -> 12545 bytes .../AppIcon.appiconset/Artboard 4.png | Bin 0 -> 24486 bytes .../AppIcon.appiconset/Contents.json | 60 ++++++++++++++++++ 6 files changed, 64 insertions(+) create mode 100644 Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 1.png create mode 100644 Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 2.png create mode 100644 Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 3.png create mode 100644 Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 4.png create mode 100644 Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example/SimpleAuth.xcodeproj/project.pbxproj b/Example/SimpleAuth.xcodeproj/project.pbxproj index 1b76408..27603ae 100644 --- a/Example/SimpleAuth.xcodeproj/project.pbxproj +++ b/Example/SimpleAuth.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 3B629D9B19DE1F2500BDF072 /* Readme.markdown in Sources */ = {isa = PBXBuildFile; fileRef = 3B629D9819DE1F2500BDF072 /* Readme.markdown */; }; 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */; }; 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */; }; + 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9F19DE238100BDF072 /* Images.xcassets */; }; 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B658433188892FE00D59100 /* InfoPlist.strings */; }; 3B658437188892FE00D59100 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B658436188892FE00D59100 /* main.m */; }; 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B65843A188892FE00D59100 /* SADAppDelegate.m */; }; @@ -25,6 +26,7 @@ 3B629D9819DE1F2500BDF072 /* Readme.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = Readme.markdown; path = ../Readme.markdown; sourceTree = ""; }; 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SimpleAuth.podspec; path = ../SimpleAuth.podspec; sourceTree = ""; }; 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; + 3B629D9F19DE238100BDF072 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 3B658429188892FD00D59100 /* SimpleAuth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleAuth.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3B658432188892FE00D59100 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3B658434188892FE00D59100 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -71,6 +73,7 @@ 3B658436188892FE00D59100 /* main.m */, 3B658438188892FE00D59100 /* Prefix.pch */, 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */, + 3B629D9F19DE238100BDF072 /* Images.xcassets */, ); path = SimpleAuth; sourceTree = ""; @@ -165,6 +168,7 @@ buildActionMask = 2147483647; files = ( 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */, + 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */, 3B629D9A19DE1F2500BDF072 /* LICENSE in Resources */, 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */, 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */, diff --git a/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 1.png b/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2853d1d7d91a2a4302ab025baedaba6b7b746d GIT binary patch literal 3996 zcmV;N4`c9&P)Px^R!KxbRA>dYS__O_Wf7ip@7?b9CFLcLf+-d#;U$Hjg$4wI#nysC)lxxxP$U@R z1Hov3XcQAL1QO(7poBmGgO8vVVj?Q9LJNf$d6z^&u_!O0z_z>Fz4siy@0)+lJ$t*m zw=Lx_=gge>=bxExX3l@kxl7ji%87-=D8Oc!87T)?BTG8!=u`;hw0<)KUFN&`@9?*U z`VE070l zK&B|lvW?J^YS>WRNs<9Yfq$gss4fjYQR#s%^?@+6nj@8guwJoO8YY9qN?;i7(5E;= zTIT|QtQgFaLsE`NGbu)B26b8WN@`niq958${z~5cZEh%hB`P)WRrM;L@CYQU!I6QG zBh_GQbhZQSm-C5FK7CR9T;x!!>bIwyt2oT)t22!X2I8^&b<9Usb>dOGW|hi`PnDBX z@f8%|kYNf0=14gZXpti;q_|WgAn-iR6G#D}19AoNkWtP>!kWM;Ka|n71~}@4BzRG- z^-e7DNR#&@7jT`1E0yh|#UTrwDvh-syaI*20yra^Ic%gDQh-=r2IYK!DDPE>B?ID^ zlh?Slf>Jnwryyb?@1sF~BTco}P(~1rKmal)q^0hBo^B=1$f8Y@X#*i3Fjpl3M(C!4P zomfEAMn%0)rtMK~AFXXJo?k>Z%Pe^8otMhGvJ2y^U=9a3ixOl$^V2rr?9;7h-`&e( z()X5+L2Etzh;6#*ax2z(rRqdWc%U_$!at?KlX4J8$Xw#*thIPSQmKl^=N%xEURVoO z^I{)sTy&B3&faVMgMEo zrkszDM1#*;fR@%Y(H^axK5M+&GDDteN|d}30m{}_t4^A46R$nb8hsT<+mr3v$NH`XP{b#H@Qd1% zF|hz1BV~-QO~or_R5Air-Kiuau3YkzaRD<3%12={|FAW#`i|8*_mk}jlC~N%toQ2g zrE0qGveN+C!GWY=1QmG1Nvd`oYY{g}C4m%eDxhjtw7}9ITkp<{;)5UA^m*31^7x~1)px5ywo<`et{L(VcAK1h-Bq%%T9~Y=Gn5` zaYwwMbGIZwQV#JzR|QRZal-Mo*<+6r9iw^wuWaL0%N0%Z_Wc43#%u*QkUAw#LF7$?I|lsxBx zh8`(49%jY=@!sUW@*bsU0tc-g*3%^(8?@njm&;ZS>uY#%rd?7Vjdb8jeC_$0Y~zYo zyBW1?Dq9oh5%55hC!erLHU#;iVpIN@)3LEs4iV8aj)etl>l0B0k@kuIYkq^^$z-~n7XV~J9_96# zL5s??oEDL^@Vdbd(AMmwsOJ3AF{a-4$k(sK_v8~ceAnHUKl`TImv1#}V*=)(YS-Ap z42x|HSqd1ZOA^54uH5BU^c+k<-IOTZjIedSsPwVzPm60tv<*RP7flKbjYoJ$@ zi?kV~)r^vnd9+E$>*l=09loDhSjIMpPv#2ZRopaTKr$^iNbLuF7N<(&7}-j6j77s zh&LAUDysXaD3gUYjCmqR`HV&F_uS92W9L|7?h)3r|8%QuCFXq9jW%@2z5Wi1$m)2+ zCaKB%iVRYJjBR ztKq_h*7v1_*0cK-{u(y;v~67QQ?+S>&r8_n2E>tEiAs=84c)K|21Dg$sMOXqPK=W` zHrRYBei=XQ5Wm2+Ua=el)yyW~Sos$#p5DkSJl7zFZT{mBKpLV=kXA8Z#ofQPf#tuk zfp7fCrY@PCG^sttzy}G}(uhFGnA_Kx@ua1~1OI52_Uf4&i=d9E9 zP)>F>Ckqd-fm1G%HJ=QKymH=yEa1F`KP&is-@4&4Ti^df+wq*)zHF@Xl)bGn69Dn~ zNjv`399@~-m~Zo#(98Kf1wEI%U`Lt02c3cf_PIoOHlm zt#F>y6Ajtzx7koP`>YG&8TEiE$w~2F;`yypIuBkcq7rm@BIUt=yN~HsU$iscagi5f zj7d`Bcmwl4P>0Sy-6o&6`g?4;EynfHTyMqejKkNLRJM4JQW6QJC%h7RrZJZs1{I)G z306@R&)>HEz4VnnP9!~FJz9q)1^ZueWU&@a(v;0ULgJEv=3}rW|aOmz`n5s2bl;ny}pjFaqX_ z19xe?4iYSQ1p~fu{TXb=aYymrb&69PCgLTH`2A-QPe3Gr6bJ~$4_87Bajk=8mlD4M z$V2;gk82|uHxf+N_CMKnSbnM1J~>@LSvdk^8#`c9Bml?ozK7X_TbJ3CgLdd<)>==j zM#T8XU7PncU)V`;u!2FI_v&WNW6#3W_=8(9m6&yYX4S5_)+TKPZ5<}=&)PPMf zvxBVZnL~icV(Xi?So7g;cWo^h#VMP%8~!A~BP82Kn}52)>|IvRJCA|-E#?82adI9b zo|DJ}%8V9Lj{`tZwgmgKq~g)E%wD$I2Ci7SZIN#4syA2K&}IMhq%#&Ce0K$9lsvpR zPOJQgKiyR)syq$QAOZ4U9sOUw>pJVdW6idPymjlEYi;n$*CDy^t6l;)#G$<;C}NAf zC1~t1dQOJ0lZKKuAs8WWe~2e~&860V_20K>BicGtZSCUUkK4v$F2-YnJ;x0OX;!jh z*C#mW^R^ODr{o#0bel(it^AEAdYE*q!8y0-FX-Hi@?wTHetE9-9l7UN%eG$Le8)E3 zd82K*=1F~V#1C2eP%mG|@pMi5#dr>~=22g7BVudwij+gCV5VH9YLF8Bu!U(p3k7x- z{^oe@LYr{-Osn;Ed*aE%W~btfmu>id{1|=3efaw$E9YMs-0<`W!!Dv2u~PdF0!jN! zXSmRCFj?!Uvl9f$(u$CDS}8NYUCj-!uH=AIoF48J95Bo3#~o_5S$kQ1cl^IRAHru9 zfHQxb##7RY!67T&!W+!X|FPDy&sgh0JOkGyFwo#96hZ1)h->YtTpDAucriiabfV$j zvgVw#-Dk)vl$#78ka7g?uv{_PH|A-KzNsT#XZJ0(jZ(p|Iy6rotQH4b(>d_qXfMYltvoRT~9H_u)V@az7n7U!5O*;t#>$eiTyZd}Rqk@_YFBwl!!u&zoy*!p#94+vqALrOA&k(ay@;s_uEW3n z773ZCEF^P@XPYzm{?V)lYMQAM8s%I#3_kQb=2chppD30^&HVl)2nVCYh96cf*;i0l zMaseTUgv~Vq>^;C3N<0)P*D;kN&2c}QW5Iv4ywh{42`w{aK76Js0YEOpd(Sv%PGS2 zX-^jIMbfB~)<`|gMN))8GR|^@a*8Kxk!l)p?toSMkPD<|oLXL9Zz)`AF|ry)s4`;2 zTvUk8LPo{l$C@8uYz%z_UiweqqHPyNKS@MERCod1eG9m4RdwFn`<(mWUaq1LDUqiL0fD3hA3Q`OA}Sgwz95F8(Uka6 z#7B}ZXl&IlskQA_#F|%QZS!c24-(p%RAbacQ6Ux3Cbxp1yhH_oh6@+&x%cdScK`n$ z<6mp;wf8ya!a2Z!x$jzI%rVD%%sJQEYwvw-Z}|FCN2TB&8$mB2`^E_$QtK+{8t5qP z4tK>n?92Q6AQe1V`(1w~`d#~7108|xa96y;UdKPHF)C1ld=IL%jCD>pPejR6+|ZwBTRuFUW9DI z5e(tttsXOO*pZT2jM*;rn$}@e*JF$FbAYyzfr)1`lz#KXQ1B<7?2R~(wHiNGWSvw8 zZJL9Oh+Hs32H4ZAa1uIjX?1Omr@97;aT~6s_^~1* zoH)Cauv)qrpV&$exMp`IV_A?m}yX4oJNp&k_L_{n?; z?K>gc8jgQ_MNT+M=M_Sp5Rm#Am^w}_c@xjVNFB*dUa&2rqgC9fwJs1Az{sQ#vKem@ zDPrqWvNb-E&oM~BgFIQ*4pZDVq>B29*k^W#C)1-Cf86ZQH#R5CP=4C^U>Q3rag|($ z-`j3eIEyictOY}Y2Y#1P;!KQ z@}&)TYe;;FCTX0)TC1tC=U8k1O`~258rC%7>02#d`%8Q`;~(Ezsk~}-*pNdt-fUx; z*y$^#Rp@QCDMb3|1<-1*t+cprG7P)^jD`zP0saL*4JO_i2s+NqDrqQ_h%FnEqsG@# z{7bILiO?7YXP2Ytrqyrlsk@u; zhYq>diV1_=j6b$kJJyMGax3iIbvi4S4>Q#{6Of6GJcCx{#U?4_q#H)oF_3v$0K(PW ztVrUp-K-+=L7@vrJ0sl*Q#)E-iyC)p|LK#R0c1DyP+x4-{eHh=4+bqm{Sz$%l{O4Y zDNaeQ%~RBIcjIyVjJuA%=FhFwnx(EuoWh~6w%lOJPxfX^ohg0O0ka^66Z$!hqbUTt zmZ2IHBD#dhES|Qs$v|#2`boaeU{6u0B(PxH6&mh8db?*md^+88T(TD^(eVd#?#Z>rcp@2yh& zp^#prO<>NY(e@a)(wWra(JOk|OgfI&HJ2=b^G zV-^{Cd!#sV{PS2Ui|sVjW3U;ez?cIZp^L1ynuoI!w{oM>Pn(fQ4(6HwzjQPKhCYdt zYd7K_lb}E-l!_D|&uOO@wt6M6k?w|~X6e$IF~Q(l^h_t%45K%GuEt^&#xTiwDH7B= zr#m_M$;Fz8PG~)%g%0sl#>u1HB(D++eeI0SG=kAdr%#NTNu+7=#$F2m3> z7?d)YE2Et_w%=DqKf0p~Z@;B1+;m-8*!p*6c-MV2T>9{70Y(`bkFwAMO+&J3n$&85 zyt$J=LC580rEVqudY{bc=k&nor+~Jlu2@2uJy_6 zjgvvJq=z}LSro78W;Ipzf);$L6ND+R0|85yX-B`HtUKvv%Iq;ml$m|^lDA`VuAnp8 zxxFmherp+i>#8!i{PShuhC7sJI>6d!mC_mHglX}i5lpnPR5gW}jNdt-tHzz5aV20# zdyxcoBbS+#G5Ox`EEJMnOluR0A^?)vIuk00OPsyZ$wD34Hes7|^+^N5>!Kk0`#htp zd(}B*{mDO7`Wwbq8HOLecK=;v{;DsOT_68w8QqzwhOhlh7GvjvjFG8re_t=0-eA#J{;hZ<(n)!Hq^U8YuH6f0&FuQ^mrvnnoZsBk#(@*v)QPAuy# zcvIPM^#1m)tNan`53jqt?EJ$^uu8Yf7ZnZ|qYIp&L_z5k>1^#b8x&4g^2M~}IO7J5 zO4yhL;)Lwt;7Ig{kFW5W1BE;tx`K5=F|}1~!jTEZ6?27JKMgY!_TyzdT%sGJvTvDv z$Ggjh6AuID+G@kCe_7`K-Nj{ef8^V%lh;-H%Cl=?-{Jt?!R=hv6cfJ`zsDDRe-Ar)p3SWj%DA<98zsx=lnctHUwV1Ly~-MH+spi=7nhwM z|C(wrqxUFLKyS5p02D3r!xFPOS4}>d1P&1;_g_n~^=tq@WQBhi8WLQnnICp(YF6 z?AtVo!jX^u422(3*8l#+W&OTudM}M+Ogqo+U-q~J#oQ-ia%>TE#OnBUU!aNWJRrBq zT|nZ_?PB>>t;m-zV}yOsrBKs{o$6SwP@V)c>NqR3ybM z-Ypa*M581RHbbDnPg>wH1Vh{k#NHa8dFuzu#)CIf!(+c~JhJR@@%e}w@i7|5>aCFd z>R_InD?=qgaxJgMKnrfxrOGk!yOoCgSpVri9dpkf)HOWzs{W}f%v7H3xkP`oD%9r zIm$xKN_`|>cod?Y5rGAl=8Kdy@=zFVa%S>yK;bmsdW=TLmOajY0Y)BwZT5_}mswmd zW70-^QP9K{KZ-!e{g*2^A#vr^P?>aQ14eeE25qJ}h83y8TF6QWYdpv6SwLJ)HW1o? z>pf!(Xk0W@lqAiZcOuxw$&Sj1#@jw+!@JJUO9}7F8MpJq=(&OdsvNwDaJ0|Ql|7z~DZ9#TwEeC! z_}1T-!T-gl7&qNo7Jl%(Qg&=F<$in`vUzjq?fv9Z_Qj_o2Om~u4m-5W9{RL0yEn!j zhQ=*+{mFk+=D%`(T*G+huOuRV*c;286JwyZnnoU-v}j$BorXm$Ooey+@4{-1RB8h()4Hs@{G zd`2j{RS(_lLg>$UtwZ8BG{F)g@mi5nEy(c&GfAxE1+dqA4 z8L)_$F8s>HjJ&`$gU_92c;H!C1A+HN=Zyi5yS`ZlAN-Ya-x>eB?6~H(Hp{Dl9ei@> zZ(`UiW5iEfFGJEZ$1&T}uxenO@@RRfqdalHG$GK_1f~+o@*snugpvl3Efs^0+~hTs z4kXiXL3cKIKLrSK86AF7nO&vbY}bGP^>Y7z_;jwmqGGW~T#YU!aTUxEKJZPmXz-md zqPV&2eD5!nZU5~WMYB4meah^M4pQ9CL%ap^^^%a8LS7OQuXA4G9Ah)9@(FSB5GT~l z4iUas1w-NzOlaX6G7+JOaw$uT(qc-$*;k(|9u2SHv~bOTE)RV48z@>>naLUMqVc(A zJo|(Z#bf9wAqYAT7N7S4)KNb1FUoy?aWe*1r_COJA{1p_GduA`X3%IChjN#Yc%5_k zNIB9|9zEfNHO`(M*o)Z$h8X0_&O~qg97T*-L7buuOq|z74QyGBTh-gj_V-+xp0(b^ zjDx4#cHjUZ${8!Qfux~mkY?d{aD{3j0CFOX{^Lbu?lycSWEEQPu;)lWbK?AJ^?^Xh zgAo`C2dg3F#AnFFCO=_~lP@0#0MExSK92*@}W)EEXzPfPD z=Wqi7jar4Fn;~gi1s#zKr(NQD@{y2*(n^p=;U(FODK(?*W$uzc(@hG;R@7$qEB%8) zzx8l}vBiXI@n)PcaD0)M$HbI;rp4CkrOrVvbwD0G84}@`VRvirXO7658bO1jV?0J5 z+IjHJtHU8Fr-AXK-=C2kZJG2HO}H?e!0%KM=Zz34nh421bNyvy*X^sZDxu?nFwEE$ zKPI3dk{SLRnkS)UYDk|Y4_M=*#it)Rz?l%i#+)FTSPnx8RxWiA;?P*aTGj$B%?XUa z9_qQbeh+$x##5jy|V#ET2_;j}OgH3sL=$lAS?grQp;y%>WL)Djq*g^diWpG1 zuL(c8rVR0bWuh$g#${JxNX3P*bQ-gw;T;24|Z z@Atk}25&g4a9xs{O%poMh8ET+7jeqGVvar;^~jJMq~paLau-lbTB9)eLL+t1Zoq~= zV+{qNm;8DkNoF2whBfYSI!v6f#zUrEiRvd`@Z)RztMqM-ndiK*Z28TzwF>E@RvC=Y zeXUU9=#Wk?wL*#G@QmjOTli+VHYSdFawz4HWf9^*L;F6IG`$byXxbo6n$VAOd3y~V z9Mw4ZXrDNteK8at=!W4x*pt_MhOiY*&=ChXMwG1 zmDy5nhwx(y-YsF$%BKAnemg?1tHz5i3N#+ zce%t_oVJL3rpuKdZ)3<4<8jSp#v&t}Nb$CfcIg292&fMDS{QPaZ4Zu`r^caw@Uv&) zp06Gx!}P|ak(Y2cs~i%%QyUlZg|@b zC@g+m^_8!dg>T)d8v^>pZILbTHc_NI<`|Dhe$9%=OtTihlX&5G#v<3Ur9;Wd)tT0rqdps zFI|o1wv~mOzKdU2p|Dqcsf=#I4>-^eVn9UZ_<@MVYouvP8mRSFEm82KiU}B+BjLuE zf}TXp#Gy}kwHC&u?VBJAnSRTWvBEG)4m#SVY!Rr3EKf637Naa?TqCKNt8+MdZrSvi zU)Bx7xJ!?GZ?ygHGPv=(W%%{KE%RT#vW)J)S2O4aPJ~Jxim#ixfp#8o`>v{-1A_`LBIRE7k>IoOO}BO~w`-D<)`OJ&qny`e*6! zV4b@*Tg+WM5dv!|6Z~*cs}T@|d^HOB(AwmT38Q=?u25h=pODiaObq#Lf!^k_?jwIt zHtfGjZ!900>&r^9u)}ZT3tg9gt;~P+>snRaf-=$ZMm*FZ%q%$z3Y>%rI_ZR_o5ucP z`Hb?0zHxr;5LwLO>90<;(mi&fA67oi5Z#Q@rC17to0P>Iq9GO#EW@-k+;U3U^r;Kh z#1@;LF9UGnbnVq;*QY*NhF9E*z+#2+ddUhCs${?kn*wI?GzPkJ<@_v`Kk8I-@-uHz zZY5+e4%i!@kYS$m*cu-4Qir8R2aNN&$e;*$&_Qpt3n%_!+4En%G!hVQKPJwjdu}ef zKK5VA{QvxW`P*!-h|M@345&zmdE$mCb3)-JSHRS&!l>V=H0xv;j(c?q4o`ngYLV#J zsb-9Uam}1KSsx7>Ck)wmTEeKP@6X3{ zq_$fvCos2N<|5ywl0g%jxu|ikU=gbm*_`9x4}GMu)#JUvOBXL>u(xN*(}mR24kYHW zaFfhl+aaeyg3Oy9@zP~ zp@3|rg+!ZM=Wn_3&=O}A(pzgiFb(&zZpzcCoM%rxW9VL7`rG2Mh!o|Ole22nJFKkx zt#_7JMWZnO+p_0l8-EE zEcttbm%O%l`#~PE*p_iZw(fXP+w)@l-bSs1niwSYaRv(F6!*6Kl$l?COWFA1qvcDh z{jq?}m7O0ruMED(hYNTiA#vM-yw*5E8C#hd8uQ>Bl4P84TC4ec!i2b=X8t#x0SiKy%9es zLJ<)gi@-B)cz8F}PUT)9KPo8NjIg*+Q-nH4G@U)o;gk?Q5grKEGR6E!)k zg}w!BwBAZsFc*{jx(mzVhYUOkqRLM>Z^fnHcWkFVx2${aGt2CehvO&USiO&W`+j-g z)VIRdSdH|T1!VEqbRz`R@z;eBLw5;%NQogy7z7_7oAI=}?087Uxm!T0 zto3V>q%G^`ZM$tsOEvDvM0&cXo24jxZptal#FZ_$`+eT=W#+`=%DSf?g1?1>UoK1O zBYPTt`U7R|Lsv)f;CTDMz*{ZKn2y!?p_k5u$Ge`_h3^etbhhi(<%6Q}rQVqk=rU!o ziY+{?fX!G_f}nH_ckS6xZl~QAw%ej|Twk6dOgokmL}B~SIUeuzjw|brJ`CS{-_TY0 z@btHTqijFp{mPT>T#2D@%$p|`<7Qhd{%%g~D5V%1VQ+Bi+3hv5TNraWBi4|xYgpGW zjFH`meQxtV1dp5ScPC-XvHL$Ga1UsR;dH!K;=sZ0%O<+o;f|!K1NK|H+HX z`ez^WFu%RQd&{?;TZUVsfZR^$t+v;UU;gmaiJyGS#qXTpwl9((J&Aj+ScwzUv6DIH zs)a$G(y;l*?>KYCz?@eY^~KGLM5QBa#7cLOT%ee_@jgtpV2FuH)4;epL`0OC!4lvY zzplu}t($im@^|Ysc&~R&*~RPf^G+)p&Ur=IaM-@$Tiw$}+>jkt23z?{G6al&w9nXd zqr(`uRMAL}i5(t9+>8kWXrAGhvG}M>L2?wi-N~i;sZ@*j|e0u5wS?Ntk zGx8Yv8VH<*{yykUf`xm}L6RXyG z2OcB;>zom19t%DvaVt!%kq^*$?gu4s=wa3YxoRNE#!rhR*EoUm;kCB-=Y&JK&! z^jq%0Fop>m+DS2P`HB$6tSoxvQ2c?SLss^FZnWb`;R`}s@PFNq>S>-&f9$^!13toV z)z{ia1qufl1RWu;L;3Jqvp-oEF1@7Od*D;c6JK#qQdR&qKB@Gc08{sJhl(Ono4pKw zxkBL=3T;1t0ta6>8;>hV(`85sn)r2%w4wa3R^jJ> zWp=O9e+n!i09jNZllgNI2?GZ|a2AsXr41d4p`thABplzf=>!u)=$D;~u~17r+Ge>m zuCze~yvP8Qi{?Z-EQI}Lk9bfsaVSdTD@Rg>T-Lrmfij8bwtV<9gt3J$YXYQbP2XDA>_eaI;v{=G`S{U)drJ2UB4fDQinb|2d}QLIZKr zBD#pXU)HTSg0lUG_(O+OL;Gyu2XiHyu*P%Tz7xg~xn*cPC~L?E@*>p4X^dgqyb?+| z(;|HGHLvyNTN#{vA-*S~pNk9W^fySFa!9!eG zG0tw{!!KX2A&^$q_IehcyzHN=G4(@Ztj4$=t4MHE*JeOo`{;+E{j_iD(>wA&7Z33# zj6a`(wy}iu9H~1Vr;H?O8)q+6-jXPVeJmMVZ)*H~P zm@vdBWPO0_`Va^EN0mLEzw*a+qg%ITZXz?xROAu{fqU!ZC~@bHZV-3V6Drc+ca3u# zg=~W`PN;)+h!f(F%7iuUaTOWkf)p9uR_3q0n@U!pJ+*B9*e^;qSD&5=!IoAaw9}>@ z31&Q6t=P*VNrc=)$;VGX0l~-rnAO+Wm;^Z)7z4)pzxw*J8aLj<|GiayIA_k6iUeCO zoQvqfa)fwfKI#-S`W?eU0bxp9-j73!5tI{Eqkbc8&3 zQ-<{3x$h`Xe9H+;;mX@R*O$Tdp++}su&vy{j+!Al-F$Q0G~&EjG7KEK7maUDs5oDK zPo?W6XD`NL_Hvd^9yC)gefDKqQ-{i_`P#DUt9OJ4t90(|_m9h-pZMdl>AkNA|4;fBIScF~E2VWB>Ucksd^-j3@B8N=AJAu21hJ&oArG zJf&ZwiaQ-gfa#JkImmt9yE?hOy3nDG{bs&uExqNd&llkcu8@eD01rJWJDAUJ8l z!BddMif4Z*(5XBfF<9)nK@*?GP@uCg5xSYNt_nc z!k0f)7PcV~@lSbSZjjW>5i+cNiyAZxM~`eV@d()_>QRmN1}DFszeQD>C{#zab^|)G zD1U5U6r*W9-2oogr#;I0OMka)*zaM=T7e)7$=<8T7IgQBJah9tUj9|aT_EIJofM~-tOnI=YuLQLr1UdC_CTwr&_Vp z^>}adAN_5_iX0+W%wd}g7S{P|A@ku}i=VO;t;XB&z$h7i9g>B$@`Nf>MbjinKI1YB zniU&*oG{+J22cNcpDy?R!RoyoVQ_1)jc&w$;roX_h{9wJ>YNzw=8riiZSjQy290C0 z6%!`{X!wWe!OF*>Sp%G~#y#GJQc^2UoX+r`)puz6d@ptOKJtOGz?hi{?0fOqXFz(*{IUjYE*yD@hg7?oU3leRGHuOV6FqAUbx_!Sp8_G#C@cdl z3{||np(?`IGWtFI**)?~1}+h@iAEPo8NB74W$wnEB0s)P_m`a)y<2a0l$ne<3W3P; ztwrRDnLzWMCDF{43rjiCNT)9GyL96;WS;}^GEO+Hbq#SvhS6B+G0Wo4Rx29D^+1@A zHaJ7!c)vea=Fj=HvhzlKNcXsDDB`={Ugp2b`y0gA#L5C9NEQM#;e<7w<4OhbY~ly5 zyn&xjrikkaRZalnY}#6*AbG2c%0yYiC~-T&k_#uS@pQ!dH5C)5tZ2y}KQBX&Fg{cM zU)lA#Hx`phI?Y8~9Wyc%dT;{*9BO=XwMB$hRO=Im&`pa1u_tPE2Ca)@FNia3+-<| zxPqXxQA7`1JE@x>ENO(?UX^5wdnvC*7Swn=(B}Fb9dJz9@ZNLrxa=uQ>VEVF@rQo@ z$H&Xuzy6vE6h(`Yb&J>(5Y8&EggCrR+T@zzQA>_T*&TIh1P3R)(OOz7)>CuJ877}j zg#qJ)OSNWVfQhV8K0xTGSFTPz>)`X)@RVnc`_2pNQrv+o0g!q)mGW-_Ge z5`)qaYfLs~Dn--GYU-MY48SF82n#G4Em^0wVi;zhI2+GIM`c6lzv#F!bJ9RsW8_X#2J@yya&6H@{oU@UO2bqpSZxwpkjb29P%|Y%GqvW)b0>ixs0{!Ho?h z={SYij1#JnPCRu2n1#c}8}^1b<*R!22FIh24^yk`$bubO=G{?me4m_XQD}%tV0Ww>PE%UP8b^3Y#$b7 z?_}P|!orFs1vJY|E4_h-%$ zC}Zv z2&s_rDm|3VVU3ZqaU6(JnS^i@6eT;<@(~{8HDQ1#@lu#+f-GqiNizEOgMv5&$j73v zNlTy;=XT7#$G6SxPopxmgkkd9uC35CX>ty@<2EE=x%j0seYBh*$u;g+8z_blMj>PN zN7r};OD)P^WGi#l>S2r#O^6#eqqFbAX*`M`fl5A#%dxomkq5G$(;NbP)2%yS>XR%K z0_P-%gn}u3kY9;64pWZ2e9xeka>)=kGNwUw`YV}~pk$C?(VZN#?Qwe;6r*!BJ^oN( zh3TK-2d-eKCSz^%!Plf=Yo%LDw6Woip$RdC2x8xbTk=%%Tg`l@l?z6UpwCI8yM zH15DuO>#zy*`0-8{2(*t^aed(BD55bY9dgdT0o@D!wo%hXuc#jfOE1N!`De0m`zcmzEOcgKraX4nu8k`ruX-%4gT=7$X7=$zFUp+IHzS)s_ z@f?tR-9j+~b>@r{qB%i^BzQZ*@Yq&Kb_|P_P^x)Kb*-%+_^637e~h*pNMWaCH)WBhn-W%%(9lPLg4juIVW4kvZ)d7fgv- zmvKYNS%&P!7n4tw4X_?V>Eq~QFaD)hq*frJY*rB?W{{5DcpW$su~_TMclf%)6ZX6O z5HJsij5q#v_?PQ)0$9gXeG?9X%e3W`bKJayQ(AY}zAP3`96k{`7{T?5PYEt~O)eHxy$-SO`civRxub|1M2j^qX7 P00000NkvXXu0mjfdd{}d literal 0 HcmV?d00001 diff --git a/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 3.png b/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 3.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d3aa4b845717b79725d4931e9dda2c71423fc2 GIT binary patch literal 12545 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 XJ?~lXJXy^a00000NkvXXu0mjfd(^27 literal 0 HcmV?d00001 diff --git a/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 4.png b/Example/SimpleAuth/Images.xcassets/AppIcon.appiconset/Artboard 4.png new file mode 100644 index 0000000000000000000000000000000000000000..b3dc5f4892fcab9fd3d424cad643c9afb7e71b60 GIT binary patch literal 24486 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 Date: Thu, 2 Oct 2014 17:37:08 -0700 Subject: [PATCH 098/139] Remove pod files from target. --- Example/SimpleAuth.xcodeproj/project.pbxproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Example/SimpleAuth.xcodeproj/project.pbxproj b/Example/SimpleAuth.xcodeproj/project.pbxproj index 27603ae..1024a3e 100644 --- a/Example/SimpleAuth.xcodeproj/project.pbxproj +++ b/Example/SimpleAuth.xcodeproj/project.pbxproj @@ -7,9 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 3B629D9A19DE1F2500BDF072 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9719DE1F2500BDF072 /* LICENSE */; }; - 3B629D9B19DE1F2500BDF072 /* Readme.markdown in Sources */ = {isa = PBXBuildFile; fileRef = 3B629D9819DE1F2500BDF072 /* Readme.markdown */; }; - 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */; }; 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */; }; 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9F19DE238100BDF072 /* Images.xcassets */; }; 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B658433188892FE00D59100 /* InfoPlist.strings */; }; @@ -169,9 +166,7 @@ files = ( 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */, 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */, - 3B629D9A19DE1F2500BDF072 /* LICENSE in Resources */, 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */, - 3B629D9C19DE1F2500BDF072 /* SimpleAuth.podspec in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -217,7 +212,6 @@ files = ( 3B6584581888931F00D59100 /* SADProviderListViewController.m in Sources */, 3B658437188892FE00D59100 /* main.m in Sources */, - 3B629D9B19DE1F2500BDF072 /* Readme.markdown in Sources */, 3B65843B188892FE00D59100 /* SADAppDelegate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 452e55e976578910c779f1c2f46e7b6e142ddf6b Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 01:02:05 -0300 Subject: [PATCH 099/139] Added Provider for login via Google OAuth --- .../SimpleAuthGoogleWebLoginViewController.h | 13 ++ .../SimpleAuthGoogleWebLoginViewController.m | 38 ++++ .../GoogleWeb/SimpleAuthGoogleWebProvider.h | 13 ++ .../GoogleWeb/SimpleAuthGoogleWebProvider.m | 194 ++++++++++++++++++ 4 files changed, 258 insertions(+) create mode 100644 Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.h create mode 100644 Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.m create mode 100644 Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.h create mode 100644 Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m diff --git a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.h b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.h new file mode 100644 index 0000000..ea0f037 --- /dev/null +++ b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthGoogleWebLoginViewController.h +// SimpleAuth +// +// Created by Ramon Vicente on 2/24/15. +// Copyright (c) 2015 UMOBI. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthGoogleWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.m b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.m new file mode 100644 index 0000000..146ad6c --- /dev/null +++ b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebLoginViewController.m @@ -0,0 +1,38 @@ +// +// SimpleAuthGoogleWebLoginViewController.m +// SimpleAuth +// +// Created by Ramon Vicente on 2/24/15. +// Copyright (c) 2015 UMOBI. All rights reserved. +// + +#import "SimpleAuthGoogleWebLoginViewController.h" + +@implementation SimpleAuthGoogleWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Google +"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"response_type" : @"code", + @"scope" : self.options[@"scope"] + }; + NSString *URLString = [NSString stringWithFormat: + @"https://accounts.google.com/o/oauth2/auth?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.h b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.h new file mode 100644 index 0000000..781d819 --- /dev/null +++ b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthGoogleWebProvider.h +// SimpleAuth +// +// Created by Ramon Vicente on 2/24/15. +// Copyright (c) 2015 UMOBI. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthGoogleWebProvider : SimpleAuthProvider + +@end diff --git a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m new file mode 100644 index 0000000..05b7376 --- /dev/null +++ b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m @@ -0,0 +1,194 @@ +// +// SimpleAuthGoogleWebProvider.m +// SimpleAuth +// +// Created by Ramon Vicente on 2/24/15. +// Copyright (c) 2015 UMOBI. All rights reserved. +// + +#import "SimpleAuthGoogleWebProvider.h" +#import "SimpleAuthGoogleWebLoginViewController.h" + +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthGoogleWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"google-web"; +} + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:controller]; + navigationController.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presentedViewController = [UIViewController SimpleAuth_presentedViewController]; + [presentedViewController presentViewController:navigationController + animated:YES + completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id viewController) { + [viewController dismissViewControllerAnimated:YES + completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return options; +} + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthGoogleWebLoginViewController *loginViewController = [[SimpleAuthGoogleWebLoginViewController alloc] initWithOptions:self.options]; + loginViewController.completion = ^(UIViewController *viewController, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(viewController); + + NSString *query = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; + NSString *code = dictionary[@"code"]; + if ([code length] > 0) { + [self userWithCode:code + completion:completion]; + } else { + completion(nil, error); + } + }; + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(loginViewController); + }); +} + +#pragma mark - Private +- (void)userWithCode:(NSString *)code completion:(SimpleAuthRequestHandler)completion +{ + NSDictionary *parameters = @{ @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri": self.options[@"redirect_uri"], + @"grant_type": @"authorization_code"}; + + NSString *data = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + + NSString *URLString = [NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/token"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]]; + [request setHTTPMethod:@"POST"]; + [request setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]]; + + [NSURLConnection sendAsynchronousRequest:request + queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data + options:kNilOptions + error:&parseError]; + NSString *token = dictionary[@"access_token"]; + if ([token length] > 0) { + + NSDictionary *credentials = @{ + @"access_token" : token, + @"expires" : [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expires_in"] doubleValue]], + @"token_type" : @"bearer", + @"id_token": dictionary[@"id_token"] + }; + + [self userWithCredentials:credentials + completion:completion]; + } else { + completion(nil, parseError); + } + + } else { + completion(nil, connectionError); + } + }]; +} + +- (void)userWithCredentials:(NSDictionary *)credentials completion:(SimpleAuthRequestHandler)completion { + + NSString *URLString = [NSString stringWithFormat:@"https://www.googleapis.com/userinfo/v2/me"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString]]; + + [request setValue:[NSString stringWithFormat:@"Bearer %@", credentials[@"access_token"]] forHTTPHeaderField:@"Authorization"]; + + [NSURLConnection sendAsynchronousRequest:request + queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError; + NSDictionary *userInfo = [NSJSONSerialization JSONObjectWithData:data + options:kNilOptions + error:&parseError]; + if (userInfo) { + completion ([self dictionaryWithAccount:userInfo credentials:credentials], nil); + } else { + completion(nil, parseError); + } + } else { + completion(nil, connectionError); + } + }]; +} + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account + credentials:(NSDictionary *)credentials +{ + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : credentials[@"access_token"], + @"expires_at" : credentials[@"expires"] + }; + + // User ID + dictionary[@"uid"] = account[@"id"]; + + // Raw response + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // Location + NSString *location = account[@"location"][@"name"]; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + if (account[@"email"]) { + user[@"email"] = account[@"email"]; + } + user[@"name"] = account[@"name"]; + user[@"first_name"] = account[@"given_name"]; + user[@"last_name"] = account[@"family_name"]; + user[@"gender"] = account[@"gender"]; + + user[@"image"] = account[@"picture"]; + if (location) { + user[@"location"] = location; + } + user[@"verified"] = account[@"verified_email"] ? @YES : @NO; + user[@"urls"] = @{ + @"Google +" : account[@"link"], + }; + + dictionary[@"info"] = user; + + return dictionary; +} + +@end From 2a6dbae712114952b23f963188652f4c7e8cbed1 Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 01:02:46 -0300 Subject: [PATCH 100/139] Added subspec GoogleWeb --- SimpleAuth.podspec | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 88b72fa..1dbb21a 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -90,4 +90,10 @@ Pod::Spec.new do |s| ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/SinaWeiboWeb/*.{h,m}' end + + s.subspec 'GoogleWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Pod/Providers/GoogleWeb/*.{h,m}' + end end From 23d969ecaa1c61c6574e0e868585efcdd4c65a07 Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 01:03:53 -0300 Subject: [PATCH 101/139] Added GoogleWeb Provider to example project --- Example/SimpleAuth/SADAppDelegate.m | 3 +++ Example/SimpleAuth/SADProviderListViewController.m | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index 240caa1..f8240ea 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -70,6 +70,9 @@ - (void)configureAuthorizaionProviders { // client_id and client_secret are required SimpleAuth.configuration[@"sinaweibo-web"] = @{}; + + // client_id and client_secret are required + SimpleAuth.configuration[@"google-web"] = @{}; } diff --git a/Example/SimpleAuth/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m index 1dd59e6..5efd29d 100644 --- a/Example/SimpleAuth/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -53,7 +53,8 @@ + (NSArray *)providers { @"foursquare-web", @"dropbox-web", @"linkedin-web", - @"sinaweibo-web" + @"sinaweibo-web", + @"google-web" ]; }); return array; From 0ae516bb7ba0185abd2fbf77bf76ab72a24bf562 Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 01:10:33 -0300 Subject: [PATCH 102/139] Fixed documentation links in Readme.markdown --- Readme.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Readme.markdown b/Readme.markdown index c048591..6b61006 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -11,8 +11,9 @@ SimpleAuth currently has the following providers: - [Dropbox](https://github.com/calebd/SimpleAuth/wiki/Dropbox) - [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) - [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) -- [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/Meetup) +- [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/LinkedIn) - [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) +- [Google](https://github.com/calebd/SimpleAuth/wiki/Google) ## Installing From 456259a7dd533d7f8a011d13ca69a345a85b258c Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 10:42:23 -0300 Subject: [PATCH 103/139] Updated Readme info --- Readme.markdown | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 6b61006..9bcf4e4 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -1,19 +1,19 @@ -# SimpleAuth +# SimpleAuth - iOS OAuth Interface SimpleAuth is designed to do the hard work of social account login on iOS. It has a small set of public APIs backed by a set of "providers" that implement the functionality needed to communicate with various social services. SimpleAuth currently has the following providers: -- [Twitter](https://github.com/calebd/SimpleAuth/wiki/Twitter) -- [Facebook](https://github.com/calebd/SimpleAuth/wiki/Facebook) -- [Instagram](https://github.com/calebd/SimpleAuth/wiki/Instagram) -- [Tumblr](https://github.com/calebd/SimpleAuth/wiki/Tumblr) -- [Dropbox](https://github.com/calebd/SimpleAuth/wiki/Dropbox) -- [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) -- [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) -- [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/LinkedIn) -- [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) -- [Google](https://github.com/calebd/SimpleAuth/wiki/Google) +- [Twitter](https://github.com/ramonvic/SimpleAuth/wiki/Twitter) +- [Facebook](https://github.com/ramonvic/SimpleAuth/wiki/Facebook) +- [Instagram](https://github.com/ramonvic/SimpleAuth/wiki/Instagram) +- [Tumblr](https://github.com/ramonvic/SimpleAuth/wiki/Tumblr) +- [Dropbox](https://github.com/ramonvic/SimpleAuth/wiki/Dropbox) +- [Foursquare](https://github.com/ramonvic/SimpleAuth/wiki/Foursquare) +- [Meetup](https://github.com/ramonvic/SimpleAuth/wiki/Meetup) +- [LinkedIn](https://github.com/ramonvic/SimpleAuth/wiki/LinkedIn) +- [Sina Weibo](https://github.com/ramonvic/SimpleAuth/wiki/SinaWeibo) +- [Google](https://github.com/ramonvic/SimpleAuth/wiki/Google) ## Installing @@ -95,3 +95,4 @@ Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising o - [mouhcine](https://github.com/mouhcine): Meetup provider - [iamabhiee](https://github.com/iamabhiee): LinkedIn provider - [aschuch](https://github.com/aschuch): Sina Weibo provider +- [ramonvic](https://github.com/ramonvic): Sina Weibo provider From 44da818b6ecddc3a92173b3e700b3512140978f9 Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Thu, 19 Mar 2015 12:26:22 -0300 Subject: [PATCH 104/139] Added some fields in userInfo response on Foursquare provier --- .../SimpleAuthFoursquareWebProvider.m | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m index 1ca91c7..090de65 100644 --- a/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m +++ b/Pod/Providers/FoursquareWeb/SimpleAuthFoursquareWebProvider.m @@ -134,28 +134,51 @@ - (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSS // Credentials dictionary[@"credentials"] = @{ - @"token" : accessToken - }; + @"token" : accessToken + }; // User ID dictionary[@"uid"] = userData[@"id"]; // Raw response dictionary[@"extra"] = @{ - @"raw_info" : userData - }; + @"raw_info" : userData + }; // User info NSMutableDictionary *user = [NSMutableDictionary new]; + if (userData[@"contact"][@"email"]) { + user[@"email"] = userData[@"contact"][@"email"]; + } + if (userData[@"firstName"]) { user[@"first_name"] = userData[@"firstName"]; } + if (userData[@"lastName"]) { user[@"last_name"] = userData[@"lastName"]; } + + user[@"name"] = [NSString stringWithFormat:@"%@ %@", user[@"first_name"], user[@"last_name"]]; + + user[@"gender"] = userData[@"gender"]; + + if ([userData[@"photo"] isKindOfClass:NSDictionary.class]) { + user[@"image"] = [NSString stringWithFormat:@"%@500x500%@", userData[@"photo"][@"prefix"], userData[@"photo"][@"suffix"]]; + } else if ([userData[@"photo"] isKindOfClass:NSString.class]) { + user[@"image"] = userData[@"photo"]; + } + if (userData[@"photo"]) { user[@"photo"] = userData[@"photo"]; } + if (userData[@"homeCity"]) { + NSString *homecity = [[userData[@"homeCity"] componentsSeparatedByString:@","] firstObject]; + user[@"location"] = homecity; + } + user[@"urls"] = @{ + @"Foursquare" : [NSString stringWithFormat:@"https://foursquare.com/user/%@", userData[@"id"]], + }; dictionary[@"info"] = user; return dictionary; From b20dad17ffb1924442ab0efc8ad0cb03895cb830 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 19:25:40 -0700 Subject: [PATCH 105/139] Update Pods. --- Example/Podfile.lock | 82 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 7cbe589..96ec973 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,69 +1,73 @@ PODS: - - CMDQueryStringSerialization (0.3.1): + - CMDQueryStringSerialization (0.3.2): - ISO8601 - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - - ISO8601 (0.1.1) + - ISO8601 (0.1.2) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.3.1): - - ReactiveCocoa/UI - - ReactiveCocoa/Core (2.3.1): + - ReactiveCocoa (2.4.7): + - ReactiveCocoa/UI (= 2.4.7) + - ReactiveCocoa/Core (2.4.7): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.3.1) - - ReactiveCocoa/UI (2.3.1): + - ReactiveCocoa/no-arc (2.4.7) + - ReactiveCocoa/UI (2.4.7): - ReactiveCocoa/Core - - SimpleAuth (0.3.5): - - SimpleAuth/Core - - SimpleAuth/DropboxWeb - - SimpleAuth/Facebook - - SimpleAuth/FacebookWeb - - SimpleAuth/FoursquareWeb - - SimpleAuth/Instagram - - SimpleAuth/LinkedInWeb - - SimpleAuth/Meetup - - SimpleAuth/SinaWeiboWeb - - SimpleAuth/Tumblr - - SimpleAuth/Twitter - - SimpleAuth/TwitterWeb - - SimpleAuth/UI - - SimpleAuth/Core (0.3.5): + - SimpleAuth (0.3.6): + - SimpleAuth/Core (= 0.3.6) + - SimpleAuth/DropboxWeb (= 0.3.6) + - SimpleAuth/Facebook (= 0.3.6) + - SimpleAuth/FacebookWeb (= 0.3.6) + - SimpleAuth/FoursquareWeb (= 0.3.6) + - SimpleAuth/GoogleWeb (= 0.3.6) + - SimpleAuth/Instagram (= 0.3.6) + - SimpleAuth/LinkedInWeb (= 0.3.6) + - SimpleAuth/Meetup (= 0.3.6) + - SimpleAuth/SinaWeiboWeb (= 0.3.6) + - SimpleAuth/Tumblr (= 0.3.6) + - SimpleAuth/Twitter (= 0.3.6) + - SimpleAuth/TwitterWeb (= 0.3.6) + - SimpleAuth/UI (= 0.3.6) + - SimpleAuth/Core (0.3.6): - CMDQueryStringSerialization - ReactiveCocoa - - SimpleAuth/DropboxWeb (0.3.5): + - SimpleAuth/DropboxWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Facebook (0.3.5): + - SimpleAuth/Facebook (0.3.6): - SimpleAuth/Core - - SimpleAuth/FacebookWeb (0.3.5): + - SimpleAuth/FacebookWeb (0.3.6): + - SimpleAuth/Core + - SimpleAuth/UI + - SimpleAuth/FoursquareWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/FoursquareWeb (0.3.5): + - SimpleAuth/GoogleWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Instagram (0.3.5): + - SimpleAuth/Instagram (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/LinkedInWeb (0.3.5): + - SimpleAuth/LinkedInWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Meetup (0.3.5): + - SimpleAuth/Meetup (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/SinaWeiboWeb (0.3.5): + - SimpleAuth/SinaWeiboWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Tumblr (0.3.5): + - SimpleAuth/Tumblr (0.3.6): - cocoa-oauth - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Twitter (0.3.5): + - SimpleAuth/Twitter (0.3.6): - cocoa-oauth - SimpleAuth/UI - - SimpleAuth/TwitterWeb (0.3.5): + - SimpleAuth/TwitterWeb (0.3.6): - cocoa-oauth - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/UI (0.3.5): + - SimpleAuth/UI (0.3.6): - SimpleAuth/Core DEPENDENCIES: @@ -74,11 +78,11 @@ EXTERNAL SOURCES: :path: ../ SPEC CHECKSUMS: - CMDQueryStringSerialization: 96f05d3225b6a0f6b7445a308c9e50bf84a5ba13 + CMDQueryStringSerialization: bc824b96c08a3277d00c71504e13c9fa18c6b451 cocoa-oauth: 418c70e6ce4130fa7ebdf05232018c8f391030d8 - ISO8601: a6afce5fbe854024802367c814fac4aa8d3586f9 + ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 - ReactiveCocoa: dca75777b9d18990c8714a3a6f2149f29b4d1462 - SimpleAuth: 918b62221b5faa06a178076b25647cf88d84c5e3 + ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f + SimpleAuth: 000689cdb6181551da6cff66a1cee7be67db2064 -COCOAPODS: 0.34.1 +COCOAPODS: 0.36.0 From e357920965cf0f5b963703e83010fe07e4cd6705 Mon Sep 17 00:00:00 2001 From: Mark Krenek Date: Sun, 17 Aug 2014 13:53:19 -0500 Subject: [PATCH 106/139] Add TripIt provider Implements a TripIt provider and login view controller. TripIt uses OAuth1.0. --- Example/SimpleAuth/SADAppDelegate.m | 4 + .../SADProviderListViewController.m | 3 +- .../SimpleAuthTripItLoginViewController.h | 13 + .../SimpleAuthTripItLoginViewController.m | 36 +++ Providers/TripIt/SimpleAuthTripItProvider.h | 13 + Providers/TripIt/SimpleAuthTripItProvider.m | 273 ++++++++++++++++++ 6 files changed, 341 insertions(+), 1 deletion(-) create mode 100755 Providers/TripIt/SimpleAuthTripItLoginViewController.h create mode 100755 Providers/TripIt/SimpleAuthTripItLoginViewController.m create mode 100755 Providers/TripIt/SimpleAuthTripItProvider.h create mode 100755 Providers/TripIt/SimpleAuthTripItProvider.m diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index f8240ea..492b564 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -73,6 +73,10 @@ - (void)configureAuthorizaionProviders { // client_id and client_secret are required SimpleAuth.configuration[@"google-web"] = @{}; + + // consumer_key and consumer_secret are required + SimpleAuth.configuration[@"tripit"] = @{}; + } diff --git a/Example/SimpleAuth/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m index 5efd29d..59324af 100644 --- a/Example/SimpleAuth/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -54,7 +54,8 @@ + (NSArray *)providers { @"dropbox-web", @"linkedin-web", @"sinaweibo-web", - @"google-web" + @"google-web", + @"tripit" ]; }); return array; diff --git a/Providers/TripIt/SimpleAuthTripItLoginViewController.h b/Providers/TripIt/SimpleAuthTripItLoginViewController.h new file mode 100755 index 0000000..87ca24b --- /dev/null +++ b/Providers/TripIt/SimpleAuthTripItLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthTripItLoginViewController.h +// SimpleAuth +// +// Created by Mark Krenek on 8/15/14. +// Copyright (c) 2014 Mark Krenek. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthTripItLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Providers/TripIt/SimpleAuthTripItLoginViewController.m b/Providers/TripIt/SimpleAuthTripItLoginViewController.m new file mode 100755 index 0000000..fe9772f --- /dev/null +++ b/Providers/TripIt/SimpleAuthTripItLoginViewController.m @@ -0,0 +1,36 @@ +// +// SimpleAuthTripItLoginViewController.m +// SimpleAuth +// +// Created by Mark Krenek on 8/15/14. +// Copyright (c) 2014 Mark Krenek. All rights reserved. +// + +#import "SimpleAuthTripItLoginViewController.h" + +@implementation SimpleAuthTripItLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"TripIt"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"oauth_token" : self.requestToken[@"oauth_token"], + @"oauth_callback" : self.options[SimpleAuthRedirectURIKey], + }; + NSString *URLString = [NSString stringWithFormat: + @"https://m.tripit.com/oauth/authorize?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Providers/TripIt/SimpleAuthTripItProvider.h b/Providers/TripIt/SimpleAuthTripItProvider.h new file mode 100755 index 0000000..699ce5a --- /dev/null +++ b/Providers/TripIt/SimpleAuthTripItProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthTripItProvider.h +// SimpleAuth +// +// Created by Mark Krenek on 8/15/14. +// Copyright (c) 2014 Mark Krenek. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthTripItProvider : SimpleAuthProvider + +@end diff --git a/Providers/TripIt/SimpleAuthTripItProvider.m b/Providers/TripIt/SimpleAuthTripItProvider.m new file mode 100755 index 0000000..b1650e8 --- /dev/null +++ b/Providers/TripIt/SimpleAuthTripItProvider.m @@ -0,0 +1,273 @@ +// +// SimpleAuthTripItProvider.m +// SimpleAuth +// +// Created by Mark Krenek on 8/15/14. +// Copyright (c) 2014 Mark Krenek. All rights reserved. +// + +#import "SimpleAuthTripItProvider.h" +#import "SimpleAuthTripItLoginViewController.h" + +#import "UIViewController+SimpleAuthAdditions.h" +#import +#import + +@implementation SimpleAuthTripItProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"tripit"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + dictionary[SimpleAuthRedirectURIKey] = @"simple-auth://tripit.auth"; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[[[self requestToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [RACSignal return:response], + [self authenticateWithRequestToken:response] + ]; + return [RACSignal zip:signals]; + }] + flattenMap:^(RACTuple *response) { + return [self accessTokenWithRequestToken:response.first authenticationResponse:response.second]; + }] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)requestToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"oauth_callback" : self.options[SimpleAuthRedirectURIKey] }; + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/oauth/request_token" + POSTParameters:parameters + scheme:@"https" + host:@"api.tripit.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:nil + tokenSecret:nil]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (RACSignal *)authenticateWithRequestToken:(NSDictionary *)requestToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthTripItLoginViewController *login = [[SimpleAuthTripItLoginViewController alloc] initWithOptions:self.options requestToken:requestToken]; + + login.completion = ^(UIViewController *controller, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler block = self.options[SimpleAuthDismissInterfaceBlockKey]; + block(controller); + + // Parse URL + NSString *query = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:query]; + NSString *token = dictionary[@"oauth_token"]; + + // Check for error + if (![token length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithRequestToken:(NSDictionary *)requestToken authenticationResponse:(NSDictionary *)authenticationResponse { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ }; + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/oauth/access_token" + POSTParameters:parameters + scheme:@"https" + host:@"api.tripit.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:authenticationResponse[@"oauth_token"] + tokenSecret:requestToken[@"oauth_token_secret"]]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:string]; + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary* parameters = @{ @"format" : @"json" }; + NSURLRequest *request = [GCOAuth + URLRequestForPath:@"/v1/get/profile" + GETParameters:parameters + scheme:@"https" + host:@"api.tripit.com" + consumerKey:self.options[@"consumer_key"] + consumerSecret:self.options[@"consumer_secret"] + accessToken:accessToken[@"oauth_token"] + tokenSecret:accessToken[@"oauth_token_secret"]]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // { + // "timestamp": "1408218794", + // "num_bytes": "6329", + // "Profile": { + // "@attributes": { + // "ref": "ABCDEFGHIJKL" + // }, + // "ProfileEmailAddresses": { + // "ProfileEmailAddress": { + // "address": "johndoe@example.com", + // "is_auto_import": "false", + // "is_confirmed": "true", + // "is_primary": "true", + // "is_auto_inbox_eligible": "false" + // } + // }, + // "NotificationSettings": {}, + // "is_client": "true", + // "is_pro": "false", + // "screen_name": "johndoe", + // "public_display_name": "John Joe", + // "profile_url": "people/johdoe", + // "alerts_feed_url": "https://www.tripit.com/feed/alerts/private/ABCDEFG/alerts.atom", + // "ical_url": "webcal://www.tripit.com/feed/ical/private/ABCDEFG/tripit.ics" + // } + // } + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"oauth_token"], + @"secret" : accessToken[@"oauth_token_secret"] + }; + + // User ID + [dictionary setValue:account[@"Profile"][@"@attributes"][@"ref"] // Yes, attributes is prefixed with an @ + forKey:@"uid"]; + + // Extra + dictionary[@"extra"] = @{ + @"raw_info" : account, + }; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + [user setValue:[account valueForKeyPath:@"Profile.screen_name"] + forKey:@"nickname"]; + + [user setValue:[account valueForKeyPath:@"Profile.public_display_name"] + forKey:@"name"]; + + [user setValue:[account valueForKeyPath:@"Profile.ProfileEmailAddresses.ProfileEmailAddress.address"] + forKey:@"email"]; + + dictionary[@"info"] = user; + + return dictionary; +} + +@end From 92136674ed78e9681b37850fe2aa67a68339d26a Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 20:07:01 -0700 Subject: [PATCH 107/139] Move TripIt provider into new directory structure. --- .../Providers}/TripIt/SimpleAuthTripItLoginViewController.h | 0 .../Providers}/TripIt/SimpleAuthTripItLoginViewController.m | 0 {Providers => Pod/Providers}/TripIt/SimpleAuthTripItProvider.h | 0 {Providers => Pod/Providers}/TripIt/SimpleAuthTripItProvider.m | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {Providers => Pod/Providers}/TripIt/SimpleAuthTripItLoginViewController.h (100%) rename {Providers => Pod/Providers}/TripIt/SimpleAuthTripItLoginViewController.m (100%) rename {Providers => Pod/Providers}/TripIt/SimpleAuthTripItProvider.h (100%) rename {Providers => Pod/Providers}/TripIt/SimpleAuthTripItProvider.m (100%) diff --git a/Providers/TripIt/SimpleAuthTripItLoginViewController.h b/Pod/Providers/TripIt/SimpleAuthTripItLoginViewController.h similarity index 100% rename from Providers/TripIt/SimpleAuthTripItLoginViewController.h rename to Pod/Providers/TripIt/SimpleAuthTripItLoginViewController.h diff --git a/Providers/TripIt/SimpleAuthTripItLoginViewController.m b/Pod/Providers/TripIt/SimpleAuthTripItLoginViewController.m similarity index 100% rename from Providers/TripIt/SimpleAuthTripItLoginViewController.m rename to Pod/Providers/TripIt/SimpleAuthTripItLoginViewController.m diff --git a/Providers/TripIt/SimpleAuthTripItProvider.h b/Pod/Providers/TripIt/SimpleAuthTripItProvider.h similarity index 100% rename from Providers/TripIt/SimpleAuthTripItProvider.h rename to Pod/Providers/TripIt/SimpleAuthTripItProvider.h diff --git a/Providers/TripIt/SimpleAuthTripItProvider.m b/Pod/Providers/TripIt/SimpleAuthTripItProvider.m similarity index 100% rename from Providers/TripIt/SimpleAuthTripItProvider.m rename to Pod/Providers/TripIt/SimpleAuthTripItProvider.m From 3d509a56238706675f2ed3b24cb20e76ed9f107a Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 20:08:26 -0700 Subject: [PATCH 108/139] Add TripIt subspec. --- Example/Podfile.lock | 7 ++++++- SimpleAuth.podspec | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 96ec973..f380e8a 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -23,6 +23,7 @@ PODS: - SimpleAuth/LinkedInWeb (= 0.3.6) - SimpleAuth/Meetup (= 0.3.6) - SimpleAuth/SinaWeiboWeb (= 0.3.6) + - SimpleAuth/TripIt (= 0.3.6) - SimpleAuth/Tumblr (= 0.3.6) - SimpleAuth/Twitter (= 0.3.6) - SimpleAuth/TwitterWeb (= 0.3.6) @@ -56,6 +57,10 @@ PODS: - SimpleAuth/SinaWeiboWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI + - SimpleAuth/TripIt (0.3.6): + - cocoa-oauth + - SimpleAuth/Core + - SimpleAuth/UI - SimpleAuth/Tumblr (0.3.6): - cocoa-oauth - SimpleAuth/Core @@ -83,6 +88,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: 000689cdb6181551da6cff66a1cee7be67db2064 + SimpleAuth: c1e9ac230d04910e1ef39ee0afb4cbceead1fe39 COCOAPODS: 0.36.0 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 1dbb21a..69a7dcd 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -96,4 +96,11 @@ Pod::Spec.new do |s| ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/GoogleWeb/*.{h,m}' end + + s.subspec 'TripIt' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.dependency 'cocoa-oauth' + ss.source_files = 'Pod/Providers/TripIt/*.{h,m}' + end end From 9923fe1150578b6010d0a57c96a96011f2f1a0ff Mon Sep 17 00:00:00 2001 From: damiano Date: Thu, 28 Aug 2014 12:02:41 +0200 Subject: [PATCH 109/139] Added Trello web login provider --- Example/Podfile.lock | 6 +- Example/SimpleAuth/SADAppDelegate.m | 3 + .../SADProviderListViewController.m | 3 +- .../SimpleAuthTrelloLoginViewController.h | 13 ++ .../SimpleAuthTrelloLoginViewController.m | 46 +++++ .../Trello/SimpleAuthTrelloProvider.h | 13 ++ .../Trello/SimpleAuthTrelloProvider.m | 161 ++++++++++++++++++ SimpleAuth.podspec | 6 + 8 files changed, 249 insertions(+), 2 deletions(-) create mode 100755 Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.h create mode 100755 Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.m create mode 100755 Pod/Providers/Trello/SimpleAuthTrelloProvider.h create mode 100755 Pod/Providers/Trello/SimpleAuthTrelloProvider.m diff --git a/Example/Podfile.lock b/Example/Podfile.lock index f380e8a..2cb45aa 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -23,6 +23,7 @@ PODS: - SimpleAuth/LinkedInWeb (= 0.3.6) - SimpleAuth/Meetup (= 0.3.6) - SimpleAuth/SinaWeiboWeb (= 0.3.6) + - SimpleAuth/Trello (= 0.3.6) - SimpleAuth/TripIt (= 0.3.6) - SimpleAuth/Tumblr (= 0.3.6) - SimpleAuth/Twitter (= 0.3.6) @@ -57,6 +58,9 @@ PODS: - SimpleAuth/SinaWeiboWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI + - SimpleAuth/Trello (0.3.6): + - SimpleAuth/Core + - SimpleAuth/UI - SimpleAuth/TripIt (0.3.6): - cocoa-oauth - SimpleAuth/Core @@ -88,6 +92,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: c1e9ac230d04910e1ef39ee0afb4cbceead1fe39 + SimpleAuth: 97d7775b8e86461dfbef964526cb1c8ed4f9dfe5 COCOAPODS: 0.36.0 diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index 492b564..1fde158 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -67,6 +67,9 @@ - (void)configureAuthorizaionProviders { // client_id, client_secret, and redirect_uri are required SimpleAuth.configuration[@"linkedin-web"] = @{}; + + // client_id, client_secret, and redirect_uri are required + SimpleAuth.configuration[@"trello-web"] = @{}; // client_id and client_secret are required SimpleAuth.configuration[@"sinaweibo-web"] = @{}; diff --git a/Example/SimpleAuth/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m index 59324af..8524b37 100644 --- a/Example/SimpleAuth/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -55,7 +55,8 @@ + (NSArray *)providers { @"linkedin-web", @"sinaweibo-web", @"google-web", - @"tripit" + @"tripit", + @"trello-web" ]; }); return array; diff --git a/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.h b/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.h new file mode 100755 index 0000000..7ddfe8d --- /dev/null +++ b/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthTrelloLoginViewController.h +// SimpleAuth +// +// Created by Damiano Buscemi on 22/08/14. +// Copyright (c) 2014 Crispy Bacon, S.r.l. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthTrelloLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.m b/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.m new file mode 100755 index 0000000..7c9a35a --- /dev/null +++ b/Pod/Providers/Trello/SimpleAuthTrelloLoginViewController.m @@ -0,0 +1,46 @@ +// +// SimpleAuthTrelloLoginViewController.m +// SimpleAuth +// +// Created by Damiano Buscemi on 22/08/14. +// Copyright (c) 2014 Crispy Bacon, S.r.l. All rights reserved. +// + +#import "SimpleAuthTrelloLoginViewController.h" + +@interface SimpleAuthTrelloLoginViewController () + +@end + +@implementation SimpleAuthTrelloLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Trello"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSMutableDictionary *parameters = [NSMutableDictionary new]; + parameters[@"key"] = self.options[@"key"]; + parameters[@"response_type"] = @"token"; + parameters[@"expiration"] = @"30days"; + parameters[@"callback_method"] = @"fragment"; + parameters[@"return_url"] = self.options[SimpleAuthRedirectURIKey]; + parameters[@"name"] = self.options[@"name"]; + if (self.options[@"scope"]) { + parameters[@"scope"] = [self.options[@"scope"] componentsJoinedByString:@" "]; + } + NSString *URLString = [NSString stringWithFormat: + @"https://trello.com/1/authorize/?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Pod/Providers/Trello/SimpleAuthTrelloProvider.h b/Pod/Providers/Trello/SimpleAuthTrelloProvider.h new file mode 100755 index 0000000..9839f14 --- /dev/null +++ b/Pod/Providers/Trello/SimpleAuthTrelloProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthTrelloProvider.h +// SimpleAuth +// +// Created by Damiano Buscemi on 22/08/14. +// Copyright (c) 2014 Crispy Bacon, S.r.l. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthTrelloProvider : SimpleAuthProvider + +@end diff --git a/Pod/Providers/Trello/SimpleAuthTrelloProvider.m b/Pod/Providers/Trello/SimpleAuthTrelloProvider.m new file mode 100755 index 0000000..ab896da --- /dev/null +++ b/Pod/Providers/Trello/SimpleAuthTrelloProvider.m @@ -0,0 +1,161 @@ +// +// SimpleAuthTrelloProvider.m +// SimpleAuth +// +// Created by Damiano Buscemi on 22/08/14. +// Copyright (c) 2014 Crispy Bacon, S.r.l. All rights reserved. +// + +#import "SimpleAuthTrelloProvider.h" +#import "SimpleAuthTrelloLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthTrelloProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"trello-web"; +} + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + options[SimpleAuthRedirectURIKey] = @"simple-auth://trello-web.auth"; + return options; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^RACStream *(NSString *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthTrelloLoginViewController *login = [[SimpleAuthTrelloLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL fragment]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *token = dictionary[@"token"]; + + // Check for error + if (![token length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:token]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSString *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"token" : accessToken , @"key" : self.options[@"key"] }; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSString *URLString = [NSString stringWithFormat:@"https://trello.com/1/members/me?%@", query]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +#pragma mark - Private + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSString *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + NSDictionary *data = account; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken + }; + + // User ID + dictionary[@"uid"] = data[@"id"]; + + // Extra + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"name"] = data[@"fullName"]; + user[@"username"] = data[@"username"]; + user[@"avatarHash"] = data[@"avatarHash"]; + dictionary[@"user_info"] = user; + + return dictionary; +} + +@end diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 69a7dcd..aec1473 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -103,4 +103,10 @@ Pod::Spec.new do |s| ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/TripIt/*.{h,m}' end + + s.subspec 'Trello' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Pod/Providers/Trello/*.{h,m}' + end end From 8a7b5c7e1d98034b6faef3ac44414f91ddaf648f Mon Sep 17 00:00:00 2001 From: Ben Stahl Date: Sun, 27 Jul 2014 16:20:50 -0400 Subject: [PATCH 110/139] Strava Integration --- Example/Podfile.lock | 6 +- Example/SimpleAuth/SADAppDelegate.m | 3 + .../SADProviderListViewController.m | 1 + .../SimpleAuthStravaWebLoginViewController.h | 13 ++ .../SimpleAuthStravaWebLoginViewController.m | 40 ++++ .../Strava/SimpleAuthStravaWebProvider.h | 13 ++ .../Strava/SimpleAuthStravaWebProvider.m | 212 ++++++++++++++++++ SimpleAuth.podspec | 6 + 8 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.h create mode 100644 Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.m create mode 100644 Pod/Providers/Strava/SimpleAuthStravaWebProvider.h create mode 100644 Pod/Providers/Strava/SimpleAuthStravaWebProvider.m diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 2cb45aa..4126333 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -23,6 +23,7 @@ PODS: - SimpleAuth/LinkedInWeb (= 0.3.6) - SimpleAuth/Meetup (= 0.3.6) - SimpleAuth/SinaWeiboWeb (= 0.3.6) + - SimpleAuth/Strava (= 0.3.6) - SimpleAuth/Trello (= 0.3.6) - SimpleAuth/TripIt (= 0.3.6) - SimpleAuth/Tumblr (= 0.3.6) @@ -58,6 +59,9 @@ PODS: - SimpleAuth/SinaWeiboWeb (0.3.6): - SimpleAuth/Core - SimpleAuth/UI + - SimpleAuth/Strava (0.3.6): + - SimpleAuth/Core + - SimpleAuth/UI - SimpleAuth/Trello (0.3.6): - SimpleAuth/Core - SimpleAuth/UI @@ -92,6 +96,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: 97d7775b8e86461dfbef964526cb1c8ed4f9dfe5 + SimpleAuth: 34af3b32d7cdbd22b53844e47c8255b4a8c79db6 COCOAPODS: 0.36.0 diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index 1fde158..147edd1 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -76,6 +76,9 @@ - (void)configureAuthorizaionProviders { // client_id and client_secret are required SimpleAuth.configuration[@"google-web"] = @{}; + + // client_id, client_secret and redirect_uri are required + SimpleAuth.configuration[@"strava-web"] = @{}; // consumer_key and consumer_secret are required SimpleAuth.configuration[@"tripit"] = @{}; diff --git a/Example/SimpleAuth/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m index 8524b37..99422ad 100644 --- a/Example/SimpleAuth/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -55,6 +55,7 @@ + (NSArray *)providers { @"linkedin-web", @"sinaweibo-web", @"google-web", + @"strava-web", @"tripit", @"trello-web" ]; diff --git a/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.h b/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.h new file mode 100644 index 0000000..457b563 --- /dev/null +++ b/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthStravaWebLoginViewController.h +// SimpleAuth +// +// Created by Ben Stahl on 7/27/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthStravaWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.m b/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.m new file mode 100644 index 0000000..f02ed12 --- /dev/null +++ b/Pod/Providers/Strava/SimpleAuthStravaWebLoginViewController.m @@ -0,0 +1,40 @@ +// +// SimpleAuthStravaWebLoginViewController.m +// SimpleAuth +// +// Created by Ben Stahl on 7/27/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthStravaWebLoginViewController.h" + +@implementation SimpleAuthStravaWebLoginViewController + + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Strava"; + } + return self; +} + +- (NSURLRequest *)initialRequest { + + NSMutableDictionary *parameters = [NSMutableDictionary new]; + parameters[@"client_id"] = self.options[@"client_id"]; + parameters[@"redirect_uri"] = self.options[SimpleAuthRedirectURIKey]; + parameters[@"response_type"] = @"code"; + if (self.options[@"scope"]) { + parameters[@"scope"] = [self.options[@"scope"] componentsJoinedByString:@" "]; + } + NSString *URLString = [NSString stringWithFormat: + @"https://www.strava.com/oauth/authorize?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Pod/Providers/Strava/SimpleAuthStravaWebProvider.h b/Pod/Providers/Strava/SimpleAuthStravaWebProvider.h new file mode 100644 index 0000000..5eb70bb --- /dev/null +++ b/Pod/Providers/Strava/SimpleAuthStravaWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthStravaWebProvider.h +// SimpleAuth +// +// Created by Ben Stahl on 7/27/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthStravaWebProvider : SimpleAuthProvider + +@end diff --git a/Pod/Providers/Strava/SimpleAuthStravaWebProvider.m b/Pod/Providers/Strava/SimpleAuthStravaWebProvider.m new file mode 100644 index 0000000..0026c06 --- /dev/null +++ b/Pod/Providers/Strava/SimpleAuthStravaWebProvider.m @@ -0,0 +1,212 @@ +// +// SimpleAuthStravaWebProvider.m +// SimpleAuth +// +// Created by Ben Stahl on 7/27/14. +// Copyright (c) 2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthStravaWebProvider.h" +#import "SimpleAuthStravaWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthStravaWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"strava-web"; +} + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + options[SimpleAuthRedirectURIKey] = @"http://"; + + return options; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(id responseObject) { + NSArray *signals = @[ + [self accountWithAccessToken:responseObject], + [RACSignal return:responseObject] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(id responseObject) { + completion(responseObject, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + +#pragma mark - Private + +- (RACSignal *)authorizationCode { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthStravaWebLoginViewController *login = [[SimpleAuthStravaWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *code = dictionary[@"code"]; + + // Check for error + if (![code length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:code]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + + // Build request + NSDictionary *parameters = @{ + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + }; + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSURL *URL = [NSURL URLWithString:@"https://www.strava.com/oauth/token"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + request.HTTPMethod = @"POST"; + request.HTTPBody = [query dataUsingEncoding:NSUTF8StringEncoding]; + + // Run request + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + + return nil; + }]; +} + + +- (RACSignal *)accessToken { + return [[self authorizationCode] flattenMap:^(id responseObject) { + return [self accessTokenWithAuthorizationCode:responseObject]; + }]; +} + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ + @"access_token" : accessToken[@"access_token"], + }; + NSString *URLString = [NSString stringWithFormat:@"https://www.strava.com/api/v3/athlete?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{@"token" : accessToken[@"access_token"]}; + + // User ID + dictionary[@"uid"] = account[@"id"]; + + // Raw response + dictionary[@"raw_info"] = account; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"email"] = account[@"email"]; + if (user[@"firstName"]) { + user[@"first_name"] = user[@"firstname"]; + } + if (user[@"lastName"]) { + user[@"last_name"] = user[@"lastname"]; + } + user[@"gender"] = account[@"sex"]; + user[@"image"] = account[@"profile"]; + user[@"location"] = account[@"city"]; + dictionary[@"info"] = user; + + return dictionary; +} + + +@end diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index aec1473..523a009 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -109,4 +109,10 @@ Pod::Spec.new do |s| ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Trello/*.{h,m}' end + + s.subspec 'Strava' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Pod/Providers/Strava/*.{h,m}' + end end From f3b670f699c2b2d891fc5164b905fde35c7a04dd Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 20:35:47 -0700 Subject: [PATCH 111/139] Bump version: 0.3.7 --- Example/Podfile.lock | 72 ++++++++++++++++++++++---------------------- SimpleAuth.podspec | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 4126333..3043f77 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -12,75 +12,75 @@ PODS: - ReactiveCocoa/no-arc (2.4.7) - ReactiveCocoa/UI (2.4.7): - ReactiveCocoa/Core - - SimpleAuth (0.3.6): - - SimpleAuth/Core (= 0.3.6) - - SimpleAuth/DropboxWeb (= 0.3.6) - - SimpleAuth/Facebook (= 0.3.6) - - SimpleAuth/FacebookWeb (= 0.3.6) - - SimpleAuth/FoursquareWeb (= 0.3.6) - - SimpleAuth/GoogleWeb (= 0.3.6) - - SimpleAuth/Instagram (= 0.3.6) - - SimpleAuth/LinkedInWeb (= 0.3.6) - - SimpleAuth/Meetup (= 0.3.6) - - SimpleAuth/SinaWeiboWeb (= 0.3.6) - - SimpleAuth/Strava (= 0.3.6) - - SimpleAuth/Trello (= 0.3.6) - - SimpleAuth/TripIt (= 0.3.6) - - SimpleAuth/Tumblr (= 0.3.6) - - SimpleAuth/Twitter (= 0.3.6) - - SimpleAuth/TwitterWeb (= 0.3.6) - - SimpleAuth/UI (= 0.3.6) - - SimpleAuth/Core (0.3.6): + - SimpleAuth (0.3.7): + - SimpleAuth/Core (= 0.3.7) + - SimpleAuth/DropboxWeb (= 0.3.7) + - SimpleAuth/Facebook (= 0.3.7) + - SimpleAuth/FacebookWeb (= 0.3.7) + - SimpleAuth/FoursquareWeb (= 0.3.7) + - SimpleAuth/GoogleWeb (= 0.3.7) + - SimpleAuth/Instagram (= 0.3.7) + - SimpleAuth/LinkedInWeb (= 0.3.7) + - SimpleAuth/Meetup (= 0.3.7) + - SimpleAuth/SinaWeiboWeb (= 0.3.7) + - SimpleAuth/Strava (= 0.3.7) + - SimpleAuth/Trello (= 0.3.7) + - SimpleAuth/TripIt (= 0.3.7) + - SimpleAuth/Tumblr (= 0.3.7) + - SimpleAuth/Twitter (= 0.3.7) + - SimpleAuth/TwitterWeb (= 0.3.7) + - SimpleAuth/UI (= 0.3.7) + - SimpleAuth/Core (0.3.7): - CMDQueryStringSerialization - ReactiveCocoa - - SimpleAuth/DropboxWeb (0.3.6): + - SimpleAuth/DropboxWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Facebook (0.3.6): + - SimpleAuth/Facebook (0.3.7): - SimpleAuth/Core - - SimpleAuth/FacebookWeb (0.3.6): + - SimpleAuth/FacebookWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/FoursquareWeb (0.3.6): + - SimpleAuth/FoursquareWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/GoogleWeb (0.3.6): + - SimpleAuth/GoogleWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Instagram (0.3.6): + - SimpleAuth/Instagram (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/LinkedInWeb (0.3.6): + - SimpleAuth/LinkedInWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Meetup (0.3.6): + - SimpleAuth/Meetup (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/SinaWeiboWeb (0.3.6): + - SimpleAuth/SinaWeiboWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Strava (0.3.6): + - SimpleAuth/Strava (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Trello (0.3.6): + - SimpleAuth/Trello (0.3.7): - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/TripIt (0.3.6): + - SimpleAuth/TripIt (0.3.7): - cocoa-oauth - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Tumblr (0.3.6): + - SimpleAuth/Tumblr (0.3.7): - cocoa-oauth - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/Twitter (0.3.6): + - SimpleAuth/Twitter (0.3.7): - cocoa-oauth - SimpleAuth/UI - - SimpleAuth/TwitterWeb (0.3.6): + - SimpleAuth/TwitterWeb (0.3.7): - cocoa-oauth - SimpleAuth/Core - SimpleAuth/UI - - SimpleAuth/UI (0.3.6): + - SimpleAuth/UI (0.3.7): - SimpleAuth/Core DEPENDENCIES: @@ -96,6 +96,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: 34af3b32d7cdbd22b53844e47c8255b4a8c79db6 + SimpleAuth: 23cdf21db48f1aa342a84f82bd9c43eb5220344a COCOAPODS: 0.36.0 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 523a009..9483148 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.6' + s.version = '0.3.7' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From b2c99dd82d8354204efe9a759600b6894664265f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 20:58:31 -0700 Subject: [PATCH 112/139] Update readme. --- Readme.markdown | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 6b61006..3e73b47 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -30,26 +30,26 @@ to your `Podfile`. Configuring and using SimpleAuth is easy: -````objc +````swift // Somewhere in your app boot process -SimpleAuth.configuration[@"twitter"] = @{ - @"consumer_key" : @"KEY", - @"consumer_secret" : @"SECRET" -}; +SimpleAuth.configuration()["twitter"] = [ + "consumer_key": "KEY", + "consumer_secret": "SECRET" +] ```` -````objc +````swift // Authorize -- (void)loginWithTwitter { - [SimpleAuth authorize:@"twitter" completion:^(id responseObject, NSError *error) { - NSLog(@"%@", responseObject); - }]; +func loginWithTwitter() { + SimpleAuth.authorize("twitter", completion: { responseObject, error in + println("Twitter login response: \(responseObject)") + }) } ```` ## Implementing a Provider -The API for creating providers is pretty simple. Be sure to look at `SimpleAuthProvider` and `SimpleAuthWebLoginViewController`. These classes will help you simplify your authentiction process. Providers should be stored in `Providers/` and have an appropriately named folder and sub spec. All providers are automatically registered with the framework. There are a handful of methods you'll need to implement: +The API for creating providers is pretty simple. Be sure to look at `SimpleAuthProvider` and `SimpleAuthWebLoginViewController`. These classes will help you simplify your authentiction process. Providers should be stored in `Pod/Providers/` and have an appropriately named folder and sub spec. All providers are automatically registered with the framework. There are a handful of methods you'll need to implement: Let SimpleAuth know what type of provider you are registering: From 8b3465c92ad94d09bdfe932377c59c32a4da53bd Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 5 Oct 2014 12:39:39 -0700 Subject: [PATCH 113/139] Use Twitter force_login parameter. --- .../TwitterWeb/SimpleAuthTwitterWebLoginViewController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m index dbbbc06..bf258bf 100644 --- a/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m +++ b/Pod/Providers/TwitterWeb/SimpleAuthTwitterWebLoginViewController.m @@ -23,6 +23,7 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona - (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"oauth_token" : self.requestToken[@"oauth_token"], + @"force_login": @"true" }; NSString *URLString = [NSString stringWithFormat: @"https://api.twitter.com/oauth/authenticate?%@", From 80e02efe1f6a4cb319d22c249c296d0b49fd0b90 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 5 Oct 2014 13:12:11 -0700 Subject: [PATCH 114/139] Remove some unused files. --- Pod/Core/SimpleAuth.h | 3 --- Pod/Core/SimpleAuthTwitterUtilities.h | 13 ------------- Pod/Core/SimpleAuthTwitterUtilities.m | 13 ------------- 3 files changed, 29 deletions(-) delete mode 100644 Pod/Core/SimpleAuthTwitterUtilities.h delete mode 100644 Pod/Core/SimpleAuthTwitterUtilities.m diff --git a/Pod/Core/SimpleAuth.h b/Pod/Core/SimpleAuth.h index 8d60b76..678add4 100644 --- a/Pod/Core/SimpleAuth.h +++ b/Pod/Core/SimpleAuth.h @@ -72,9 +72,6 @@ typedef void (^SimpleAuthInterfaceHandler) (id userInterfaceElement); */ extern NSString * const SimpleAuthRedirectURIKey; -extern NSString * const SimpleAuthBeginActivityBlockKey; -extern NSString * const SimpleAuthEndActivityBlockKey; - @interface SimpleAuth : NSObject /** diff --git a/Pod/Core/SimpleAuthTwitterUtilities.h b/Pod/Core/SimpleAuthTwitterUtilities.h deleted file mode 100644 index ed13c13..0000000 --- a/Pod/Core/SimpleAuthTwitterUtilities.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// SimpleAuthTwitterUtilities.h -// SimpleAuth -// -// Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. -// - -#import - -@interface SimpleAuthTwitterUtilities : NSObject - -@end diff --git a/Pod/Core/SimpleAuthTwitterUtilities.m b/Pod/Core/SimpleAuthTwitterUtilities.m deleted file mode 100644 index f021a4d..0000000 --- a/Pod/Core/SimpleAuthTwitterUtilities.m +++ /dev/null @@ -1,13 +0,0 @@ -// -// SimpleAuthTwitterUtilities.m -// SimpleAuth -// -// Created by Caleb Davenport on 1/16/14. -// Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. -// - -#import "SimpleAuthTwitterUtilities.h" - -@implementation SimpleAuthTwitterUtilities - -@end From 9563c338db73f0cb0aa21eaeecf07cdf214b358d Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Thu, 2 Oct 2014 18:52:38 -0700 Subject: [PATCH 115/139] Update example project podfile. --- Example/Podfile | 2 +- Example/Podfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index a38d6fc..8482d15 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,3 +1,3 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '6.0' -pod 'SimpleAuth', :path => '../' +pod 'SimpleAuth', :path => '..' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 3043f77..a6625b4 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -84,11 +84,11 @@ PODS: - SimpleAuth/Core DEPENDENCIES: - - SimpleAuth (from `../`) + - SimpleAuth (from `..`) EXTERNAL SOURCES: SimpleAuth: - :path: ../ + :path: .. SPEC CHECKSUMS: CMDQueryStringSerialization: bc824b96c08a3277d00c71504e13c9fa18c6b451 From ed0b920570d1dbc05423f9a4c33b7159e8fb5d5e Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 21:16:17 -0700 Subject: [PATCH 116/139] Simplify pod structure and podspec. --- Example/Podfile.lock | 2 +- .../ios/SimpleAuthWebViewController.h | 0 .../ios/SimpleAuthWebViewController.m | 0 .../UIViewController+SimpleAuthAdditions.h | 0 .../UIViewController+SimpleAuthAdditions.m | 0 .../ios/UIWindow+SimpleAuthAdditions.h | 0 .../ios/UIWindow+SimpleAuthAdditions.m | 0 SimpleAuth.podspec | 35 ++++++++++--------- 8 files changed, 20 insertions(+), 17 deletions(-) rename Pod/{UI => Core}/ios/SimpleAuthWebViewController.h (100%) rename Pod/{UI => Core}/ios/SimpleAuthWebViewController.m (100%) rename Pod/{UI => Core}/ios/UIViewController+SimpleAuthAdditions.h (100%) rename Pod/{UI => Core}/ios/UIViewController+SimpleAuthAdditions.m (100%) rename Pod/{UI => Core}/ios/UIWindow+SimpleAuthAdditions.h (100%) rename Pod/{UI => Core}/ios/UIWindow+SimpleAuthAdditions.m (100%) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index a6625b4..65f17b2 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -96,6 +96,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: 23cdf21db48f1aa342a84f82bd9c43eb5220344a + SimpleAuth: bc37f44feff9eaab779d919807ca986ebf19d6a6 COCOAPODS: 0.36.0 diff --git a/Pod/UI/ios/SimpleAuthWebViewController.h b/Pod/Core/ios/SimpleAuthWebViewController.h similarity index 100% rename from Pod/UI/ios/SimpleAuthWebViewController.h rename to Pod/Core/ios/SimpleAuthWebViewController.h diff --git a/Pod/UI/ios/SimpleAuthWebViewController.m b/Pod/Core/ios/SimpleAuthWebViewController.m similarity index 100% rename from Pod/UI/ios/SimpleAuthWebViewController.m rename to Pod/Core/ios/SimpleAuthWebViewController.m diff --git a/Pod/UI/ios/UIViewController+SimpleAuthAdditions.h b/Pod/Core/ios/UIViewController+SimpleAuthAdditions.h similarity index 100% rename from Pod/UI/ios/UIViewController+SimpleAuthAdditions.h rename to Pod/Core/ios/UIViewController+SimpleAuthAdditions.h diff --git a/Pod/UI/ios/UIViewController+SimpleAuthAdditions.m b/Pod/Core/ios/UIViewController+SimpleAuthAdditions.m similarity index 100% rename from Pod/UI/ios/UIViewController+SimpleAuthAdditions.m rename to Pod/Core/ios/UIViewController+SimpleAuthAdditions.m diff --git a/Pod/UI/ios/UIWindow+SimpleAuthAdditions.h b/Pod/Core/ios/UIWindow+SimpleAuthAdditions.h similarity index 100% rename from Pod/UI/ios/UIWindow+SimpleAuthAdditions.h rename to Pod/Core/ios/UIWindow+SimpleAuthAdditions.h diff --git a/Pod/UI/ios/UIWindow+SimpleAuthAdditions.m b/Pod/Core/ios/UIWindow+SimpleAuthAdditions.m similarity index 100% rename from Pod/UI/ios/UIWindow+SimpleAuthAdditions.m rename to Pod/Core/ios/UIWindow+SimpleAuthAdditions.m diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 9483148..85d14cb 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -10,10 +10,13 @@ Pod::Spec.new do |s| s.platform = :ios, '6.0' s.subspec 'Core' do |ss| - ss.source_files = 'Pod/Core/*.{h,m}' + ss.source_files = 'Pod/Core' ss.public_header_files = 'Pod/Core/SimpleAuth.h' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' + + ss.ios.frameworks = 'UIKit' + ss.ios.source_files = 'Pod/Core/ios' end s.subspec 'UI' do |ss| @@ -26,93 +29,93 @@ Pod::Spec.new do |s| ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' ss.frameworks = 'Accounts', 'Social' - ss.source_files = 'Pod/Providers/Twitter/*.{h,m}' + ss.source_files = 'Pod/Providers/Twitter' end s.subspec 'Facebook' do |ss| ss.dependency 'SimpleAuth/Core' ss.frameworks = 'Accounts', 'Social' - ss.source_files = 'Pod/Providers/Facebook/*.{h,m}' + ss.source_files = 'Pod/Providers/Facebook' end s.subspec 'FacebookWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/FacebookWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/FacebookWeb' end s.subspec 'Instagram' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/Instagram/*.{h,m}' + ss.source_files = 'Pod/Providers/Instagram' end s.subspec 'TwitterWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' - ss.source_files = 'Pod/Providers/TwitterWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/TwitterWeb' end s.subspec 'Meetup' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/Meetup/*.{h,m}' + ss.source_files = 'Pod/Providers/Meetup' end s.subspec 'Tumblr' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' - ss.source_files = 'Pod/Providers/Tumblr/*.{h,m}' + ss.source_files = 'Pod/Providers/Tumblr' end s.subspec 'FoursquareWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/FoursquareWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/FoursquareWeb' end s.subspec 'DropboxWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/DropboxWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/DropboxWeb' end s.subspec 'LinkedInWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/LinkedIn/*.{h,m}' + ss.source_files = 'Pod/Providers/LinkedIn' end s.subspec 'SinaWeiboWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/SinaWeiboWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/SinaWeiboWeb' end s.subspec 'GoogleWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/GoogleWeb/*.{h,m}' + ss.source_files = 'Pod/Providers/GoogleWeb' end s.subspec 'TripIt' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' - ss.source_files = 'Pod/Providers/TripIt/*.{h,m}' + ss.source_files = 'Pod/Providers/TripIt' end s.subspec 'Trello' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/Trello/*.{h,m}' + ss.source_files = 'Pod/Providers/Trello' end s.subspec 'Strava' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/Strava/*.{h,m}' + ss.source_files = 'Pod/Providers/Strava' end end From 17a6ec454c70b85144183b9a858c203f00c7f1f9 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 7 Oct 2014 17:34:03 -0700 Subject: [PATCH 117/139] Add resource bundle with localized strings. --- Example/Podfile.lock | 2 +- Pod/Core/SimpleAuth.m | 2 -- Pod/Core/SimpleAuthUtilities.h | 11 +++++++++++ Pod/Core/SimpleAuthUtilities.m | 16 ++++++++++++++++ .../Twitter/SimpleAuthTwitterProvider.m | 3 ++- Pod/Resources/en.lproj/SimpleAuth.strings | 10 ++++++++++ SimpleAuth.podspec | 1 + 7 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 Pod/Core/SimpleAuthUtilities.h create mode 100644 Pod/Core/SimpleAuthUtilities.m create mode 100644 Pod/Resources/en.lproj/SimpleAuth.strings diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 65f17b2..cd441bd 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -96,6 +96,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: bc37f44feff9eaab779d919807ca986ebf19d6a6 + SimpleAuth: a2c5373a438d8c2ca841470862853626b2d0abae COCOAPODS: 0.36.0 diff --git a/Pod/Core/SimpleAuth.m b/Pod/Core/SimpleAuth.m index afbde62..6d5966f 100644 --- a/Pod/Core/SimpleAuth.m +++ b/Pod/Core/SimpleAuth.m @@ -7,10 +7,8 @@ // #import "SimpleAuth.h" - #import "SimpleAuthProvider.h" #import "SimpleAuthSingleSignOnProvider.h" - #import "NSObject+SimpleAuthAdditions.h" #import diff --git a/Pod/Core/SimpleAuthUtilities.h b/Pod/Core/SimpleAuthUtilities.h new file mode 100644 index 0000000..7338b25 --- /dev/null +++ b/Pod/Core/SimpleAuthUtilities.h @@ -0,0 +1,11 @@ +// +// SimpleAuthUtilities.h +// SimpleAuth +// +// Created by Caleb Davenport on 10/7/14. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. +// + +@import Foundation; + +NSString *SimpleAuthLocalizedString(NSString *key); diff --git a/Pod/Core/SimpleAuthUtilities.m b/Pod/Core/SimpleAuthUtilities.m new file mode 100644 index 0000000..5cce5f5 --- /dev/null +++ b/Pod/Core/SimpleAuthUtilities.m @@ -0,0 +1,16 @@ +// +// SimpleAuthUtilities.m +// SimpleAuth +// +// Created by Caleb Davenport on 10/7/14. +// Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. +// + +#import "SimpleAuthUtilities.h" +#import "SimpleAuth.h" + +NSString *SimpleAuthLocalizedString(NSString *key) { + NSURL *URL = [[NSBundle mainBundle] URLForResource:@"SimpleAuth" withExtension:@"bundle"]; + NSBundle *bundle = [NSBundle bundleWithURL:URL]; + return [bundle localizedStringForKey:key value:nil table:@"SimpleAuth"]; +} diff --git a/Pod/Providers/Twitter/SimpleAuthTwitterProvider.m b/Pod/Providers/Twitter/SimpleAuthTwitterProvider.m index 9c4ce7d..e640480 100644 --- a/Pod/Providers/Twitter/SimpleAuthTwitterProvider.m +++ b/Pod/Providers/Twitter/SimpleAuthTwitterProvider.m @@ -10,6 +10,7 @@ #import "UIWindow+SimpleAuthAdditions.h" #import "ACAccountStore+SimpleAuth.h" +#import "SimpleAuthUtilities.h" #import #import @@ -85,7 +86,7 @@ - (RACSignal *)systemAccountFromAccounts:(NSArray *)accounts { [sheet addButtonWithTitle:title]; } sheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent; - sheet.cancelButtonIndex = [sheet addButtonWithTitle:NSLocalizedString(@"GENERAL_CANCEL", nil)]; + sheet.cancelButtonIndex = [sheet addButtonWithTitle:SimpleAuthLocalizedString(@"CANCEL")]; SEL s = @selector(actionSheet:clickedButtonAtIndex:); Protocol *p = @protocol(UIActionSheetDelegate); diff --git a/Pod/Resources/en.lproj/SimpleAuth.strings b/Pod/Resources/en.lproj/SimpleAuth.strings new file mode 100644 index 0000000..0c3b7e6 --- /dev/null +++ b/Pod/Resources/en.lproj/SimpleAuth.strings @@ -0,0 +1,10 @@ +/* + SimpleAuth.strings + SimpleAuth + + Created by Caleb Davenport on 10/7/14. + Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. +*/ + +// General strings +"CANCEL" = "Cancel"; diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 85d14cb..6f04449 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -17,6 +17,7 @@ Pod::Spec.new do |s| ss.ios.frameworks = 'UIKit' ss.ios.source_files = 'Pod/Core/ios' + ss.ios.resource_bundle = { 'SimpleAuth' => [ 'Pod/Resources/*.lproj' ] } end s.subspec 'UI' do |ss| From 494464238119bbd1010337322189f49b5494688f Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Wed, 25 Mar 2015 21:36:30 -0700 Subject: [PATCH 118/139] Remove unused import. --- Pod/Core/SimpleAuthUtilities.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Pod/Core/SimpleAuthUtilities.m b/Pod/Core/SimpleAuthUtilities.m index 5cce5f5..0e6a01b 100644 --- a/Pod/Core/SimpleAuthUtilities.m +++ b/Pod/Core/SimpleAuthUtilities.m @@ -7,7 +7,6 @@ // #import "SimpleAuthUtilities.h" -#import "SimpleAuth.h" NSString *SimpleAuthLocalizedString(NSString *key) { NSURL *URL = [[NSBundle mainBundle] URLForResource:@"SimpleAuth" withExtension:@"bundle"]; From bd0510b13218188f30fdc05b1ce63e44d3cb0ff7 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 30 Nov 2014 21:37:42 -0500 Subject: [PATCH 119/139] Move stuff from library header into defines file. --- Example/Podfile.lock | 2 +- Pod/Core/ACAccountStore+SimpleAuth.m | 2 +- Pod/Core/SimpleAuth.h | 67 +-------------------- Pod/Core/SimpleAuth.m | 8 --- Pod/Core/SimpleAuthDefines.h | 87 ++++++++++++++++++++++++++++ Pod/Core/SimpleAuthDefines.m | 15 +++++ SimpleAuth.podspec | 2 +- 7 files changed, 107 insertions(+), 76 deletions(-) create mode 100644 Pod/Core/SimpleAuthDefines.h create mode 100644 Pod/Core/SimpleAuthDefines.m diff --git a/Example/Podfile.lock b/Example/Podfile.lock index cd441bd..87d863e 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -96,6 +96,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: a2c5373a438d8c2ca841470862853626b2d0abae + SimpleAuth: b5c07f4e34d1e2a7fc68090a0ea578215f9c25d4 COCOAPODS: 0.36.0 diff --git a/Pod/Core/ACAccountStore+SimpleAuth.m b/Pod/Core/ACAccountStore+SimpleAuth.m index dc7e3f6..1a242fd 100644 --- a/Pod/Core/ACAccountStore+SimpleAuth.m +++ b/Pod/Core/ACAccountStore+SimpleAuth.m @@ -6,8 +6,8 @@ // Copyright (c) 2014 Seesaw Decisions Corporation. All rights reserved. // -#import "SimpleAuth.h" #import "ACAccountStore+SimpleAuth.h" +#import "SimpleAuthDefines.h" #import @implementation ACAccountStore (SimpleAuth) diff --git a/Pod/Core/SimpleAuth.h b/Pod/Core/SimpleAuth.h index 678add4..38edcea 100644 --- a/Pod/Core/SimpleAuth.h +++ b/Pod/Core/SimpleAuth.h @@ -6,71 +6,8 @@ // Copyright (c) 2013-2014 Byliner, Inc. All rights reserved. // -extern NSString * const SimpleAuthErrorDomain; -extern NSString * const SimpleAuthErrorStatusCodeKey; -typedef NS_ENUM(NSUInteger, SimpleAuthError) { - - /** - The user cancelled authentication. - */ - SimpleAuthErrorUserCancelled, - - /* - An error that occurred as the result of a failed network operation. - */ - SimpleAuthErrorNetwork, - - /** - An error that originated in Accounts.framework. - */ - SimpleAuthErrorAccounts, - - /** - Returned if SimpleAuth was able to parse response data. - */ - SimpleAuthErrorInvalidData -}; - -/** - Called when authorization either completes with a response or fails with an - error. Should an error occur, response object will be nil. - - @param responseObject The authorization response, or nil if an error occurred. - @param error An error. - - @see +authorize:completion: - @see +authorize:options:completion: - */ -typedef void (^SimpleAuthRequestHandler) (id responseObject, NSError *error); - -extern NSString * const SimpleAuthPresentInterfaceBlockKey; -extern NSString * const SimpleAuthDismissInterfaceBlockKey; - -/** - Called when a user interface element must be presented to continue - authorization. This could be a UIViewController for web login, or a - UIActionSheet for system login. All providers will have default - implementations for the appropriate callback types. You can customize provider - behavior by providing your own blocks. This will be called on the main - thread. - - @see SimpleAuthPresentInterfaceBlockKey - @see SimpleAuthDismissInterfaceBlockKey - @see +configuration - @see +authorize:options:completion: - - @param userInterfaceElement An element that is about to be presented or - dismissed. - */ -typedef void (^SimpleAuthInterfaceHandler) (id userInterfaceElement); - -/** - Key used to define the redirect URI for OAuth style providers. - - @see +configuration - @see +authorize:options:completion: - */ -extern NSString * const SimpleAuthRedirectURIKey; +@import Foundation; +#import "SimpleAuthDefines.h" @interface SimpleAuth : NSObject diff --git a/Pod/Core/SimpleAuth.m b/Pod/Core/SimpleAuth.m index 6d5966f..3037b4f 100644 --- a/Pod/Core/SimpleAuth.m +++ b/Pod/Core/SimpleAuth.m @@ -11,14 +11,6 @@ #import "SimpleAuthSingleSignOnProvider.h" #import "NSObject+SimpleAuthAdditions.h" -#import - -NSString * const SimpleAuthErrorDomain = @"SimpleAuthErrorDomain"; -NSString * const SimpleAuthPresentInterfaceBlockKey = @"present_interface_block"; -NSString * const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; -NSString * const SimpleAuthRedirectURIKey = @"redirect_uri"; -NSString * const SimpleAuthErrorStatusCodeKey = @"SimpleAuthErrorStatusCode"; - static SimpleAuthProvider *__currentProvider = nil; @implementation SimpleAuth diff --git a/Pod/Core/SimpleAuthDefines.h b/Pod/Core/SimpleAuthDefines.h new file mode 100644 index 0000000..c67383c --- /dev/null +++ b/Pod/Core/SimpleAuthDefines.h @@ -0,0 +1,87 @@ +// +// SimpleAuthDefines.h +// SimpleAuth +// +// Created by Caleb Davenport on 11/30/14. +// Copyright (c) 2013-2015 Caleb Davenport. All rights reserved. +// + +@import Foundation; + +/** + Authentication error domain. + */ +extern NSString *const SimpleAuthErrorDomain; + +/** + The corresponding value is an HTTP staus code if the error was a network + related error. + */ +extern NSString *const SimpleAuthErrorStatusCodeKey; + +/** + Error codes for errors in the `SimpleAuthErrorDomain`. + */ +typedef NS_ENUM(NSUInteger, SimpleAuthError) { + + /** + The user cancelled authentication. + */ + SimpleAuthErrorUserCancelled = 100, + + /* + An error that occurred as the result of a failed network operation. + */ + SimpleAuthErrorNetwork, + + /** + An error that originated in Accounts.framework. + */ + SimpleAuthErrorAccounts, + + /** + Returned if SimpleAuth was able to parse response data. + */ + SimpleAuthErrorInvalidData +}; + +/** + Called when authorization either completes with a response or fails with an + error. Should an error occur, response object will be nil. + + @param responseObject The authorization response, or nil if an error occurred. + @param error An error. + + @see +authorize:completion: + @see +authorize:options:completion: + */ +typedef void (^SimpleAuthRequestHandler) (id responseObject, NSError *error); + +extern NSString *const SimpleAuthPresentInterfaceBlockKey; +extern NSString *const SimpleAuthDismissInterfaceBlockKey; + +/** + Called when a user interface element must be presented to continue + authorization. This could be a UIViewController for web login, or a + UIActionSheet for system login. All providers will have default + implementations for the appropriate callback types. You can customize provider + behavior by providing your own blocks. This will be called on the main + thread. + + @see SimpleAuthPresentInterfaceBlockKey + @see SimpleAuthDismissInterfaceBlockKey + @see +configuration + @see +authorize:options:completion: + + @param userInterfaceElement An element that is about to be presented or + dismissed. + */ +typedef void (^SimpleAuthInterfaceHandler) (id userInterfaceElement); + +/** + Key used to define the redirect URI for OAuth style providers. + + @see +configuration + @see +authorize:options:completion: + */ +extern NSString *const SimpleAuthRedirectURIKey; diff --git a/Pod/Core/SimpleAuthDefines.m b/Pod/Core/SimpleAuthDefines.m new file mode 100644 index 0000000..321868e --- /dev/null +++ b/Pod/Core/SimpleAuthDefines.m @@ -0,0 +1,15 @@ +// +// SimpleAuthDefines.m +// SimpleAuth +// +// Created by Caleb Davenport on 11/30/14. +// Copyright (c) 2013-2015 Caleb Davenport. All rights reserved. +// + +#import "SimpleAuthDefines.h" + +NSString *const SimpleAuthErrorDomain = @"SimpleAuthErrorDomain"; +NSString *const SimpleAuthErrorStatusCodeKey = @"SimpleAuthErrorStatusCode"; +NSString *const SimpleAuthPresentInterfaceBlockKey = @"present_interface_block"; +NSString *const SimpleAuthDismissInterfaceBlockKey = @"dismiss_interface_block"; +NSString *const SimpleAuthRedirectURIKey = @"redirect_uri"; diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 6f04449..c2d61b5 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.subspec 'Core' do |ss| ss.source_files = 'Pod/Core' - ss.public_header_files = 'Pod/Core/SimpleAuth.h' + ss.public_header_files = 'Pod/Core/SimpleAuth.h', 'Pod/Core/SimpleAuthDefines.h' ss.dependency 'ReactiveCocoa' ss.dependency 'CMDQueryStringSerialization' From c6b951c1744650ec00ce1bc14f556fa4f1001598 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Sun, 5 Oct 2014 12:48:30 -0700 Subject: [PATCH 120/139] Move demo app provider list into a plist. --- Example/SimpleAuth.xcodeproj/project.pbxproj | 4 ++++ Example/SimpleAuth/Providers.plist | 21 +++++++++++++++++++ .../SADProviderListViewController.m | 21 ++----------------- 3 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 Example/SimpleAuth/Providers.plist diff --git a/Example/SimpleAuth.xcodeproj/project.pbxproj b/Example/SimpleAuth.xcodeproj/project.pbxproj index 1024a3e..d8cb11a 100644 --- a/Example/SimpleAuth.xcodeproj/project.pbxproj +++ b/Example/SimpleAuth.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3B491B8819E1D7CF0073EBEE /* Providers.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B491B8719E1D7CF0073EBEE /* Providers.plist */; }; 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */; }; 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3B629D9F19DE238100BDF072 /* Images.xcassets */; }; 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3B658433188892FE00D59100 /* InfoPlist.strings */; }; @@ -19,6 +20,7 @@ /* Begin PBXFileReference section */ 0A3609D93D7B90B3BBADBC21 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 0D4998CFA03844FB99EE78AA /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B491B8719E1D7CF0073EBEE /* Providers.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Providers.plist; sourceTree = ""; }; 3B629D9719DE1F2500BDF072 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 3B629D9819DE1F2500BDF072 /* Readme.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = Readme.markdown; path = ../Readme.markdown; sourceTree = ""; }; 3B629D9919DE1F2500BDF072 /* SimpleAuth.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SimpleAuth.podspec; path = ../SimpleAuth.podspec; sourceTree = ""; }; @@ -71,6 +73,7 @@ 3B658438188892FE00D59100 /* Prefix.pch */, 3B629D9D19DE1F6E00BDF072 /* LaunchScreen.xib */, 3B629D9F19DE238100BDF072 /* Images.xcassets */, + 3B491B8719E1D7CF0073EBEE /* Providers.plist */, ); path = SimpleAuth; sourceTree = ""; @@ -167,6 +170,7 @@ 3B629D9E19DE1F6E00BDF072 /* LaunchScreen.xib in Resources */, 3B629DA019DE238100BDF072 /* Images.xcassets in Resources */, 3B658435188892FE00D59100 /* InfoPlist.strings in Resources */, + 3B491B8819E1D7CF0073EBEE /* Providers.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Example/SimpleAuth/Providers.plist b/Example/SimpleAuth/Providers.plist new file mode 100644 index 0000000..e91c087 --- /dev/null +++ b/Example/SimpleAuth/Providers.plist @@ -0,0 +1,21 @@ + + + + + twitter + twitter-web + facebook + facebook-web + instagram + dropbox-web + tumblr + foursquare-web + meetup + linkedin-web + sinaweibo-web + google-web + strava-web + tripit + trello-web + + diff --git a/Example/SimpleAuth/SADProviderListViewController.m b/Example/SimpleAuth/SADProviderListViewController.m index 99422ad..eaebd01 100644 --- a/Example/SimpleAuth/SADProviderListViewController.m +++ b/Example/SimpleAuth/SADProviderListViewController.m @@ -42,23 +42,8 @@ + (NSArray *)providers { static dispatch_once_t token; static NSArray *array; dispatch_once(&token, ^{ - array = @[ - @"twitter", - @"twitter-web", - @"facebook", - @"facebook-web", - @"instagram", - @"meetup", - @"tumblr", - @"foursquare-web", - @"dropbox-web", - @"linkedin-web", - @"sinaweibo-web", - @"google-web", - @"strava-web", - @"tripit", - @"trello-web" - ]; + NSURL *URL = [[NSBundle mainBundle] URLForResource:@"Providers" withExtension:@"plist"]; + array = [NSArray arrayWithContentsOfURL:URL]; }); return array; } @@ -70,12 +55,10 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [[[self class] providers] count]; } - - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; cell.textLabel.text = [[self class] providers][indexPath.row]; From ea87624b02e0487e655080b629b1cb6be4d26bf0 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 4 Nov 2014 09:36:42 -0800 Subject: [PATCH 121/139] Clean up Facebook provider. --- .../Facebook/SimpleAuthFacebookProvider.m | 110 +++++++++--------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m index 224731d..d8914a9 100644 --- a/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -7,10 +7,8 @@ // #import "SimpleAuthFacebookProvider.h" - #import "ACAccountStore+SimpleAuth.h" #import - @import Social; @implementation SimpleAuthFacebookProvider @@ -21,7 +19,6 @@ + (NSString *)type { return @"facebook"; } - + (NSDictionary *)defaultOptions { return @{ @"permissions" : @[ @"email" ], @@ -29,22 +26,22 @@ + (NSDictionary *)defaultOptions { }; } - - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - [[[self systemAccount] - flattenMap:^RACStream *(ACAccount *account) { - NSArray *signals = @[ - [self remoteAccountWithSystemAccount:account], - [RACSignal return:account] - ]; - return [self rac_liftSelector:@selector(dictionaryWithRemoteAccount:systemAccount:) withSignalsFromArray:signals]; - }] - subscribeNext:^(NSDictionary *response) { - completion(response, nil); - } - error:^(NSError *error) { - completion(nil, error); - }]; + [[[[self systemAccount] + flattenMap:^RACStream *(ACAccount *account) { + NSArray *signals = @[ + [RACSignal return:account], + [self remoteAccountWithSystemAccount:account] + ]; + return [self rac_liftSelector:@selector(responseDictionaryWithRemoteAccount:systemAccount:) withSignalsFromArray:signals]; + }] + deliverOn:[RACScheduler mainThreadScheduler]] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; } @@ -59,14 +56,12 @@ - (RACSignal *)allSystemAccounts { return [ACAccountStore SimpleAuth_accountsWithTypeIdentifier:ACAccountTypeIdentifierFacebook options:options]; } - - (RACSignal *)systemAccount { return [[self allSystemAccounts] map:^(NSArray *accounts) { return [accounts lastObject]; }]; } - - (RACSignal *)remoteAccountWithSystemAccount:(ACAccount *)account { return [RACSignal createSignal:^RACDisposable *(id subscriber) { NSURL *URL = [NSURL URLWithString:@"https://graph.facebook.com/me"]; @@ -105,50 +100,53 @@ - (RACSignal *)remoteAccountWithSystemAccount:(ACAccount *)account { }]; } +- (NSDictionary *)responseDictionaryWithRemoteAccount:(NSDictionary *)remoteAccount systemAccount:(ACAccount *)systemAccount { + return @{ + @"provider": [[self class] type], + @"credentials": [self credentialsDictionaryWithRemoteAccount:remoteAccount systemAccount:systemAccount], + @"uid": remoteAccount[@"id"], + @"extra": [self extraDictionaryWithRemoteAccount:remoteAccount systemAccount:systemAccount], + @"info": [self infoDictionaryWithRemoteAccount:remoteAccount systemAccount:systemAccount] + }; +} -- (NSDictionary *)dictionaryWithRemoteAccount:(NSDictionary *)remoteAccount systemAccount:(ACAccount *)systemAccount { - NSMutableDictionary *dictionary = [NSMutableDictionary new]; - - // Provider - dictionary[@"provider"] = [[self class] type]; - - // Credentials - dictionary[@"credentials"] = @{ - @"token" : systemAccount.credential.oauthToken +- (NSDictionary *)credentialsDictionaryWithRemoteAccount:(NSDictionary *)remoteAccount systemAccount:(ACAccount *)systemAccount { + return @{ + @"token": systemAccount.credential.oauthToken }; - - // User ID - dictionary[@"uid"] = remoteAccount[@"id"]; - - // Raw response - dictionary[@"extra"] = @{ - @"raw_info" : remoteAccount, - @"account" : systemAccount +} + +- (NSDictionary *)extraDictionaryWithRemoteAccount:(NSDictionary *)remoteAccount systemAccount:(ACAccount *)systemAccount { + return @{ + @"raw_info": remoteAccount, + @"account": systemAccount }; +} + +- (NSDictionary *)infoDictionaryWithRemoteAccount:(NSDictionary *)remoteAccount systemAccount:(ACAccount *)systemAccount { + NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; + + dictionary[@"name"] = remoteAccount[@"name"]; + dictionary[@"first_name"] = remoteAccount[@"first_name"]; + dictionary[@"last_name"] = remoteAccount[@"last_name"]; + dictionary[@"verified"] = remoteAccount[@"verified"] ?: @NO; - // Profile image - NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", remoteAccount[@"id"]]; - - // Location - NSString *location = remoteAccount[@"location"][@"name"]; - - // User info - NSMutableDictionary *user = [NSMutableDictionary new]; - if (remoteAccount[@"email"]) { - user[@"email"] = remoteAccount[@"email"]; + id email = remoteAccount[@"email"]; + if (email) { + dictionary[@"email"] = email; } - user[@"name"] = remoteAccount[@"name"]; - user[@"first_name"] = remoteAccount[@"first_name"]; - user[@"last_name"] = remoteAccount[@"last_name"]; - user[@"image"] = avatar; + + id location = remoteAccount[@"location"][@"name"]; if (location) { - user[@"location"] = location; + dictionary[@"location"] = location; } - user[@"verified"] = remoteAccount[@"verified"] ?: @NO; - user[@"urls"] = @{ - @"Facebook" : remoteAccount[@"link"], + + dictionary[@"urls"] = @{ + @"Facebook": remoteAccount[@"link"] }; - dictionary[@"info"] = user; + + NSString *avatar = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", remoteAccount[@"id"]]; + dictionary[@"image"] = avatar; return dictionary; } From 9cafca1ca2ac261e313354134eb7f15f2b12f6cd Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Fri, 27 Mar 2015 02:20:03 -0300 Subject: [PATCH 122/139] Added Default Options to Google Provider. --- Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m index 05b7376..3bf070d 100644 --- a/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m +++ b/Pod/Providers/GoogleWeb/SimpleAuthGoogleWebProvider.m @@ -40,6 +40,8 @@ + (NSDictionary *)defaultOptions { NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; options[SimpleAuthPresentInterfaceBlockKey] = presentBlock; options[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + options[SimpleAuthRedirectURIKey] = @"http://localhost"; + options[@"scope"] = @"email openid profile"; return options; } From 5696cd440a2047fd04612c5c20f97f19d3efd576 Mon Sep 17 00:00:00 2001 From: Ramon Vicente Date: Fri, 27 Mar 2015 02:28:58 -0300 Subject: [PATCH 123/139] Rollback local changes on Readme --- Readme.markdown | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Readme.markdown b/Readme.markdown index 9bcf4e4..6b61006 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -1,19 +1,19 @@ -# SimpleAuth - iOS OAuth Interface +# SimpleAuth SimpleAuth is designed to do the hard work of social account login on iOS. It has a small set of public APIs backed by a set of "providers" that implement the functionality needed to communicate with various social services. SimpleAuth currently has the following providers: -- [Twitter](https://github.com/ramonvic/SimpleAuth/wiki/Twitter) -- [Facebook](https://github.com/ramonvic/SimpleAuth/wiki/Facebook) -- [Instagram](https://github.com/ramonvic/SimpleAuth/wiki/Instagram) -- [Tumblr](https://github.com/ramonvic/SimpleAuth/wiki/Tumblr) -- [Dropbox](https://github.com/ramonvic/SimpleAuth/wiki/Dropbox) -- [Foursquare](https://github.com/ramonvic/SimpleAuth/wiki/Foursquare) -- [Meetup](https://github.com/ramonvic/SimpleAuth/wiki/Meetup) -- [LinkedIn](https://github.com/ramonvic/SimpleAuth/wiki/LinkedIn) -- [Sina Weibo](https://github.com/ramonvic/SimpleAuth/wiki/SinaWeibo) -- [Google](https://github.com/ramonvic/SimpleAuth/wiki/Google) +- [Twitter](https://github.com/calebd/SimpleAuth/wiki/Twitter) +- [Facebook](https://github.com/calebd/SimpleAuth/wiki/Facebook) +- [Instagram](https://github.com/calebd/SimpleAuth/wiki/Instagram) +- [Tumblr](https://github.com/calebd/SimpleAuth/wiki/Tumblr) +- [Dropbox](https://github.com/calebd/SimpleAuth/wiki/Dropbox) +- [Foursquare](https://github.com/calebd/SimpleAuth/wiki/Foursquare) +- [Meetup](https://github.com/calebd/SimpleAuth/wiki/Meetup) +- [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/LinkedIn) +- [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) +- [Google](https://github.com/calebd/SimpleAuth/wiki/Google) ## Installing @@ -95,4 +95,3 @@ Special thanks to my friend [@soffes](https://twitter.com/soffes) for advising o - [mouhcine](https://github.com/mouhcine): Meetup provider - [iamabhiee](https://github.com/iamabhiee): LinkedIn provider - [aschuch](https://github.com/aschuch): Sina Weibo provider -- [ramonvic](https://github.com/ramonvic): Sina Weibo provider From cddda851b1725101851be7bc7bdcf940c32805c2 Mon Sep 17 00:00:00 2001 From: dkhamsing Date: Thu, 26 Mar 2015 10:51:54 -0700 Subject: [PATCH 124/139] Box --- Example/SimpleAuth/SADAppDelegate.m | 3 + .../SimpleAuthBoxWebLoginViewController.h | 13 + .../SimpleAuthBoxWebLoginViewController.m | 37 +++ .../BoxWeb/SimpleAuthBoxWebProvider.h | 13 + .../BoxWeb/SimpleAuthBoxWebProvider.m | 226 ++++++++++++++++++ Readme.markdown | 1 + SimpleAuth.podspec | 7 + 7 files changed, 300 insertions(+) create mode 100755 Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.h create mode 100755 Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m create mode 100755 Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.h create mode 100755 Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index 147edd1..ba3eaea 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -83,6 +83,9 @@ - (void)configureAuthorizaionProviders { // consumer_key and consumer_secret are required SimpleAuth.configuration[@"tripit"] = @{}; + // client_id, client_secret, redirect_uri are required + SimpleAuth.configuration[@"box-web"] = @{}; + } diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.h b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.h new file mode 100755 index 0000000..34c8dd6 --- /dev/null +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthBoxWebLoginViewController.h +// SimpleAuth +// +// Created by dkhamsing on 3/26/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthBoxWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m new file mode 100755 index 0000000..b5b72e4 --- /dev/null +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m @@ -0,0 +1,37 @@ +// +// SimpleAuthBoxWebLoginViewController.m +// SimpleAuth +// +// Created by dkhamsing on 3/26/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthBoxWebLoginViewController.h" + +@implementation SimpleAuthBoxWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"Box"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"redirect_uri" : [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]], + @"response_type" : @"code" + }; + NSString *URLString = [NSString stringWithFormat: + @"https://api.box.com/oauth2/authorize?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + +@end diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.h b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.h new file mode 100755 index 0000000..6b8062d --- /dev/null +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthBoxWebProvider.h +// SimpleAuth +// +// Created by dkhamsing on 3/26/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthBoxWebProvider : SimpleAuthProvider + +@end diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m new file mode 100755 index 0000000..825003f --- /dev/null +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m @@ -0,0 +1,226 @@ +// +// SimpleAuthBoxWebProvider.m +// SimpleAuth +// +// Created by dkhamsing on 3/26/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthBoxWebProvider.h" +#import "SimpleAuthBoxWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthBoxWebProvider + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"box-web"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)authorizationCode { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + +//// self.options[SimpleAuthRedirectURIKey] = +//// +//// [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]]; +// +// +// NSMutableDictionary *options = self.options.mutableCopy; +// options[SimpleAuthRedirectURIKey] = +// +// [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]]; +// + SimpleAuthBoxWebLoginViewController *login = [[SimpleAuthBoxWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *code = dictionary[@"code"]; + + // Check for error + if (![code length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:code]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + + // Build request + NSDictionary *parameters = @{ + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : self.options[@"redirect_uri"], + @"grant_type" : @"authorization_code" + }; + + NSLog(@"params = %@", parameters); + + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSURL *URL = [NSURL URLWithString:@"https://api.box.com/oauth2/token"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + [request setHTTPMethod:@"POST"]; + [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]]; + + // Run request + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + + return nil; + }]; +} + + +- (RACSignal *)accessToken { + return [[self authorizationCode] flattenMap:^(id responseObject) { + return [self accessTokenWithAuthorizationCode:responseObject]; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"access_token" : accessToken[@"access_token"] }; + NSString *URLString = [NSString stringWithFormat: + @"https://api.box.com/2.0/users/me?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"access_token"], + @"type" : accessToken[@"token_type"], + @"expires_in": accessToken[@"expires_in"], + @"refresh_token": accessToken[@"refresh_token"], + }; + + // User ID + dictionary[@"id"] = account[@"id"]; + + // Raw response + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"login"] = account[@"login"]; + user[@"name"] = account[@"name"]; + dictionary[@"info"] = user; + + return dictionary; +} + +@end diff --git a/Readme.markdown b/Readme.markdown index 3e73b47..1fea6b6 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -14,6 +14,7 @@ SimpleAuth currently has the following providers: - [LinkedIn](https://github.com/calebd/SimpleAuth/wiki/LinkedIn) - [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) - [Google](https://github.com/calebd/SimpleAuth/wiki/Google) +- [Box](https://github.com/calebd/SimpleAuth/wiki/Box) ## Installing diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index c2d61b5..f943607 100644 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -119,4 +119,11 @@ Pod::Spec.new do |s| ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Strava' end + +s.subspec 'BoxWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Pod/Providers/BoxWeb' +end + end From 8eaacc604d666d8f6960ed4cbb3579ba7794f515 Mon Sep 17 00:00:00 2001 From: dkhamsing Date: Thu, 26 Mar 2015 22:27:57 -0700 Subject: [PATCH 125/139] Provider sets redirect URI --- Example/SimpleAuth/SADAppDelegate.m | 2 +- .../SimpleAuthBoxWebLoginViewController.m | 4 +++- Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m | 17 +++-------------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index ba3eaea..5dadf2b 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -83,7 +83,7 @@ - (void)configureAuthorizaionProviders { // consumer_key and consumer_secret are required SimpleAuth.configuration[@"tripit"] = @{}; - // client_id, client_secret, redirect_uri are required + // client_id and client_secret are required SimpleAuth.configuration[@"box-web"] = @{}; } diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m index b5b72e4..fa2efef 100755 --- a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m @@ -13,7 +13,9 @@ @implementation SimpleAuthBoxWebLoginViewController #pragma mark - SimpleAuthWebViewController - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - if ((self = [super initWithOptions:options requestToken:requestToken])) { + NSMutableDictionary *optionsCopy = options.mutableCopy; + optionsCopy[SimpleAuthRedirectURIKey] = [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", options[@"client_id"]]; + if ((self = [super initWithOptions:optionsCopy.copy requestToken:requestToken])) { self.title = @"Box"; } return self; diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m index 825003f..039ad98 100755 --- a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m @@ -65,18 +65,7 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { - (RACSignal *)authorizationCode { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - dispatch_async(dispatch_get_main_queue(), ^{ - -//// self.options[SimpleAuthRedirectURIKey] = -//// -//// [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]]; -// -// -// NSMutableDictionary *options = self.options.mutableCopy; -// options[SimpleAuthRedirectURIKey] = -// -// [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]]; -// + dispatch_async(dispatch_get_main_queue(), ^{ SimpleAuthBoxWebLoginViewController *login = [[SimpleAuthBoxWebLoginViewController alloc] initWithOptions:self.options]; login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; @@ -113,8 +102,8 @@ - (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { NSDictionary *parameters = @{ @"code" : code, @"client_id" : self.options[@"client_id"], - @"client_secret" : self.options[@"client_secret"], - @"redirect_uri" : self.options[@"redirect_uri"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]], @"grant_type" : @"authorization_code" }; From 70b0ed77c457ee9ea7b4d0e3be1e7b3d7a36e5da Mon Sep 17 00:00:00 2001 From: dkhamsing Date: Fri, 27 Mar 2015 08:16:24 -0700 Subject: [PATCH 126/139] Add Box to providers --- Example/SimpleAuth/Providers.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/Example/SimpleAuth/Providers.plist b/Example/SimpleAuth/Providers.plist index e91c087..6e5322d 100644 --- a/Example/SimpleAuth/Providers.plist +++ b/Example/SimpleAuth/Providers.plist @@ -17,5 +17,6 @@ strava-web tripit trello-web + box-web From 4ba742752aeda90d88a620236ca35f375f4d19f7 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 27 Mar 2015 11:22:20 -0700 Subject: [PATCH 127/139] Install box provider in example app. --- Example/Podfile.lock | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 87d863e..d734b3b 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -13,6 +13,7 @@ PODS: - ReactiveCocoa/UI (2.4.7): - ReactiveCocoa/Core - SimpleAuth (0.3.7): + - SimpleAuth/BoxWeb (= 0.3.7) - SimpleAuth/Core (= 0.3.7) - SimpleAuth/DropboxWeb (= 0.3.7) - SimpleAuth/Facebook (= 0.3.7) @@ -30,6 +31,9 @@ PODS: - SimpleAuth/Twitter (= 0.3.7) - SimpleAuth/TwitterWeb (= 0.3.7) - SimpleAuth/UI (= 0.3.7) + - SimpleAuth/BoxWeb (0.3.7): + - SimpleAuth/Core + - SimpleAuth/UI - SimpleAuth/Core (0.3.7): - CMDQueryStringSerialization - ReactiveCocoa @@ -96,6 +100,6 @@ SPEC CHECKSUMS: ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: b5c07f4e34d1e2a7fc68090a0ea578215f9c25d4 + SimpleAuth: 734a26053961d20b496038724d74fdd0f353e04c COCOAPODS: 0.36.0 From 456900a63b6fc9bd9150d48f0b2d9999fe1e7b95 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Fri, 27 Mar 2015 11:23:14 -0700 Subject: [PATCH 128/139] Move redirect URI building to provider init. --- .../SimpleAuthBoxWebLoginViewController.m | 6 +- .../BoxWeb/SimpleAuthBoxWebProvider.m | 128 ++++++++++-------- 2 files changed, 70 insertions(+), 64 deletions(-) diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m index fa2efef..686a33b 100755 --- a/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebLoginViewController.m @@ -13,9 +13,7 @@ @implementation SimpleAuthBoxWebLoginViewController #pragma mark - SimpleAuthWebViewController - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { - NSMutableDictionary *optionsCopy = options.mutableCopy; - optionsCopy[SimpleAuthRedirectURIKey] = [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", options[@"client_id"]]; - if ((self = [super initWithOptions:optionsCopy.copy requestToken:requestToken])) { + if ((self = [super initWithOptions:options requestToken:requestToken])) { self.title = @"Box"; } return self; @@ -25,7 +23,7 @@ - (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictiona - (NSURLRequest *)initialRequest { NSDictionary *parameters = @{ @"client_id" : self.options[@"client_id"], - @"redirect_uri" : [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], @"response_type" : @"code" }; NSString *URLString = [NSString stringWithFormat: diff --git a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m index 039ad98..93017bd 100755 --- a/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m +++ b/Pod/Providers/BoxWeb/SimpleAuthBoxWebProvider.m @@ -14,6 +14,16 @@ @implementation SimpleAuthBoxWebProvider +#pragma mark - Initializers + +- (instancetype)initWithOptions:(NSDictionary *)options { + NSMutableDictionary *mutableOptions = [NSMutableDictionary dictionaryWithDictionary:options]; + mutableOptions[SimpleAuthRedirectURIKey] = [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", options[@"client_id"]]; + self = [super initWithOptions:[mutableOptions copy]]; + return self; +} + + #pragma mark - SimpleAuthProvider + (NSString *)type { @@ -45,19 +55,19 @@ + (NSDictionary *)defaultOptions { - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { [[[self accessToken] - flattenMap:^(NSDictionary *response) { - NSArray *signals = @[ - [self accountWithAccessToken:response], - [RACSignal return:response] - ]; - return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; - }] - subscribeNext:^(NSDictionary *response) { - completion(response, nil); - } - error:^(NSError *error) { - completion(nil, error); - }]; + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; } @@ -98,17 +108,16 @@ - (RACSignal *)authorizationCode { - (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { return [RACSignal createSignal:^RACDisposable *(id subscriber) { - // Build request + // Build parameters NSDictionary *parameters = @{ - @"code" : code, - @"client_id" : self.options[@"client_id"], - @"client_secret" : self.options[@"client_secret"], - @"redirect_uri" : [NSString stringWithFormat:@"boxsdk-%@://boxsdkoauth2redirect", self.options[@"client_id"]], - @"grant_type" : @"authorization_code" - }; - - NSLog(@"params = %@", parameters); - + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri" : self.options[SimpleAuthRedirectURIKey], + @"grant_type" : @"authorization_code" + }; + + // Build request NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; NSURL *URL = [NSURL URLWithString:@"https://api.box.com/oauth2/token"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; @@ -118,25 +127,24 @@ - (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { // Run request [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; - NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - if ([indexSet containsIndex:statusCode] && data) { - NSError *parseError = nil; - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; - if (dictionary) { - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; - } - else { - [subscriber sendError:parseError]; - } - } - else { - [subscriber sendError:connectionError]; - } - }]; - + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; return nil; }]; } @@ -158,24 +166,24 @@ - (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { NSURL *URL = [NSURL URLWithString:URLString]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue - completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { - NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; - NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; - if ([indexSet containsIndex:statusCode] && data) { - NSError *parseError = nil; - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; - if (dictionary) { - [subscriber sendNext:dictionary]; - [subscriber sendCompleted]; - } - else { - [subscriber sendError:parseError]; - } - } - else { - [subscriber sendError:connectionError]; - } - }]; + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; return nil; }]; } From 99e53315466ce39a44ddf25806baa94ecba10971 Mon Sep 17 00:00:00 2001 From: dkhamsing Date: Tue, 31 Mar 2015 14:16:41 -0700 Subject: [PATCH 129/139] OneDrive --- Example/SimpleAuth/Providers.plist | 1 + Example/SimpleAuth/SADAppDelegate.m | 2 + ...SimpleAuthOneDriveWebLoginViewController.h | 13 ++ ...SimpleAuthOneDriveWebLoginViewController.m | 47 ++++ .../SimpleAuthOneDriveWebProvider.h | 13 ++ .../SimpleAuthOneDriveWebProvider.m | 221 ++++++++++++++++++ Readme.markdown | 1 + SimpleAuth.podspec | 6 + 8 files changed, 304 insertions(+) create mode 100755 Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.h create mode 100755 Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m create mode 100755 Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.h create mode 100755 Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.m mode change 100644 => 100755 SimpleAuth.podspec diff --git a/Example/SimpleAuth/Providers.plist b/Example/SimpleAuth/Providers.plist index 6e5322d..efa2451 100644 --- a/Example/SimpleAuth/Providers.plist +++ b/Example/SimpleAuth/Providers.plist @@ -18,5 +18,6 @@ tripit trello-web box-web + onedrive-web diff --git a/Example/SimpleAuth/SADAppDelegate.m b/Example/SimpleAuth/SADAppDelegate.m index 5dadf2b..98a5cb2 100644 --- a/Example/SimpleAuth/SADAppDelegate.m +++ b/Example/SimpleAuth/SADAppDelegate.m @@ -86,6 +86,8 @@ - (void)configureAuthorizaionProviders { // client_id and client_secret are required SimpleAuth.configuration[@"box-web"] = @{}; + // client_id and client_secret are required + SimpleAuth.configuration[@"onedrive-web"] = @{}; } diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.h b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.h new file mode 100755 index 0000000..e4a00de --- /dev/null +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.h @@ -0,0 +1,13 @@ +// +// SimpleAuthOneDriveWebLoginViewController.h +// SimpleAuth +// +// Created by dkhamsing on 3/31/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthWebViewController.h" + +@interface SimpleAuthOneDriveWebLoginViewController : SimpleAuthWebViewController + +@end diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m new file mode 100755 index 0000000..3ca2e18 --- /dev/null +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m @@ -0,0 +1,47 @@ +// +// SimpleAuthOneDriveWebLoginViewController.m +// SimpleAuth +// +// Created by dkhamsing on 3/31/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthOneDriveWebLoginViewController.h" + +@implementation SimpleAuthOneDriveWebLoginViewController + +#pragma mark - SimpleAuthWebViewController + +- (instancetype)initWithOptions:(NSDictionary *)options requestToken:(NSDictionary *)requestToken { + if ((self = [super initWithOptions:options requestToken:requestToken])) { + self.title = @"OneDrive"; + } + return self; +} + + +- (NSURLRequest *)initialRequest { + NSDictionary *parameters = @{ + @"client_id" : self.options[@"client_id"], + @"response_type" : @"code", + @"scope":self.options[@"scope"] + }; + NSString *URLString = [NSString stringWithFormat: + @"https://login.live.com/oauth20_authorize.srf?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + + NSURL *URL = [NSURL URLWithString:URLString]; + + return [NSURLRequest requestWithURL:URL]; +} + + +- (BOOL)isTargetRedirectURL:(NSURL *)URL { + if ([URL.absoluteString containsString:@"live.com/?code="]) + return YES; + + return NO; +} + + +@end diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.h b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.h new file mode 100755 index 0000000..73479c6 --- /dev/null +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.h @@ -0,0 +1,13 @@ +// +// SimpleAuthOneDriveWebProvider.h +// SimpleAuth +// +// Created by dkhamsing on 3/31/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthProvider.h" + +@interface SimpleAuthOneDriveWebProvider : SimpleAuthProvider + +@end diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.m b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.m new file mode 100755 index 0000000..ad09a9f --- /dev/null +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebProvider.m @@ -0,0 +1,221 @@ +// +// SimpleAuthOneDriveWebProvider.m +// SimpleAuth +// +// Created by dkhamsing on 3/31/15. +// Copyright (c) 2015 dkhamsing. All rights reserved. +// + +#import "SimpleAuthOneDriveWebProvider.h" +#import "SimpleAuthOneDriveWebLoginViewController.h" + +#import +#import "UIViewController+SimpleAuthAdditions.h" + +@implementation SimpleAuthOneDriveWebProvider + +- (instancetype)initWithOptions:(NSDictionary *)options { + NSMutableDictionary *mutableOptions = [NSMutableDictionary dictionaryWithDictionary:options]; + mutableOptions[SimpleAuthRedirectURIKey] = @""; + self = [super initWithOptions:[mutableOptions copy]]; + return self; +} + +#pragma mark - SimpleAuthProvider + ++ (NSString *)type { + return @"onedrive-web"; +} + + ++ (NSDictionary *)defaultOptions { + + // Default present block + SimpleAuthInterfaceHandler presentBlock = ^(UIViewController *controller) { + UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller]; + navigation.modalPresentationStyle = UIModalPresentationFormSheet; + UIViewController *presented = [UIViewController SimpleAuth_presentedViewController]; + [presented presentViewController:navigation animated:YES completion:nil]; + }; + + // Default dismiss block + SimpleAuthInterfaceHandler dismissBlock = ^(id controller) { + [controller dismissViewControllerAnimated:YES completion:nil]; + }; + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithDictionary:[super defaultOptions]]; + dictionary[SimpleAuthPresentInterfaceBlockKey] = presentBlock; + dictionary[SimpleAuthDismissInterfaceBlockKey] = dismissBlock; + dictionary[@"scope"] = @"wl.signin wl.offline_access onedrive.readwrite"; + return dictionary; +} + + +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [[[self accessToken] + flattenMap:^(NSDictionary *response) { + NSArray *signals = @[ + [self accountWithAccessToken:response], + [RACSignal return:response] + ]; + return [self rac_liftSelector:@selector(dictionaryWithAccount:accessToken:) withSignalsFromArray:signals]; + }] + subscribeNext:^(NSDictionary *response) { + completion(response, nil); + } + error:^(NSError *error) { + completion(nil, error); + }]; +} + + +#pragma mark - Private + +- (RACSignal *)authorizationCode { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + dispatch_async(dispatch_get_main_queue(), ^{ + SimpleAuthOneDriveWebLoginViewController *login = [[SimpleAuthOneDriveWebLoginViewController alloc] initWithOptions:self.options]; + login.completion = ^(UIViewController *login, NSURL *URL, NSError *error) { + SimpleAuthInterfaceHandler dismissBlock = self.options[SimpleAuthDismissInterfaceBlockKey]; + dismissBlock(login); + + // Parse URL + NSString *fragment = [URL query]; + NSDictionary *dictionary = [CMDQueryStringSerialization dictionaryWithQueryString:fragment]; + NSString *code = dictionary[@"code"]; + + // Check for error + if (![code length]) { + [subscriber sendError:error]; + return; + } + + // Send completion + [subscriber sendNext:code]; + [subscriber sendCompleted]; + }; + + SimpleAuthInterfaceHandler block = self.options[SimpleAuthPresentInterfaceBlockKey]; + block(login); + }); + return nil; + }]; +} + + +- (RACSignal *)accessTokenWithAuthorizationCode:(NSString *)code { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + + // Build request + NSDictionary *parameters = @{ + @"code" : code, + @"client_id" : self.options[@"client_id"], + @"client_secret" : self.options[@"client_secret"], + @"redirect_uri": @"", + @"grant_type" : @"authorization_code" + }; + + NSString *query = [CMDQueryStringSerialization queryStringWithDictionary:parameters]; + NSURL *URL = [NSURL URLWithString:@"https://login.live.com/oauth20_token.srf"]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; + [request setHTTPMethod:@"POST"]; + [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]]; + + // Run request + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + + return nil; + }]; +} + + +- (RACSignal *)accessToken { + return [[self authorizationCode] flattenMap:^(id responseObject) { + return [self accessTokenWithAuthorizationCode:responseObject]; + }]; +} + + +- (RACSignal *)accountWithAccessToken:(NSDictionary *)accessToken { + return [RACSignal createSignal:^RACDisposable *(id subscriber) { + NSDictionary *parameters = @{ @"access_token" : accessToken[@"access_token"] }; + NSString *URLString = [NSString stringWithFormat: + @"https://apis.live.net/v5.0/me?%@", + [CMDQueryStringSerialization queryStringWithDictionary:parameters]]; + NSURL *URL = [NSURL URLWithString:URLString]; + NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue + completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 99)]; + NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; + if ([indexSet containsIndex:statusCode] && data) { + NSError *parseError = nil; + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; + if (dictionary) { + [subscriber sendNext:dictionary]; + [subscriber sendCompleted]; + } + else { + [subscriber sendError:parseError]; + } + } + else { + [subscriber sendError:connectionError]; + } + }]; + return nil; + }]; +} + + +- (NSDictionary *)dictionaryWithAccount:(NSDictionary *)account accessToken:(NSDictionary *)accessToken { + NSMutableDictionary *dictionary = [NSMutableDictionary new]; + + // Provider + dictionary[@"provider"] = [[self class] type]; + + // Credentials + dictionary[@"credentials"] = @{ + @"token" : accessToken[@"access_token"], + @"type" : accessToken[@"token_type"], + @"expires_in": accessToken[@"expires_in"], + @"refresh_token": accessToken[@"refresh_token"], + @"user_id": accessToken[@"user_id"], + }; + + // User ID + dictionary[@"id"] = account[@"id"]; + + // Raw response + dictionary[@"extra"] = @{ + @"raw_info" : account + }; + + // User info + NSMutableDictionary *user = [NSMutableDictionary new]; + user[@"name"] = account[@"name"]; + dictionary[@"info"] = user; + + return dictionary; +} + +@end diff --git a/Readme.markdown b/Readme.markdown index 1fea6b6..2a88cc2 100644 --- a/Readme.markdown +++ b/Readme.markdown @@ -15,6 +15,7 @@ SimpleAuth currently has the following providers: - [Sina Weibo](https://github.com/calebd/SimpleAuth/wiki/SinaWeibo) - [Google](https://github.com/calebd/SimpleAuth/wiki/Google) - [Box](https://github.com/calebd/SimpleAuth/wiki/Box) +- [OneDrive](https://github.com/calebd/SimpleAuth/wiki/OneDrive) ## Installing diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec old mode 100644 new mode 100755 index f943607..0bc0da3 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -126,4 +126,10 @@ s.subspec 'BoxWeb' do |ss| ss.source_files = 'Pod/Providers/BoxWeb' end + s.subspec 'OneDriveWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.dependency 'SimpleAuth/UI' + ss.source_files = 'Pod/Providers/OneDriveWeb' + end + end From 80be9bc690780508deca2cb375e635f618215fa8 Mon Sep 17 00:00:00 2001 From: dkhamsing Date: Tue, 31 Mar 2015 15:00:54 -0700 Subject: [PATCH 130/139] Update isTargetRedirectURL --- .../OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m index 3ca2e18..e2f31b1 100755 --- a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m @@ -37,7 +37,8 @@ - (NSURLRequest *)initialRequest { - (BOOL)isTargetRedirectURL:(NSURL *)URL { - if ([URL.absoluteString containsString:@"live.com/?code="]) + NSString *match = @"?code="; + if ([URL.absoluteString rangeOfString:match].location != NSNotFound) return YES; return NO; From 207eccd8df2451670d8f220f8d7a6843d229e158 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 31 Mar 2015 15:02:59 -0700 Subject: [PATCH 131/139] Add OneDrive provider to example project. --- Example/Podfile.lock | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index d734b3b..f06b417 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -23,6 +23,7 @@ PODS: - SimpleAuth/Instagram (= 0.3.7) - SimpleAuth/LinkedInWeb (= 0.3.7) - SimpleAuth/Meetup (= 0.3.7) + - SimpleAuth/OneDriveWeb (= 0.3.7) - SimpleAuth/SinaWeiboWeb (= 0.3.7) - SimpleAuth/Strava (= 0.3.7) - SimpleAuth/Trello (= 0.3.7) @@ -60,6 +61,9 @@ PODS: - SimpleAuth/Meetup (0.3.7): - SimpleAuth/Core - SimpleAuth/UI + - SimpleAuth/OneDriveWeb (0.3.7): + - SimpleAuth/Core + - SimpleAuth/UI - SimpleAuth/SinaWeiboWeb (0.3.7): - SimpleAuth/Core - SimpleAuth/UI @@ -92,14 +96,14 @@ DEPENDENCIES: EXTERNAL SOURCES: SimpleAuth: - :path: .. + :path: ".." SPEC CHECKSUMS: - CMDQueryStringSerialization: bc824b96c08a3277d00c71504e13c9fa18c6b451 - cocoa-oauth: 418c70e6ce4130fa7ebdf05232018c8f391030d8 - ISO8601: 92c818ffadac96b0bee76a7ee69dfb617acea197 - NSData+Base64: aae92a2e3f0bd88b29fe6093551ded3f5c062548 - ReactiveCocoa: 313fc53cc9aeb2bbbc3f5f13c7eac16478d9af8f - SimpleAuth: 734a26053961d20b496038724d74fdd0f353e04c + CMDQueryStringSerialization: 03c5d9847a4eaa2b3e4e439ce1ae24f914cc7fe1 + cocoa-oauth: 1200a2170276a62a975f2786d505dab6e2db1fa8 + ISO8601: f74aa93ae1264e5089614325ef44016f08c7ac6c + NSData+Base64: 4e84902c4db907a15673474677e57763ef3903e4 + ReactiveCocoa: eb38dee0a0e698f73a9b25e5c1faea2bb4c79240 + SimpleAuth: 46760ffb9be64be84381dbaa5ae5c57347db4c3d -COCOAPODS: 0.36.0 +COCOAPODS: 0.36.1 From ab4a9aec50b69965779d645aa7acea67e050172a Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 31 Mar 2015 15:04:42 -0700 Subject: [PATCH 132/139] Use case insensitive search. --- .../OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m index e2f31b1..1ed6aea 100755 --- a/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m +++ b/Pod/Providers/OneDriveWeb/SimpleAuthOneDriveWebLoginViewController.m @@ -37,11 +37,8 @@ - (NSURLRequest *)initialRequest { - (BOOL)isTargetRedirectURL:(NSURL *)URL { - NSString *match = @"?code="; - if ([URL.absoluteString rangeOfString:match].location != NSNotFound) - return YES; - - return NO; + NSRange range = [URL.absoluteString rangeOfString:@"?code=" options:NSCaseInsensitiveSearch]; + return range.location != NSNotFound; } From 6c97168bd3a44c17640a307513f1b6cba19399cb Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 31 Mar 2015 15:09:51 -0700 Subject: [PATCH 133/139] Clean up provider base class. --- Pod/Core/SimpleAuthProvider.m | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Pod/Core/SimpleAuthProvider.m b/Pod/Core/SimpleAuthProvider.m index 369d868..e1ec723 100644 --- a/Pod/Core/SimpleAuthProvider.m +++ b/Pod/Core/SimpleAuthProvider.m @@ -16,20 +16,19 @@ @interface SimpleAuthProvider () @implementation SimpleAuthProvider -@synthesize operationQueue = _operationQueue; +#pragma mark - Properties -#pragma mark - Public +@synthesize operationQueue = _operationQueue; -+ (NSString *)type { - [self doesNotRecognizeSelector:_cmd]; - return nil; +- (NSOperationQueue *)operationQueue { + if (!_operationQueue) { + _operationQueue = [[NSOperationQueue alloc] init]; + } + return _operationQueue; } -+ (NSDictionary *)defaultOptions { - return @{}; -} - +#pragma mark - Initializers - (instancetype)initWithOptions:(NSDictionary *)options { if ((self = [super init])) { @@ -39,18 +38,19 @@ - (instancetype)initWithOptions:(NSDictionary *)options { } -- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { +#pragma mark - Public + ++ (NSString *)type { [self doesNotRecognizeSelector:_cmd]; + return nil; } ++ (NSDictionary *)defaultOptions { + return @{}; +} -#pragma mark - Accessors - -- (NSOperationQueue *)operationQueue { - if (!_operationQueue) { - _operationQueue = [NSOperationQueue new]; - } - return _operationQueue; +- (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { + [self doesNotRecognizeSelector:_cmd]; } @end From eabb59d60db41e7f98f2181b82b0cba41f0bfbee Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 7 Apr 2015 14:07:21 -0700 Subject: [PATCH 134/139] Remove unused UI subspec. --- Example/Podfile.lock | 27 ++++----------------------- SimpleAuth.podspec | 31 +++++-------------------------- 2 files changed, 9 insertions(+), 49 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index f06b417..02fe7a0 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -3,7 +3,7 @@ PODS: - ISO8601 - cocoa-oauth (0.0.1): - NSData+Base64 (~> 1.0) - - ISO8601 (0.1.2) + - ISO8601 (0.1.3) - NSData+Base64 (1.0.0) - ReactiveCocoa (2.4.7): - ReactiveCocoa/UI (= 2.4.7) @@ -31,65 +31,46 @@ PODS: - SimpleAuth/Tumblr (= 0.3.7) - SimpleAuth/Twitter (= 0.3.7) - SimpleAuth/TwitterWeb (= 0.3.7) - - SimpleAuth/UI (= 0.3.7) - SimpleAuth/BoxWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Core (0.3.7): - CMDQueryStringSerialization - ReactiveCocoa - SimpleAuth/DropboxWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Facebook (0.3.7): - SimpleAuth/Core - SimpleAuth/FacebookWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/FoursquareWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/GoogleWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Instagram (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/LinkedInWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Meetup (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/OneDriveWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/SinaWeiboWeb (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Strava (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Trello (0.3.7): - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/TripIt (0.3.7): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Tumblr (0.3.7): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/UI - SimpleAuth/Twitter (0.3.7): - cocoa-oauth - - SimpleAuth/UI - SimpleAuth/TwitterWeb (0.3.7): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/UI - - SimpleAuth/UI (0.3.7): - - SimpleAuth/Core DEPENDENCIES: - SimpleAuth (from `..`) @@ -101,9 +82,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: CMDQueryStringSerialization: 03c5d9847a4eaa2b3e4e439ce1ae24f914cc7fe1 cocoa-oauth: 1200a2170276a62a975f2786d505dab6e2db1fa8 - ISO8601: f74aa93ae1264e5089614325ef44016f08c7ac6c + ISO8601: 8805b6cd6b2d0f7e594f7c5b50e8b00b51695ac0 NSData+Base64: 4e84902c4db907a15673474677e57763ef3903e4 ReactiveCocoa: eb38dee0a0e698f73a9b25e5c1faea2bb4c79240 - SimpleAuth: 46760ffb9be64be84381dbaa5ae5c57347db4c3d + SimpleAuth: 1ba82f07ae5981ac4944ec3bfcb64a575420bf9b -COCOAPODS: 0.36.1 +COCOAPODS: 0.36.3 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 0bc0da3..492c679 100755 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -20,14 +20,8 @@ Pod::Spec.new do |s| ss.ios.resource_bundle = { 'SimpleAuth' => [ 'Pod/Resources/*.lproj' ] } end - s.subspec 'UI' do |ss| - ss.dependency 'SimpleAuth/Core' - ss.ios.source_files = 'Pod/UI/ios/*.{h,m}' - ss.ios.frameworks = 'UIKit' - end - s.subspec 'Twitter' do |ss| - ss.dependency 'SimpleAuth/UI' + ss.dependency 'SimpleAuth/Core' ss.dependency 'cocoa-oauth' ss.frameworks = 'Accounts', 'Social' ss.source_files = 'Pod/Providers/Twitter' @@ -41,94 +35,79 @@ Pod::Spec.new do |s| s.subspec 'FacebookWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/FacebookWeb' end s.subspec 'Instagram' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Instagram' end s.subspec 'TwitterWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/TwitterWeb' end s.subspec 'Meetup' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Meetup' end s.subspec 'Tumblr' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/Tumblr' end s.subspec 'FoursquareWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/FoursquareWeb' end s.subspec 'DropboxWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/DropboxWeb' end s.subspec 'LinkedInWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/LinkedIn' end s.subspec 'SinaWeiboWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/SinaWeiboWeb' end s.subspec 'GoogleWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/GoogleWeb' end s.subspec 'TripIt' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/TripIt' end s.subspec 'Trello' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Trello' end s.subspec 'Strava' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/Strava' end -s.subspec 'BoxWeb' do |ss| - ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' - ss.source_files = 'Pod/Providers/BoxWeb' -end + s.subspec 'BoxWeb' do |ss| + ss.dependency 'SimpleAuth/Core' + ss.source_files = 'Pod/Providers/BoxWeb' + end s.subspec 'OneDriveWeb' do |ss| ss.dependency 'SimpleAuth/Core' - ss.dependency 'SimpleAuth/UI' ss.source_files = 'Pod/Providers/OneDriveWeb' end From 4b78577520207a171ade3386214f61cafe765b92 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 7 Apr 2015 14:18:25 -0700 Subject: [PATCH 135/139] Make all provider headers private. --- SimpleAuth.podspec | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 492c679..f385832 100755 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -25,90 +25,107 @@ Pod::Spec.new do |s| ss.dependency 'cocoa-oauth' ss.frameworks = 'Accounts', 'Social' ss.source_files = 'Pod/Providers/Twitter' + ss.private_header_files = 'Pod/Providers/Twitter/*.h' end s.subspec 'Facebook' do |ss| ss.dependency 'SimpleAuth/Core' ss.frameworks = 'Accounts', 'Social' ss.source_files = 'Pod/Providers/Facebook' + ss.private_header_files = 'Pod/Providers/Facebook/*.h' end s.subspec 'FacebookWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/FacebookWeb' + ss.private_header_files = 'Pod/Providers/FacebookWeb/*.h' end s.subspec 'Instagram' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/Instagram' + ss.private_header_files = 'Pod/Providers/Instagram/*.h' end s.subspec 'TwitterWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/TwitterWeb' + ss.private_header_files = 'Pod/Providers/TwitterWeb/*.h' end s.subspec 'Meetup' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/Meetup' + ss.private_header_files = 'Pod/Providers/Meetup/*.h' end s.subspec 'Tumblr' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/Tumblr' + ss.private_header_files = 'Pod/Providers/Tumblr/*.h' end s.subspec 'FoursquareWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/FoursquareWeb' + ss.private_header_files = 'Pod/Providers/FoursquareWeb/*.h' end s.subspec 'DropboxWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/DropboxWeb' + ss.private_header_files = 'Pod/Providers/DropboxWeb/*.h' end s.subspec 'LinkedInWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/LinkedIn' + ss.private_header_files = 'Pod/Providers/LinkedIn/*.h' end s.subspec 'SinaWeiboWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/SinaWeiboWeb' + ss.private_header_files = 'Pod/Providers/SinaWeiboWeb/*.h' end s.subspec 'GoogleWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/GoogleWeb' + ss.private_header_files = 'Pod/Providers/GoogleWeb/*.h' end s.subspec 'TripIt' do |ss| ss.dependency 'SimpleAuth/Core' ss.dependency 'cocoa-oauth' ss.source_files = 'Pod/Providers/TripIt' + ss.private_header_files = 'Pod/Providers/TripIt/*.h' end s.subspec 'Trello' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/Trello' + ss.private_header_files = 'Pod/Providers/Trello/*.h' end s.subspec 'Strava' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/Strava' + ss.private_header_files = 'Pod/Providers/Strava/*.h' end s.subspec 'BoxWeb' do |ss| - ss.dependency 'SimpleAuth/Core' - ss.source_files = 'Pod/Providers/BoxWeb' + ss.dependency 'SimpleAuth/Core' + ss.source_files = 'Pod/Providers/BoxWeb' + ss.private_header_files = 'Pod/Providers/BoxWeb/*.h' end s.subspec 'OneDriveWeb' do |ss| ss.dependency 'SimpleAuth/Core' ss.source_files = 'Pod/Providers/OneDriveWeb' + ss.private_header_files = 'Pod/Providers/OneDriveWeb/*.h' end end From f1fb681c81b2f3947fa32f60239b23ee1dda3374 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 7 Apr 2015 14:26:35 -0700 Subject: [PATCH 136/139] Bump version: 0.3.8 --- Example/Podfile.lock | 78 ++++++++++++++++++++++---------------------- SimpleAuth.podspec | 2 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 02fe7a0..4e3175b 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -12,63 +12,63 @@ PODS: - ReactiveCocoa/no-arc (2.4.7) - ReactiveCocoa/UI (2.4.7): - ReactiveCocoa/Core - - SimpleAuth (0.3.7): - - SimpleAuth/BoxWeb (= 0.3.7) - - SimpleAuth/Core (= 0.3.7) - - SimpleAuth/DropboxWeb (= 0.3.7) - - SimpleAuth/Facebook (= 0.3.7) - - SimpleAuth/FacebookWeb (= 0.3.7) - - SimpleAuth/FoursquareWeb (= 0.3.7) - - SimpleAuth/GoogleWeb (= 0.3.7) - - SimpleAuth/Instagram (= 0.3.7) - - SimpleAuth/LinkedInWeb (= 0.3.7) - - SimpleAuth/Meetup (= 0.3.7) - - SimpleAuth/OneDriveWeb (= 0.3.7) - - SimpleAuth/SinaWeiboWeb (= 0.3.7) - - SimpleAuth/Strava (= 0.3.7) - - SimpleAuth/Trello (= 0.3.7) - - SimpleAuth/TripIt (= 0.3.7) - - SimpleAuth/Tumblr (= 0.3.7) - - SimpleAuth/Twitter (= 0.3.7) - - SimpleAuth/TwitterWeb (= 0.3.7) - - SimpleAuth/BoxWeb (0.3.7): - - SimpleAuth/Core - - SimpleAuth/Core (0.3.7): + - SimpleAuth (0.3.8): + - SimpleAuth/BoxWeb (= 0.3.8) + - SimpleAuth/Core (= 0.3.8) + - SimpleAuth/DropboxWeb (= 0.3.8) + - SimpleAuth/Facebook (= 0.3.8) + - SimpleAuth/FacebookWeb (= 0.3.8) + - SimpleAuth/FoursquareWeb (= 0.3.8) + - SimpleAuth/GoogleWeb (= 0.3.8) + - SimpleAuth/Instagram (= 0.3.8) + - SimpleAuth/LinkedInWeb (= 0.3.8) + - SimpleAuth/Meetup (= 0.3.8) + - SimpleAuth/OneDriveWeb (= 0.3.8) + - SimpleAuth/SinaWeiboWeb (= 0.3.8) + - SimpleAuth/Strava (= 0.3.8) + - SimpleAuth/Trello (= 0.3.8) + - SimpleAuth/TripIt (= 0.3.8) + - SimpleAuth/Tumblr (= 0.3.8) + - SimpleAuth/Twitter (= 0.3.8) + - SimpleAuth/TwitterWeb (= 0.3.8) + - SimpleAuth/BoxWeb (0.3.8): + - SimpleAuth/Core + - SimpleAuth/Core (0.3.8): - CMDQueryStringSerialization - ReactiveCocoa - - SimpleAuth/DropboxWeb (0.3.7): + - SimpleAuth/DropboxWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/Facebook (0.3.7): + - SimpleAuth/Facebook (0.3.8): - SimpleAuth/Core - - SimpleAuth/FacebookWeb (0.3.7): + - SimpleAuth/FacebookWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/FoursquareWeb (0.3.7): + - SimpleAuth/FoursquareWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/GoogleWeb (0.3.7): + - SimpleAuth/GoogleWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/Instagram (0.3.7): + - SimpleAuth/Instagram (0.3.8): - SimpleAuth/Core - - SimpleAuth/LinkedInWeb (0.3.7): + - SimpleAuth/LinkedInWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/Meetup (0.3.7): + - SimpleAuth/Meetup (0.3.8): - SimpleAuth/Core - - SimpleAuth/OneDriveWeb (0.3.7): + - SimpleAuth/OneDriveWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/SinaWeiboWeb (0.3.7): + - SimpleAuth/SinaWeiboWeb (0.3.8): - SimpleAuth/Core - - SimpleAuth/Strava (0.3.7): + - SimpleAuth/Strava (0.3.8): - SimpleAuth/Core - - SimpleAuth/Trello (0.3.7): + - SimpleAuth/Trello (0.3.8): - SimpleAuth/Core - - SimpleAuth/TripIt (0.3.7): + - SimpleAuth/TripIt (0.3.8): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/Tumblr (0.3.7): + - SimpleAuth/Tumblr (0.3.8): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/Twitter (0.3.7): + - SimpleAuth/Twitter (0.3.8): - cocoa-oauth - - SimpleAuth/TwitterWeb (0.3.7): + - SimpleAuth/TwitterWeb (0.3.8): - cocoa-oauth - SimpleAuth/Core @@ -85,6 +85,6 @@ SPEC CHECKSUMS: ISO8601: 8805b6cd6b2d0f7e594f7c5b50e8b00b51695ac0 NSData+Base64: 4e84902c4db907a15673474677e57763ef3903e4 ReactiveCocoa: eb38dee0a0e698f73a9b25e5c1faea2bb4c79240 - SimpleAuth: 1ba82f07ae5981ac4944ec3bfcb64a575420bf9b + SimpleAuth: 94ac8f6f377c58ff836bc8f7525f76da8f46225b COCOAPODS: 0.36.3 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index f385832..4a9df8f 100755 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.7' + s.version = '0.3.8' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' } From 91ee32a6d194d86a462c309a114809568ce303ee Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 7 Apr 2015 17:35:26 -0700 Subject: [PATCH 137/139] Add bundle loading that works in frameworks. --- Pod/Core/SimpleAuthUtilities.m | 8 +++++--- .../en.lproj/{SimpleAuth.strings => Localizable.strings} | 0 2 files changed, 5 insertions(+), 3 deletions(-) rename Pod/Resources/en.lproj/{SimpleAuth.strings => Localizable.strings} (100%) diff --git a/Pod/Core/SimpleAuthUtilities.m b/Pod/Core/SimpleAuthUtilities.m index 0e6a01b..a4fc9d5 100644 --- a/Pod/Core/SimpleAuthUtilities.m +++ b/Pod/Core/SimpleAuthUtilities.m @@ -7,9 +7,11 @@ // #import "SimpleAuthUtilities.h" +#import "SimpleAuth.h" NSString *SimpleAuthLocalizedString(NSString *key) { - NSURL *URL = [[NSBundle mainBundle] URLForResource:@"SimpleAuth" withExtension:@"bundle"]; - NSBundle *bundle = [NSBundle bundleWithURL:URL]; - return [bundle localizedStringForKey:key value:nil table:@"SimpleAuth"]; + NSBundle *mainBundle = [NSBundle bundleForClass:[SimpleAuth class]]; + NSURL *resourcesBundleURL = [mainBundle URLForResource:@"SimpleAuth" withExtension:@"bundle"]; + NSBundle *resourcesBundle = [NSBundle bundleWithURL:resourcesBundleURL]; + return NSLocalizedStringFromTableInBundle(key, nil, resourcesBundle, nil); } diff --git a/Pod/Resources/en.lproj/SimpleAuth.strings b/Pod/Resources/en.lproj/Localizable.strings similarity index 100% rename from Pod/Resources/en.lproj/SimpleAuth.strings rename to Pod/Resources/en.lproj/Localizable.strings From 9b7830bb8954a362a2c833f1b9471df05fd75a95 Mon Sep 17 00:00:00 2001 From: Nikolay Vznuzdaev Date: Fri, 24 Apr 2015 00:17:23 +0300 Subject: [PATCH 138/139] Correct account signals order (caused Unrecognized selector error). --- Pod/Providers/Facebook/SimpleAuthFacebookProvider.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m index d8914a9..a9cd267 100644 --- a/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m +++ b/Pod/Providers/Facebook/SimpleAuthFacebookProvider.m @@ -30,8 +30,8 @@ - (void)authorizeWithCompletion:(SimpleAuthRequestHandler)completion { [[[[self systemAccount] flattenMap:^RACStream *(ACAccount *account) { NSArray *signals = @[ - [RACSignal return:account], - [self remoteAccountWithSystemAccount:account] + [self remoteAccountWithSystemAccount:account], + [RACSignal return:account] ]; return [self rac_liftSelector:@selector(responseDictionaryWithRemoteAccount:systemAccount:) withSignalsFromArray:signals]; }] From 838aa6d6c20a81924aec99cf9fb27e4b13bf7a30 Mon Sep 17 00:00:00 2001 From: Caleb Davenport Date: Tue, 28 Apr 2015 23:48:57 -0700 Subject: [PATCH 139/139] Bump version: 0.3.9 --- Example/Podfile.lock | 93 ++++++++++++++++++++++---------------------- SimpleAuth.podspec | 2 +- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 4e3175b..826f91f 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -5,70 +5,71 @@ PODS: - NSData+Base64 (~> 1.0) - ISO8601 (0.1.3) - NSData+Base64 (1.0.0) - - ReactiveCocoa (2.4.7): - - ReactiveCocoa/UI (= 2.4.7) - - ReactiveCocoa/Core (2.4.7): + - ReactiveCocoa (2.5): + - ReactiveCocoa/UI (= 2.5) + - ReactiveCocoa/Core (2.5): - ReactiveCocoa/no-arc - - ReactiveCocoa/no-arc (2.4.7) - - ReactiveCocoa/UI (2.4.7): + - ReactiveCocoa/no-arc (2.5) + - ReactiveCocoa/UI (2.5): - ReactiveCocoa/Core - - SimpleAuth (0.3.8): - - SimpleAuth/BoxWeb (= 0.3.8) - - SimpleAuth/Core (= 0.3.8) - - SimpleAuth/DropboxWeb (= 0.3.8) - - SimpleAuth/Facebook (= 0.3.8) - - SimpleAuth/FacebookWeb (= 0.3.8) - - SimpleAuth/FoursquareWeb (= 0.3.8) - - SimpleAuth/GoogleWeb (= 0.3.8) - - SimpleAuth/Instagram (= 0.3.8) - - SimpleAuth/LinkedInWeb (= 0.3.8) - - SimpleAuth/Meetup (= 0.3.8) - - SimpleAuth/OneDriveWeb (= 0.3.8) - - SimpleAuth/SinaWeiboWeb (= 0.3.8) - - SimpleAuth/Strava (= 0.3.8) - - SimpleAuth/Trello (= 0.3.8) - - SimpleAuth/TripIt (= 0.3.8) - - SimpleAuth/Tumblr (= 0.3.8) - - SimpleAuth/Twitter (= 0.3.8) - - SimpleAuth/TwitterWeb (= 0.3.8) - - SimpleAuth/BoxWeb (0.3.8): - - SimpleAuth/Core - - SimpleAuth/Core (0.3.8): + - SimpleAuth (0.3.9): + - SimpleAuth/BoxWeb (= 0.3.9) + - SimpleAuth/Core (= 0.3.9) + - SimpleAuth/DropboxWeb (= 0.3.9) + - SimpleAuth/Facebook (= 0.3.9) + - SimpleAuth/FacebookWeb (= 0.3.9) + - SimpleAuth/FoursquareWeb (= 0.3.9) + - SimpleAuth/GoogleWeb (= 0.3.9) + - SimpleAuth/Instagram (= 0.3.9) + - SimpleAuth/LinkedInWeb (= 0.3.9) + - SimpleAuth/Meetup (= 0.3.9) + - SimpleAuth/OneDriveWeb (= 0.3.9) + - SimpleAuth/SinaWeiboWeb (= 0.3.9) + - SimpleAuth/Strava (= 0.3.9) + - SimpleAuth/Trello (= 0.3.9) + - SimpleAuth/TripIt (= 0.3.9) + - SimpleAuth/Tumblr (= 0.3.9) + - SimpleAuth/Twitter (= 0.3.9) + - SimpleAuth/TwitterWeb (= 0.3.9) + - SimpleAuth/BoxWeb (0.3.9): + - SimpleAuth/Core + - SimpleAuth/Core (0.3.9): - CMDQueryStringSerialization - ReactiveCocoa - - SimpleAuth/DropboxWeb (0.3.8): + - SimpleAuth/DropboxWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/Facebook (0.3.8): + - SimpleAuth/Facebook (0.3.9): - SimpleAuth/Core - - SimpleAuth/FacebookWeb (0.3.8): + - SimpleAuth/FacebookWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/FoursquareWeb (0.3.8): + - SimpleAuth/FoursquareWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/GoogleWeb (0.3.8): + - SimpleAuth/GoogleWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/Instagram (0.3.8): + - SimpleAuth/Instagram (0.3.9): - SimpleAuth/Core - - SimpleAuth/LinkedInWeb (0.3.8): + - SimpleAuth/LinkedInWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/Meetup (0.3.8): + - SimpleAuth/Meetup (0.3.9): - SimpleAuth/Core - - SimpleAuth/OneDriveWeb (0.3.8): + - SimpleAuth/OneDriveWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/SinaWeiboWeb (0.3.8): + - SimpleAuth/SinaWeiboWeb (0.3.9): - SimpleAuth/Core - - SimpleAuth/Strava (0.3.8): + - SimpleAuth/Strava (0.3.9): - SimpleAuth/Core - - SimpleAuth/Trello (0.3.8): + - SimpleAuth/Trello (0.3.9): - SimpleAuth/Core - - SimpleAuth/TripIt (0.3.8): + - SimpleAuth/TripIt (0.3.9): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/Tumblr (0.3.8): + - SimpleAuth/Tumblr (0.3.9): - cocoa-oauth - SimpleAuth/Core - - SimpleAuth/Twitter (0.3.8): + - SimpleAuth/Twitter (0.3.9): - cocoa-oauth - - SimpleAuth/TwitterWeb (0.3.8): + - SimpleAuth/Core + - SimpleAuth/TwitterWeb (0.3.9): - cocoa-oauth - SimpleAuth/Core @@ -84,7 +85,7 @@ SPEC CHECKSUMS: cocoa-oauth: 1200a2170276a62a975f2786d505dab6e2db1fa8 ISO8601: 8805b6cd6b2d0f7e594f7c5b50e8b00b51695ac0 NSData+Base64: 4e84902c4db907a15673474677e57763ef3903e4 - ReactiveCocoa: eb38dee0a0e698f73a9b25e5c1faea2bb4c79240 - SimpleAuth: 94ac8f6f377c58ff836bc8f7525f76da8f46225b + ReactiveCocoa: e2db045570aa97c695e7aa97c2bcab222ae51f4a + SimpleAuth: bc7d594f90711a7e6ef7624dce5aa8c8b09770ab -COCOAPODS: 0.36.3 +COCOAPODS: 0.36.4 diff --git a/SimpleAuth.podspec b/SimpleAuth.podspec index 4a9df8f..6125ab9 100755 --- a/SimpleAuth.podspec +++ b/SimpleAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'SimpleAuth' - s.version = '0.3.8' + s.version = '0.3.9' s.summary = 'Simple social authentication for iOS.' s.homepage = 'https://github.com/calebd/SimpleAuth' s.license = { :type => 'MIT', :file => 'LICENSE' }