| Index: remoting/client/ios/facade/remoting_authentication.mm
|
| diff --git a/remoting/client/ios/facade/remoting_authentication.mm b/remoting/client/ios/facade/remoting_authentication.mm
|
| deleted file mode 100644
|
| index 5abe68fbf6d33602f68c2ece40b8414f8af6b504..0000000000000000000000000000000000000000
|
| --- a/remoting/client/ios/facade/remoting_authentication.mm
|
| +++ /dev/null
|
| @@ -1,195 +0,0 @@
|
| -// Copyright 2017 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/client/ios/facade/remoting_authentication.h"
|
| -
|
| -#import <Foundation/Foundation.h>
|
| -#import <Security/Security.h>
|
| -
|
| -#import "base/mac/bind_objc_block.h"
|
| -#import "remoting/client/ios/facade/host_info.h"
|
| -#import "remoting/client/ios/facade/host_list_fetcher.h"
|
| -#import "remoting/client/ios/facade/ios_client_runtime_delegate.h"
|
| -#import "remoting/client/ios/facade/remoting_service.h"
|
| -#import "remoting/client/ios/keychain_wrapper.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "net/url_request/url_request_context_getter.h"
|
| -#include "remoting/base/oauth_token_getter.h"
|
| -#include "remoting/base/oauth_token_getter_impl.h"
|
| -
|
| -static NSString* const kCRDAuthenticatedUserEmailKey =
|
| - @"kCRDAuthenticatedUserEmailKey";
|
| -
|
| -const char kOauthRedirectUrl[] =
|
| - "https://chromoting-oauth.talkgadget."
|
| - "google.com/talkgadget/oauth/chrome-remote-desktop/dev";
|
| -
|
| -std::unique_ptr<remoting::OAuthTokenGetter>
|
| -CreateOAuthTokenGetterWithAuthorizationCode(
|
| - const std::string& auth_code,
|
| - const remoting::OAuthTokenGetter::CredentialsUpdatedCallback&
|
| - on_credentials_update) {
|
| - std::unique_ptr<remoting::OAuthTokenGetter::OAuthIntermediateCredentials>
|
| - oauth_credentials(
|
| - new remoting::OAuthTokenGetter::OAuthIntermediateCredentials(
|
| - auth_code, /*is_service_account=*/false));
|
| - oauth_credentials->oauth_redirect_uri = kOauthRedirectUrl;
|
| -
|
| - std::unique_ptr<remoting::OAuthTokenGetter> oauth_tokenGetter(
|
| - new remoting::OAuthTokenGetterImpl(
|
| - std::move(oauth_credentials), on_credentials_update,
|
| - [RemotingService SharedInstance].runtime->url_requester(),
|
| - /*auto_refresh=*/true));
|
| - return oauth_tokenGetter;
|
| -}
|
| -
|
| -std::unique_ptr<remoting::OAuthTokenGetter> CreateOAuthTokenWithRefreshToken(
|
| - const std::string& refresh_token,
|
| - const std::string& email) {
|
| - std::unique_ptr<remoting::OAuthTokenGetter::OAuthAuthorizationCredentials>
|
| - oauth_credentials(
|
| - new remoting::OAuthTokenGetter::OAuthAuthorizationCredentials(
|
| - email, refresh_token, /*is_service_account=*/false));
|
| -
|
| - std::unique_ptr<remoting::OAuthTokenGetter> oauth_tokenGetter(
|
| - new remoting::OAuthTokenGetterImpl(
|
| - std::move(oauth_credentials),
|
| - [RemotingService SharedInstance].runtime->url_requester(),
|
| - /*auto_refresh=*/true));
|
| - return oauth_tokenGetter;
|
| -}
|
| -
|
| -@interface RemotingAuthentication () {
|
| - std::unique_ptr<remoting::OAuthTokenGetter> _tokenGetter;
|
| - KeychainWrapper* _keychainWrapper;
|
| - BOOL _firstLoadUserAttempt;
|
| -}
|
| -@end
|
| -
|
| -@implementation RemotingAuthentication
|
| -
|
| -@synthesize user = _user;
|
| -@synthesize delegate = _delegate;
|
| -
|
| -- (instancetype)init {
|
| - self = [super init];
|
| - if (self) {
|
| - _keychainWrapper = [[KeychainWrapper alloc] init];
|
| - _user = nil;
|
| - _firstLoadUserAttempt = YES;
|
| - }
|
| - return self;
|
| -}
|
| -
|
| -#pragma mark - Property Overrides
|
| -
|
| -- (UserInfo*)user {
|
| - if (_firstLoadUserAttempt && _user == nil) {
|
| - _firstLoadUserAttempt = NO;
|
| - [self setUser:[self loadUserInfo]];
|
| - }
|
| - return _user;
|
| -}
|
| -
|
| -- (void)setUser:(UserInfo*)user {
|
| - _user = user;
|
| - [self storeUserInfo:_user];
|
| - [_delegate userDidUpdate:_user];
|
| -}
|
| -
|
| -#pragma mark - Class Implementation
|
| -
|
| -- (void)authenticateWithAuthorizationCode:(NSString*)authorizationCode {
|
| - __weak RemotingAuthentication* weakSelf = self;
|
| - _tokenGetter = CreateOAuthTokenGetterWithAuthorizationCode(
|
| - std::string(base::SysNSStringToUTF8(authorizationCode)),
|
| - base::BindBlockArc(
|
| - ^(const std::string& user_email, const std::string& refresh_token) {
|
| - // TODO(nicholss): Do something with these new creds.
|
| - VLOG(1) << "New Creds: " << user_email << " " << refresh_token;
|
| - UserInfo* user = [[UserInfo alloc] init];
|
| - user.userEmail = base::SysUTF8ToNSString(user_email);
|
| - user.refreshToken = base::SysUTF8ToNSString(refresh_token);
|
| - [weakSelf setUser:user];
|
| - }));
|
| - // Stimulate the oAuth Token Getter to fetch and access token, this forces it
|
| - // to convert the authorization code into a refresh token, and saving the
|
| - // refresh token will happen automaticly in the above block.
|
| - [self callbackWithAccessToken:base::BindBlockArc(^(
|
| - remoting::OAuthTokenGetter::Status status,
|
| - const std::string& user_email,
|
| - const std::string& access_token) {
|
| - if (status == remoting::OAuthTokenGetter::Status::SUCCESS) {
|
| - VLOG(1) << "Success fetching access token from authorization code.";
|
| - } else {
|
| - LOG(ERROR)
|
| - << "Failed to fetch access token from authorization code. ("
|
| - << status << ")";
|
| - // TODO(nicholss): Deal with the sad path for a bad auth token.
|
| - }
|
| - })];
|
| -}
|
| -
|
| -#pragma mark - Private
|
| -
|
| -// Provide the |refreshToken| and |email| to authenticate a user as a returning
|
| -// user of the application.
|
| -- (void)authenticateWithRefreshToken:(NSString*)refreshToken
|
| - email:(NSString*)email {
|
| - _tokenGetter = CreateOAuthTokenWithRefreshToken(
|
| - std::string(base::SysNSStringToUTF8(refreshToken)),
|
| - base::SysNSStringToUTF8(email));
|
| -}
|
| -
|
| -- (void)callbackWithAccessToken:
|
| - (const remoting::OAuthTokenGetter::TokenCallback&)onAccessToken {
|
| - // TODO(nicholss): Be careful here since a failure to reset onAccessToken
|
| - // will end up with retain cycle and memory leakage.
|
| - if (_tokenGetter) {
|
| - _tokenGetter->CallWithToken(onAccessToken);
|
| - }
|
| -}
|
| -
|
| -- (void)logout {
|
| - [self storeUserInfo:nil];
|
| - [self setUser:nil];
|
| -}
|
| -
|
| -#pragma mark - Persistence
|
| -
|
| -- (void)storeUserInfo:(UserInfo*)user {
|
| - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
| - if (user) {
|
| - [defaults setObject:user.userEmail forKey:kCRDAuthenticatedUserEmailKey];
|
| - // TODO(nicholss): Need to match the token with the email.
|
| - [_keychainWrapper setRefreshToken:user.refreshToken];
|
| - } else {
|
| - [defaults removeObjectForKey:kCRDAuthenticatedUserEmailKey];
|
| - [_keychainWrapper resetKeychainItem];
|
| - }
|
| - [defaults synchronize];
|
| -}
|
| -
|
| -- (UserInfo*)loadUserInfo {
|
| - UserInfo* user = [[UserInfo alloc] init];
|
| - NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
|
| - user.userEmail = [defaults objectForKey:kCRDAuthenticatedUserEmailKey];
|
| - // TODO(nicholss): Need to match the token with the email.
|
| - user.refreshToken = [_keychainWrapper refreshToken];
|
| -
|
| - if (!user || ![user isAuthenticated]) {
|
| - user = nil;
|
| - } else {
|
| - [self authenticateWithRefreshToken:user.refreshToken email:user.userEmail];
|
| - }
|
| - return user;
|
| -}
|
| -
|
| -@end
|
|
|