Commit eb8e49e2 authored by Erik Jensen's avatar Erik Jensen Committed by Commit Bot

remoting: Invoke callback when refresh token changes.

On Windows, this is used to rewrite the configuration file.

Bug: 954427
Change-Id: I8bca99c6cf553004936417d626b4b3e47830103e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1633630
Commit-Queue: Joe Downing <joedow@chromium.org>
Reviewed-by: default avatarJoe Downing <joedow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664124}
parent 5e231e0b
......@@ -34,6 +34,10 @@ class OAuthTokenGetter {
const std::string& refresh_token)>
CredentialsUpdatedCallback;
// Called if the current refresh token is exchanged for one with new scopes.
typedef base::RepeatingCallback<void(const std::string& refresh_token)>
RefreshTokenUpdatedCallback;
// This structure contains information required to perform authorization
// with the authorization server.
struct OAuthAuthorizationCredentials {
......
......@@ -44,10 +44,13 @@ OAuthTokenGetterImpl::OAuthTokenGetterImpl(
OAuthTokenGetterImpl::OAuthTokenGetterImpl(
std::unique_ptr<OAuthAuthorizationCredentials> authorization_credentials,
const OAuthTokenGetter::RefreshTokenUpdatedCallback&
on_refresh_token_updated,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
bool auto_refresh)
: authorization_credentials_(std::move(authorization_credentials)),
gaia_oauth_client_(new gaia::GaiaOAuthClient(url_loader_factory)),
refresh_token_updated_callback_(on_refresh_token_updated),
token_exchanger_(url_loader_factory),
weak_factory_(this) {
if (auto_refresh) {
......@@ -303,6 +306,13 @@ void OAuthTokenGetterImpl::OnExchangeTokenResponse(
NotifyTokenCallbacks(status, std::string(), std::string());
break;
case SUCCESS:
if (!refresh_token.empty() &&
refresh_token != authorization_credentials_->refresh_token) {
authorization_credentials_->refresh_token = refresh_token;
if (refresh_token_updated_callback_) {
refresh_token_updated_callback_.Run(refresh_token);
}
}
NotifyTokenCallbacks(status, authorization_credentials_->login,
oauth_access_token_);
break;
......
......@@ -39,6 +39,8 @@ class OAuthTokenGetterImpl : public OAuthTokenGetter,
bool auto_refresh);
OAuthTokenGetterImpl(
std::unique_ptr<OAuthAuthorizationCredentials> authorization_credentials,
const OAuthTokenGetter::RefreshTokenUpdatedCallback&
on_refresh_token_updated,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
bool auto_refresh);
~OAuthTokenGetterImpl() override;
......@@ -81,6 +83,7 @@ class OAuthTokenGetterImpl : public OAuthTokenGetter,
std::unique_ptr<OAuthAuthorizationCredentials> authorization_credentials_;
std::unique_ptr<gaia::GaiaOAuthClient> gaia_oauth_client_;
OAuthTokenGetter::CredentialsUpdatedCallback credentials_updated_callback_;
OAuthTokenGetter::RefreshTokenUpdatedCallback refresh_token_updated_callback_;
bool response_pending_ = false;
bool email_verified_ = false;
......
......@@ -346,6 +346,8 @@ class HostProcess : public ConfigWatcher::Delegate,
void GoOffline(const std::string& host_offline_reason);
void OnHostOfflineReasonAck(bool success);
void UpdateConfigRefreshToken(const std::string& token);
#if defined(OS_WIN)
// Initializes the pairing registry on Windows. This should be invoked on the
// network thread.
......@@ -1469,8 +1471,13 @@ void HostProcess::InitializeSignaling() {
std::make_unique<OAuthTokenGetter::OAuthAuthorizationCredentials>(
xmpp_server_config_.username, oauth_refresh_token_,
use_service_account_);
// Unretained is sound because we own the OAuthTokenGetterImpl, and the
// callback will never be invoked once it is destroyed.
oauth_token_getter_ = std::make_unique<OAuthTokenGetterImpl>(
std::move(oauth_credentials), context_->url_loader_factory(), false);
std::move(oauth_credentials),
base::BindRepeating(&HostProcess::UpdateConfigRefreshToken,
base::Unretained(this)),
context_->url_loader_factory(), false);
xmpp_signaling_connector_ = std::make_unique<SignalingConnector>(
xmpp_signal_strategy_, std::move(dns_blackhole_checker),
oauth_token_getter_.get(),
......@@ -1769,6 +1776,13 @@ void HostProcess::OnHostOfflineReasonAck(bool success) {
}
}
void HostProcess::UpdateConfigRefreshToken(const std::string& token) {
#if defined(REMOTING_MULTI_PROCESS)
daemon_channel_->Send(
new ChromotingNetworkDaemonMsg_UpdateConfigRefreshToken(token));
#endif
}
void HostProcess::OnCrash(const std::string& function_name,
const std::string& file_name,
const int& line_number) {
......
......@@ -12,6 +12,7 @@
#import <Security/Security.h>
#import "base/bind.h"
#import "base/bind_helpers.h"
#import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
#import "remoting/ios/facade/ios_client_runtime_delegate.h"
#import "remoting/ios/facade/remoting_service.h"
......@@ -67,6 +68,7 @@ std::unique_ptr<remoting::OAuthTokenGetter> CreateOAuthTokenWithRefreshToken(
std::unique_ptr<remoting::OAuthTokenGetter> oauth_tokenGetter(
new remoting::OAuthTokenGetterImpl(
std::move(oauth_credentials),
base::DoNothing(),
RemotingService.instance.runtime->url_loader_factory(),
/*auto_refresh=*/true));
return oauth_tokenGetter;
......
......@@ -167,7 +167,7 @@ std::unique_ptr<OAuthTokenGetter> TestOAuthTokenGetter::CreateWithRefreshToken(
email, refresh_token, is_service_account);
return std::make_unique<OAuthTokenGetterImpl>(
std::move(oauth_credentials),
std::move(oauth_credentials), base::DoNothing(),
url_loader_factory_owner_->GetURLLoaderFactory(),
/*auto_refresh=*/true);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment