Add customizable settings option for xmpp_endpoint BUG:26525138 Change-Id: I8b198c5d7b29fdc11940443710c64731b1025066 Reviewed-on: https://weave-review.googlesource.com/2487 Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/include/weave/settings.h b/include/weave/settings.h index 741fff2..7cb798d 100644 --- a/include/weave/settings.h +++ b/include/weave/settings.h
@@ -61,6 +61,7 @@ // Optional cloud information. Can be used for testing or debugging. std::string oauth_url; std::string service_url; + std::string xmpp_endpoint; // Cloud ID of the registered device. Empty if device is not registered. std::string cloud_id;
diff --git a/src/config.cc b/src/config.cc index 44d20dd..21a1c1f 100644 --- a/src/config.cc +++ b/src/config.cc
@@ -33,6 +33,7 @@ const char kApiKey[] = "api_key"; const char kOAuthURL[] = "oauth_url"; const char kServiceURL[] = "service_url"; +const char kXmppEndpoint[] = "xmpp_endpoint"; const char kName[] = "name"; const char kDescription[] = "description"; const char kLocation[] = "location"; @@ -51,6 +52,7 @@ const char kWeaveUrl[] = "https://www.googleapis.com/weave/v1/"; const char kDeprecatedUrl[] = "https://www.googleapis.com/clouddevices/v1/"; +const char kXmppEndpoint[] = "talk.google.com:5223"; namespace { @@ -69,6 +71,7 @@ Config::Settings result; result.oauth_url = "https://accounts.google.com/o/oauth2/"; result.service_url = kWeaveUrl; + result.xmpp_endpoint = kXmppEndpoint; result.local_anonymous_access_role = AuthScope::kViewer; result.pairing_modes.insert(PairingType::kPinCode); result.device_id = base::GenerateGUID(); @@ -119,6 +122,7 @@ CHECK(!settings_.api_key.empty()); CHECK(!settings_.oauth_url.empty()); CHECK(!settings_.service_url.empty()); + CHECK(!settings_.xmpp_endpoint.empty()); CHECK(!settings_.oem_name.empty()); CHECK(!settings_.model_name.empty()); CHECK(!settings_.model_id.empty()); @@ -190,6 +194,10 @@ set_service_url(tmp); } + if (dict->GetString(config_keys::kXmppEndpoint, &tmp)) { + set_xmpp_endpoint(tmp); + } + if (dict->GetString(config_keys::kName, &tmp)) set_name(tmp); @@ -249,6 +257,7 @@ dict.SetString(config_keys::kApiKey, settings_.api_key); dict.SetString(config_keys::kOAuthURL, settings_.oauth_url); dict.SetString(config_keys::kServiceURL, settings_.service_url); + dict.SetString(config_keys::kXmppEndpoint, settings_.xmpp_endpoint); dict.SetString(config_keys::kRefreshToken, settings_.refresh_token); dict.SetString(config_keys::kCloudId, settings_.cloud_id); dict.SetString(config_keys::kDeviceId, settings_.device_id);
diff --git a/src/config.h b/src/config.h index 6dc0a07..8e0a8f3 100644 --- a/src/config.h +++ b/src/config.h
@@ -68,6 +68,9 @@ void set_service_url(const std::string& url) { settings_->service_url = url; } + void set_xmpp_endpoint(const std::string& endpoint) { + settings_->xmpp_endpoint = endpoint; + } void set_name(const std::string& name) { settings_->name = name; } void set_description(const std::string& description) { settings_->description = description;
diff --git a/src/config_unittest.cc b/src/config_unittest.cc index 4b0e5b4..bb2743a 100644 --- a/src/config_unittest.cc +++ b/src/config_unittest.cc
@@ -62,6 +62,7 @@ EXPECT_EQ("", GetSettings().api_key); EXPECT_EQ("https://accounts.google.com/o/oauth2/", GetSettings().oauth_url); EXPECT_EQ("https://www.googleapis.com/weave/v1/", GetSettings().service_url); + EXPECT_EQ("talk.google.com:5223", GetSettings().xmpp_endpoint); EXPECT_EQ("", GetSettings().oem_name); EXPECT_EQ("", GetSettings().model_name); EXPECT_EQ("", GetSettings().model_id); @@ -146,7 +147,8 @@ "refresh_token": "state_refresh_token", "robot_account": "state_robot_account", "secret": "c3RhdGVfc2VjcmV0", - "service_url": "state_service_url" + "service_url": "state_service_url", + "xmpp_endpoint": "state_xmpp_endpoint" })"; EXPECT_CALL(config_store_, LoadSettings(kConfigName)).WillOnce(Return(state)); @@ -157,6 +159,7 @@ EXPECT_EQ("state_api_key", GetSettings().api_key); EXPECT_EQ("state_oauth_url", GetSettings().oauth_url); EXPECT_EQ("state_service_url", GetSettings().service_url); + EXPECT_EQ("state_xmpp_endpoint", GetSettings().xmpp_endpoint); EXPECT_EQ(GetDefaultSettings().oem_name, GetSettings().oem_name); EXPECT_EQ(GetDefaultSettings().model_name, GetSettings().model_name); EXPECT_EQ(GetDefaultSettings().model_id, GetSettings().model_id); @@ -200,6 +203,9 @@ change.set_service_url("set_service_url"); EXPECT_EQ("set_service_url", GetSettings().service_url); + change.set_xmpp_endpoint("set_xmpp_endpoint"); + EXPECT_EQ("set_xmpp_endpoint", GetSettings().xmpp_endpoint); + change.set_name("set_name"); EXPECT_EQ("set_name", GetSettings().name); @@ -277,7 +283,8 @@ 'refresh_token': 'set_token', 'robot_account': 'set_account', 'secret': 'AQIDBAU=', - 'service_url': 'set_service_url' + 'service_url': 'set_service_url', + 'xmpp_endpoint': 'set_xmpp_endpoint' })"; EXPECT_JSON_EQ(expected, *test::CreateValue(json)); callback.Run(nullptr);
diff --git a/src/device_registration_info.cc b/src/device_registration_info.cc index 7c20084..0dc1f54 100644 --- a/src/device_registration_info.cc +++ b/src/device_registration_info.cc
@@ -463,8 +463,9 @@ current_notification_channel_ = pull_channel_.get(); notification_channel_starting_ = true; - primary_notification_channel_.reset(new XmppChannel{ - GetSettings().robot_account, access_token_, task_runner_, network_}); + primary_notification_channel_.reset( + new XmppChannel{GetSettings().robot_account, access_token_, + GetSettings().xmpp_endpoint, task_runner_, network_}); primary_notification_channel_->Start(this); } @@ -833,17 +834,25 @@ const std::string& api_key, const std::string& oauth_url, const std::string& service_url, + const std::string& xmpp_endpoint, ErrorPtr* error) { if (HaveRegistrationCredentials()) { return Error::AddTo(error, FROM_HERE, kErrorAlreayRegistered, "Unable to change config for registered device"); } Config::Transaction change{config_}; - change.set_client_id(client_id); - change.set_client_secret(client_secret); - change.set_api_key(api_key); - change.set_oauth_url(oauth_url); - change.set_service_url(service_url); + if (!client_id.empty()) + change.set_client_id(client_id); + if (!client_secret.empty()) + change.set_client_secret(client_secret); + if (!api_key.empty()) + change.set_api_key(api_key); + if (!oauth_url.empty()) + change.set_oauth_url(oauth_url); + if (!service_url.empty()) + change.set_service_url(service_url); + if (!xmpp_endpoint.empty()) + change.set_xmpp_endpoint(xmpp_endpoint); return true; }
diff --git a/src/device_registration_info.h b/src/device_registration_info.h index f670b68..a296258 100644 --- a/src/device_registration_info.h +++ b/src/device_registration_info.h
@@ -78,6 +78,7 @@ const std::string& api_key, const std::string& oauth_url, const std::string& service_url, + const std::string& xmpp_endpoint, ErrorPtr* error); void GetDeviceInfo(const CloudRequestDoneCallback& callback);
diff --git a/src/device_registration_info_unittest.cc b/src/device_registration_info_unittest.cc index 7908c8b..bbc167e 100644 --- a/src/device_registration_info_unittest.cc +++ b/src/device_registration_info_unittest.cc
@@ -44,6 +44,7 @@ namespace test_data { +const char kXmppEndpoint[] = "xmpp.server.com:1234"; const char kServiceURL[] = "http://gcd.server.com/"; const char kOAuthURL[] = "http://oauth.server.com/"; const char kApiKey[] = "GOadRdTf9FERf0k4w6EFOof56fUJ3kFDdFL3d7f"; @@ -144,6 +145,7 @@ settings->model_id = "AAAAA"; settings->oauth_url = test_data::kOAuthURL; settings->service_url = test_data::kServiceURL; + settings->xmpp_endpoint = test_data::kXmppEndpoint; return true; })); config_.reset(new Config{&config_store_});
diff --git a/src/notification/xmpp_channel.cc b/src/notification/xmpp_channel.cc index ceb45ed..f9d7924 100644 --- a/src/notification/xmpp_channel.cc +++ b/src/notification/xmpp_channel.cc
@@ -7,6 +7,7 @@ #include <string> #include <base/bind.h> +#include <base/strings/string_number_conversions.h> #include <weave/provider/network.h> #include <weave/provider/task_runner.h> @@ -16,6 +17,7 @@ #include "src/notification/notification_parser.h" #include "src/notification/xml_node.h" #include "src/privet/openssl_utils.h" +#include "src/string_utils.h" #include "src/utils.h" namespace weave { @@ -74,9 +76,6 @@ false, }; -const char kDefaultXmppHost[] = "talk.google.com"; -const uint16_t kDefaultXmppPort = 5223; - // Used for keeping connection alive. const int kRegularPingIntervalSeconds = 60; const int kRegularPingTimeoutSeconds = 30; @@ -91,10 +90,12 @@ XmppChannel::XmppChannel(const std::string& account, const std::string& access_token, + const std::string& xmpp_endpoint, provider::TaskRunner* task_runner, provider::Network* network) : account_{account}, access_token_{access_token}, + xmpp_endpoint_{xmpp_endpoint}, network_{network}, backoff_entry_{&kDefaultBackoffPolicy}, task_runner_{task_runner}, @@ -285,10 +286,16 @@ void XmppChannel::CreateSslSocket() { CHECK(!stream_); state_ = XmppState::kConnecting; - LOG(INFO) << "Starting XMPP connection to " << kDefaultXmppHost << ":" - << kDefaultXmppPort; + LOG(INFO) << "Starting XMPP connection to: " << xmpp_endpoint_; - network_->OpenSslSocket(kDefaultXmppHost, kDefaultXmppPort, + std::pair<std::string, std::string> host_port = + SplitAtFirst(xmpp_endpoint_, ":", true); + CHECK(!host_port.first.empty()); + CHECK(!host_port.second.empty()); + uint32_t port = 0; + CHECK(base::StringToUint(host_port.second, &port)) << xmpp_endpoint_; + + network_->OpenSslSocket(host_port.first, port, base::Bind(&XmppChannel::OnSslSocketReady, task_ptr_factory_.GetWeakPtr())); }
diff --git a/src/notification/xmpp_channel.h b/src/notification/xmpp_channel.h index 50e84d2..b0a4468 100644 --- a/src/notification/xmpp_channel.h +++ b/src/notification/xmpp_channel.h
@@ -45,6 +45,7 @@ // so you will need to reset the XmppClient every time this happens. XmppChannel(const std::string& account, const std::string& access_token, + const std::string& xmpp_endpoint, provider::TaskRunner* task_runner, provider::Network* network); ~XmppChannel() override = default; @@ -124,12 +125,15 @@ // Robot account name for the device. std::string account_; - // Full JID of this device. - std::string jid_; - // OAuth access token for the account. Expires fairly frequently. std::string access_token_; + // Xmpp endpoint. + std::string xmpp_endpoint_; + + // Full JID of this device. + std::string jid_; + provider::Network* network_{nullptr}; std::unique_ptr<Stream> stream_;
diff --git a/src/notification/xmpp_channel_unittest.cc b/src/notification/xmpp_channel_unittest.cc index 674fe22..dfa2a79 100644 --- a/src/notification/xmpp_channel_unittest.cc +++ b/src/notification/xmpp_channel_unittest.cc
@@ -26,6 +26,7 @@ constexpr char kAccountName[] = "Account@Name"; constexpr char kAccessToken[] = "AccessToken"; +constexpr char kEndpoint[] = "endpoint:456"; constexpr char kStartStreamMessage[] = "<stream:stream to='clouddevices.gserviceaccount.com' " @@ -84,7 +85,8 @@ public: explicit FakeXmppChannel(provider::TaskRunner* task_runner, provider::Network* network) - : XmppChannel{kAccountName, kAccessToken, task_runner, network}, + : XmppChannel{kAccountName, kAccessToken, kEndpoint, task_runner, + network}, stream_{new test::FakeStream{task_runner_}}, fake_stream_{stream_.get()} {} @@ -122,7 +124,7 @@ class XmppChannelTest : public ::testing::Test { protected: XmppChannelTest() { - EXPECT_CALL(network_, OpenSslSocket("talk.google.com", 5223, _)) + EXPECT_CALL(network_, OpenSslSocket("endpoint", 456, _)) .WillOnce( WithArgs<2>(Invoke(&xmpp_client_, &FakeXmppChannel::Connect))); }