blob: 92f467c648527dd2e6cc493c02c4f19bd6d201ed [file] [log] [blame]
// 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