diff options
Diffstat (limited to 'remoting/ios/authorize.mm')
-rw-r--r-- | remoting/ios/authorize.mm | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/remoting/ios/authorize.mm b/remoting/ios/authorize.mm new file mode 100644 index 0000000..92f467c --- /dev/null +++ b/remoting/ios/authorize.mm @@ -0,0 +1,123 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#import "remoting/ios/authorize.h" + +// TODO (aboone) This include is for The Google Toolbox for Mac OAuth 2 +// Controllers https://code.google.com/p/gtm-oauth2/ This may need to be added +// as a third-party or locate the proper project in Chromium. +#import "GTMOAuth2ViewControllerTouch.h" + +#include "google_apis/google_api_keys.h" +// TODO (aboone) Pulling in some service values from the host side. The cc's +// are also compiled as part of this project because the target remoting_host +// does not build on iOS right now. +#include "remoting/host/service_urls.h" +#include "remoting/host/setup/oauth_helper.h" + +namespace { +static NSString* const kKeychainItemName = @"Google Chromoting iOS"; + +NSString* ClientId() { + return + [NSString stringWithUTF8String:google_apis::GetOAuth2ClientID( + google_apis::CLIENT_REMOTING).c_str()]; +} + +NSString* ClientSecret() { + return + [NSString stringWithUTF8String:google_apis::GetOAuth2ClientSecret( + google_apis::CLIENT_REMOTING).c_str()]; +} + +NSString* Scopes() { + return [NSString stringWithUTF8String:remoting::GetOauthScope().c_str()]; +} + +NSMutableString* HostURL() { + return + [NSMutableString stringWithUTF8String:remoting::ServiceUrls::GetInstance() + ->directory_hosts_url() + .c_str()]; +} + +NSString* APIKey() { + return [NSString stringWithUTF8String:google_apis::GetAPIKey().c_str()]; +} + +} // namespace + +@implementation Authorize + ++ (GTMOAuth2Authentication*)getAnyExistingAuthorization { + // Ensure the google_apis lib has keys + // If this check fails then google_apis was not built right + // TODO (aboone) For now we specify the preprocessor macros for + // GOOGLE_CLIENT_SECRET_REMOTING and GOOGLE_CLIENT_ID_REMOTING when building + // the google_apis target. The values may be developer specific, and should + // be well know to the project staff. + // See http://www.chromium.org/developers/how-tos/api-keys for more general + // information. + DCHECK(![ClientId() isEqualToString:@"dummytoken"]); + + return [GTMOAuth2ViewControllerTouch + authForGoogleFromKeychainForName:kKeychainItemName + clientID:ClientId() + clientSecret:ClientSecret()]; +} + ++ (void)beginRequest:(GTMOAuth2Authentication*)authReq + delegate:(id)delegate + didFinishSelector:(SEL)sel { + // Build request URL using API HTTP endpoint, and our api key + NSMutableString* hostsUrl = HostURL(); + [hostsUrl appendString:@"?key="]; + [hostsUrl appendString:APIKey()]; + + NSMutableURLRequest* theRequest = + [NSMutableURLRequest requestWithURL:[NSURL URLWithString:hostsUrl]]; + + // Add scopes if needed + NSString* scope = authReq.scope; + + if ([scope rangeOfString:Scopes()].location == NSNotFound) { + scope = [GTMOAuth2Authentication scopeWithStrings:scope, Scopes(), nil]; + authReq.scope = scope; + } + + // Execute request async + [authReq authorizeRequest:theRequest delegate:delegate didFinishSelector:sel]; +} + ++ (void)appendCredentials:(NSMutableURLRequest*)request { + // Add credentials for service + [request addValue:ClientId() forHTTPHeaderField:@"client_id"]; + [request addValue:ClientSecret() forHTTPHeaderField:@"client_secret"]; +} + ++ (UINavigationController*)createLoginController:(id)delegate + finishedSelector:(SEL)finishedSelector { + [GTMOAuth2ViewControllerTouch + removeAuthFromKeychainForName:kKeychainItemName]; + + // When the sign in is complete a http redirection occurs, and the + // user would see the output. We do not want the user to notice this + // transition. Wrapping the oAuth2 Controller in a + // UINavigationController causes the view to render as a blank/black + // page when a http redirection occurs. + return [[UINavigationController alloc] + initWithRootViewController:[[GTMOAuth2ViewControllerTouch alloc] + initWithScope:Scopes() + clientID:ClientId() + clientSecret:ClientSecret() + keychainItemName:kKeychainItemName + delegate:delegate + finishedSelector:finishedSelector]]; +} + +@end |